mPaaS 适配 WKWebView

WKWebView 是苹果在 iOS8 中引入的新一代内置浏览器组件,用于替换陈旧的 UIWebView 组件。该组件最大的特点是支持多进程的渲染方式,包括页面滚动不影响图片资源加载,crash 不影响主进程,内存使用少等。相较于 UIWebView, WKWebView 在性能、稳定性和体验上都有较大提升。经过几年的发展和完善(iOS8, iOS9, iOS10, iOS11, iOS12),目前 WKWebView 已经逐渐处理了在推出初期存在的各类问题,运行情况趋于稳定。

在 iOS12 发布后,苹果 API 开始提示用户逐步废弃 UIWebView 接口。直至 2019 年 08 月,使用了 UIWebView 组件的 App 在提交到 App Store 进行审核时,均会收到以下警告,提醒开发者尽快切换到 WKWebView。

同时苹果在 2019 年 12 月 23 日宣布, App Store 从 2020 年 4 月起不再接受使用 UIWebView 开发的新 App,从 2020 年 12 月起不再接受使用 UIWebview 开发的已有 App 的更新。

针对此情况,mPaaS 对 WKWebView 进行了适配,支持您从 UIWebView 切换到 WKWebView。为了保证 H5 页面从 UIWebView 切换到 WKWebView 后的稳定性,mPaaS 对 WKWebView 的适配过程分为以下 2 个阶段:

  • 第一阶段:自 2019 年 11 月起,mPaaS 基线支持 UIWebView 与 WKWebView 并存,通过灰度能力逐渐切换到 WKWebView。

  • 第二阶段:自 2020 年 03 月起,mPaaS 基线完全删除 UIWebView 相关代码,所有 H5 业务全部切换到 WKWebView。

mPaaS 10.1.60 基线已完成第一阶段的适配工作,请集成 mPaaS H5 容器和小程序组件的用户尽快按以下说明升级到 10.1.60 最新基线(升级基线),并切换到 WKWebView(使用 WKWebView)。

升级基线

根据应用发布情况,请集成 mPaaS H5容器和小程序组件的用户,按以下原则选择对应基线进行升级适配 WKWebView。

  • 2020 年 4 月前已经上架 App Store 的老应用:为保证您已有业务切换到 WKWebView 的稳定性,建议您升级到 10.1.60 基线,以支持该版本线上灰度和回滚能力。升级指南请参考 10.1.60 正式版本升级指南

  • 2020 年 4 月前仍未上架 App Store 的新应用:由于 4 月后 App Store 不再接受带有 UIWebView 的新 App,你必须使用完全删除 UIWebView 相关代码的 10.1.68 版本,同时做好业务回归测试验证。升级指南请参考 mPaaS 10.1.68-beta 升级指南

使用 WKWebView

mPaaS 容器默认使用 UIWebView 加载 H5 页面,框架支持通过 全局开启灰度开启 两种方式开启 WKWebView。

10.1.60 基线

10.1.60 基线下,mPaaS 容器中会同时并存 UIWebView 和 WKWebView,默认使用 UIWebView 加载 H5 页面,您可以按以下方式全局开启 WKWebView 开关,使所有使用 mPaaS 容器加载的页面均采用 WKWebView。

- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
   //...
   // 全局开启 WKWebView 开关
   [MPNebulaAdapterInterface shareInstance].nebulaUseWKArbitrary = YES;
    //...
}

开启 WKWebView 后,您可以查看当前 H5 页面的 UA,若其中包含了 WK 字符串(如下图所示),则说明当前页面已成功切换使用 WKWebView。切换成功

其他说明

全局开启 WKWebView 之后,为保证线上 H5 页面功能的稳定性,mPaaS 框架提供了 线上止血 能力,帮助您快速切换 WKWebView 至 UIWebView。操作方法如下:在实时发布组件中添加 配置开关,在离线包或 URL 维度上限制其使用 UIWebView。

该配置开关的 配置键(key)为 h5_wkArbitrary资源值(value) 如下:

{
  "enable": true,
  "enableSubView": false,
  "exception": [
    {
      "appId": "^(70000000|20000193)$"
    },
    {
      "url": "https://invoice[.]starbucks[.]com[.]cn/"
    },
    {
      "url":"https://front[.]verystar[.]cn/starbucks/alipay-invoice"
    }]
}

value 配置项说明如下表所示。

配置项

说明

备注

enable

是否开启 WKWebView。true 为开启,false 为不开启。

默认为 false

enableSubView

小程序中内嵌 webView 是否开启 WKWebView。true 为开启,false 为不开启。

默认为 false

exception

appId

appId 正则匹配的离线包内的所有 H5 页面不使用 WKWebView。

默认为 nil。此字段仅在 enabletrue 时下生效。

url

url 正则匹配的所有 H5 页面不使用 WKWebView。

10.1.68-beta 基线

10.1.68-beta 版本容器默认使用 WKWebView 加载离线包和小程序,您可以查看当前 H5 页面的 UA。若其中包含了 WK 字符串(如下图所示),则说明当前页面已成功切换使用 WKWebView。切换成功