DCloud_App_Array
DCloud_App_Array
  • 发布:2019-09-02 21:04
  • 更新:2020-02-03 17:56
  • 阅读:23672

Appstore审核反馈废弃UIWebview APIs问题的说明

分类:HTML5+

iOS有UIWebview和WKWebview两种webview。从iOS13开始苹果将UIWebview列为过期API。

目前提交苹果应用市场(AppStore)会反馈以下邮件提示:

ITMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs .  
See https://developer.apple.com/documentation/uikit/uiwebview for more information.

以上信息是苹果告诉开发者未来将会停止使用UIWebview的应用上线,暂时还没有准确的停止时间(预计至少会留一段过渡时间)。目前还可以继续使用并提交AppStore。
我们会随时了解苹果应用市场的审核政策,及时更新,确保符合应用市场的审核要求

HBuilder、HBuilderX 2.2.5之前,项目按以下规则使用:

  • 5+ APP(含wap2app)
    默认为UIWebview。
  • uni-app
    vue页面中web-view组件默认使用UIWebview,nvue页面中web-view组件使用WKWebview。

HBuilderX 2.2.5+版本已将iOS上所有webview的默认内核由UIWebview调整为WKWebview。

5+App(含wap2app)如何切换iOS默认使用UIWebview或WKWebview内核?

HBuilderX 2.2.5以前的版本,iOS上webview的默认为UIWebview,HBuilderX2.2.5及以后的版本默认改为WKWebview。
如果要修改默认值,可在manifest.json中配置。
在manifest.json文件源码视图中设置plus -> kernel -> ios 的值为 "WKWebview"或"UIWebview":

    "plus": {  
        "kernel": {  
            "ios": "UIWebview"    //或者 "WKWebview"  
        },  
        // ...  
    }

uni-app 如何配置web-view组件默认使用UIWebview或WKWebview内核?

HBuilderX 2.2.5以前的版本,iOS上vue页面中web-view组件或调用5+ API创建的Webview窗口默认为UIWebview,HBuilderX2.2.5及以后的版本默认改为WKWebview。
如果要修改默认值,可在manifest.json中配置。
在manifest.json文件源码视图中设置 app-plus -> kernel -> ios 的值为 "WKWebview"或"UIWebview":

    "app-plus": {  
        "kernel": {  
            "ios": "UIWebview"    //或者 "WKWebview"  
        },  
        // ...  
    }

nvue页面中的web-view组件强制使用WKWebview,不可配置

如何使用5+ API(plus.webview.create)创建Webview窗口时指定使用UIWebview或WKWebview内核?

创建Webvie窗口时可通过kernel属性指定内核,如下:

// 通过kernel属性指定Webview的内核  
var w = plus.webview.create('https://xxx.xxx.xxx', 'id', {  
    'kernel': 'UIWebview'       //或者'WKWebview'  
});

更多规范参考5+ API的 WebviewStyles

使用WKWebview的影响

使用WKWebview替换UIWebview将会影响以下功能:

  • 更严格的跨域访问限制
    WKWebview认为本地html调用ajax访问网络及本地不同目录文件都算跨域访问(这种情况UIWebview不是跨域),所以WKWebview调用ajax跨域访问会失败,这时只能使用5+ API(plus.net)替换。
    使用exif.js等三方库可能涉及跨目录的本地图片下载请求,图像方向获取和旋转Plus有专门的API,无需使用js库做。
  • 由于WKWebview不支持跨域访问,标准的xhr或jq的ajax,都无法跨域。mui框架中网络请求判断为跨域访问会自动调用5+ API(plus.net),如果在mui.plusReady触发前调用,因为5+ API没有准备好会报“Script error.filename:lineno:0”错误,这时必须保证mui的网络请求在mui.plusReady后调用。
  • WKWebview下canvas也有跨域问题,比如canvas.toDataURL。
    如果canvas使用网络图像遇到跨域问题,需要服务端设置图像的响应头:Access-Control-Allow-Origin
    如果canvas使用本地图像遇到跨域问题,可以使用plus接口将图像转换为base64再使用,相关插件:https://ext.dcloud.net.cn/plugin?id=123
  • iOS手机内存不足时,如果是UIWebview的应用,系统会整体回收这个App,现象是在重新打开已打开过的App时App整体重启。而WKWebview则是单个页面回收,这带来的坏处就是内存不足时,会单个页面白屏。详见https://ask.dcloud.net.cn/article/35913。uni-app不涉及此问题,如果是5+App,方式1是在manifest切回UIWebview,暂时UIWebview还可以上架,只是会收到警告。方式2时监听白屏事件,自行恢复页面:https://ask.dcloud.net.cn/article/36540
  • iOS8、9上的WKWebview不支持websql,iOS10恢复支持
  • 不支持plus.navigator.setCookie
  • 不支持webview的overrideresource方法
  • wk第一次渲染速度略慢于uiwebview;
  • 由于资源拦截的API overrideresource 无法再使用,5+ APP(含wap2app)项目中,云打包时的js原生混淆功能会失效。如果要使用js原生混淆必须使用UIWebview。uni-app有单独的原生js加密方案,因为uni-app的js不运行在webview里,而是在独立的jscore里,所以不受影响。

但WKWebview的好处是:节省内存;滚动时懒加载的图片也可以实时渲染,而uiwebview在滚动停止后懒加载的图片才能显示。

如果同时在一个app里使用ui和wk两种webview,注意2种webview之间的cookie、localstorage、session不共享,但plus.storage是共享的。

uni-app中Webview的使用注意

uni-app的渲染层页面是强制wkwebview。但除了渲染层,其他地方需要注意:

  • uni-app的vue页面的web-view组件,从HBuilderX 2.2.5+起是WKWebview,之前版本默认是UIWebview
  • uni-app的非自定义组件模式的js逻辑层,在HBuilderX 2.2.5之前是UIWebview。升级到HBuilderX2.3+后可能导致网络跨域问题,fail{"statusCode":0,"errMsg":"request:fail abort"}。不过非自定义组件将于2019年11月1日起停止支持,直接升级自定义组件模式吧。

如果需要调整uni-app下web-view组件的渲染内核设置,将manifest.json源码视图的app-plus -> kernel -> ios 的值设为 UIWebview。

nvue页面

nvue页面不使用webview渲染,但其中的web-view组件说明如下。

  • nvue的weex 组件模式
    weex模式下的web-view组件是weex自己实现的,它目前仍然使用UIWebview。官方会追踪weex的升级。
  • nvue的uni-app组件模式
    web-view组件使用WKWebview

三方SDK中UIWebview的使用

目前如下SDK中仍然使用了UIWebview,不管是5+App还是uni-app。

  • DCloud开屏广告
    HBuilderX 2.2.5版之前,点击广告打开的内置网页仍然使用UIWebview加载。HBuilderX2.2.5版本起已调整改为WKWebview。
  • 微信登录
  • 微博登录
  • QQ登录
    HBuilderX 2.3.4版之前,这些SDK仍然使用了UIWebview,2.3.4版起更新了这些sdk的最新版,它们已经改为了WKWebview。
    注意微信登录支付的SDK升级后,会强制要求通用链接。另见文档:https://ask.dcloud.net.cn/article/36445

目前UIWebview开发的应用仍然可以上架,如果来不及兼容WKWebview,也可以先切回UIWebview。但迟早要处理这个事情。5+App开发者建议直接升级为uni-app,一劳永逸,不会有白屏和无法加密等各种问题。

最后,开发者虽然在应用层可避免使用UIwebview,但DCloud的App引擎底层仍然留有UIWebview的调用选项代码,所以Appstore机审时可能仍然会提示ipa包中包含UIWebview,这种情况不用理会,实际上没有使用。

6 关注 分享
1002919580@qq.com 377313813@qq.com 764377746@qq.com 我爱北京天安门 1374845793@qq.com 309834585@qq.com

要回复文章请先登录注册

DCloud_App_Array

DCloud_App_Array (作者)

回复 码农石头:
5+ SDK中默认还包含UIWebview相关的代码,目前此警告不影响提交appstore审核
2020-02-03 17:56
码农石头

码农石头

系统:MacOS Catalina
开发工具版本:HBuilderX-2.5.1.20200103
模式:V3
创建的uni-app项目
模块就使用了Payment,Share,OAuth,Statistic,Push。
pages里的vue页面没有用到web-view控件,用到了rich-text。

还是提交到苹果审核后,因为UIWebView Deprecated API Usage的原因被拒。

还有其它什么原因导制打包后还是有使用UIWebView?
2020-02-02 16:18
luckgo@21cn.com

luckgo@21cn.com

大神们指点一下,ajax如何请求本地html文件(即file://开头的文件),history.pushState无法用,有没有下面类似的方法:
wkWebView.configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")
2020-01-19 22:21
luckgo@21cn.com

luckgo@21cn.com

回复 luckgo@21cn.com:
wkWebView.configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")
2020-01-19 22:21
luckgo@21cn.com

luckgo@21cn.com

大神们指点一下,ajax如何请求本地html文件(即file://开头的文件),history.pushState无法用,有没有下面类似的方法:
2020-01-19 22:17
913152320@qq.com

913152320@qq.com

Script error.filename:lineno:0 我没有用mui 也没又用web-view但是运行到手机就会报这个错误是为什么呢?
2020-01-15 16:51
哈撒呦

哈撒呦

我的项目是本地打包的形式,我在manifest.json里配置了plus=>kernel=>ios:WKWebview,但是本地html用XHR请求远程服务器成功了(看文档说WKWebview本地html调用ajax访问网络及本地不同目录文件都算跨域访问,会失败),说明全局切换WKWebview失败了,那应该怎么做才能全局切换WKWebview成功讷???
2020-01-14 11:46
xiazhiweizhi

xiazhiweizhi

现在我们的问题也是无法复现这个问题,上周发布的app, ios模拟器(各个版本都试过),测试机上运行没问题,我们的测试机是iphone8跟 8Plus ios 版本是13.3,但是在用户使用过程中反馈有几个ios版本为13.3的手机打开app会白屏(11pro ios13.3 iphonexs ios版本不确定)
2020-01-13 16:43
DCloud_IOS_CLP

DCloud_IOS_CLP

回复 xiazhiweizhi:
? 把问题描述准确,什么部分?具体哪部分。 提供可以确定能复现的demo示例。
2020-01-13 15:46
xiazhiweizhi

xiazhiweizhi

回复 DCloud_IOS_CLP:
我们上周发布的app也出现了部分ios13.3的手机无法登陆打开白屏的现象
2020-01-13 15:29