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。 | 默认为 | |
enableSubView | 小程序中内嵌 webView 是否开启 WKWebView。 | 默认为 | |
exception | appId | appId 正则匹配的离线包内的所有 H5 页面不使用 WKWebView。 | 默认为 |
url | url 正则匹配的所有 H5 页面不使用 WKWebView。 |
10.1.68-beta 基线
10.1.68-beta 版本容器默认使用 WKWebView 加载离线包和小程序,您可以查看当前 H5 页面的 UA。若其中包含了 WK
字符串(如下图所示),则说明当前页面已成功切换使用 WKWebView。