iOS有UIWebview和WKWebview兩種webview。從iOS13開始蘋果將UIWebview列為過期API。
2020年4月起App Store將不再接受使用UIWebView的新App上架、2020年12月起將不再接受使用UIWebView的App更新。
從HBuilderX 2.2.5起,iOS上默認(rèn)均已經(jīng)是WKWebview,除非開發(fā)者手動在代碼中指定要用UIWebview,否則實(shí)際渲染的頁面都是在WKWebview里渲染的。
不過,雖然實(shí)際頁面是WKWebview渲染的,但App底層引擎源碼里仍然有UIWebview的可選引用。Appstore的機(jī)審會發(fā)現(xiàn)二進(jìn)制代碼中包括對UIWebview的引用,從而引發(fā)告警。
從HBuilderX 2.6.6起,uiWebview從基礎(chǔ)引擎中移除,變成可選模塊(manifest里選擇)。機(jī)審也沒有提示了。
老HBuilder和HBuilderX 2.2.5之前的版本,App端策略如下:
HBuilderX 2.2.5+版本已將iOS上所有webview的默認(rèn)內(nèi)核由UIWebview調(diào)整為WKWebview。
HBuilderX 2.6.6+版本已將iOS中所有UIWebview代碼從基礎(chǔ)引擎中摘除,獨(dú)立為UIWebview模塊,如繼續(xù)使用UIWebview則需在manifest中勾選使用UIWebview模塊
配置使用UIWebview模塊
打開項(xiàng)目的manifest.json文件,在“App模塊配置”項(xiàng)中勾選“iOS UIWebview”:

配置后需提交云端打包生效
5+App(含wap2app)如何切換iOS默認(rèn)使用UIWebview或WKWebview內(nèi)核?
HBuilderX 2.2.5以前的版本,iOS上webview的默認(rèn)為UIWebview,HBuilderX2.2.5及以后的版本默認(rèn)改為WKWebview。
如果要修改默認(rèn)值,可在manifest.json中配置。
在manifest.json文件源碼視圖中設(shè)置plus -> kernel -> ios 的值為 "WKWebview"或"UIWebview":
"plus": {
"kernel": {
"ios": "UIWebview" //或者 "WKWebview"
},
// ...
}
uni-app 如何配置web-view組件默認(rèn)使用UIWebview或WKWebview內(nèi)核?
HBuilderX 2.2.5以前的版本,iOS上vue頁面中web-view組件或調(diào)用5+ API創(chuàng)建的Webview窗口默認(rèn)為UIWebview,HBuilderX2.2.5及以后的版本默認(rèn)改為WKWebview。
如果要修改默認(rèn)值,可在manifest.json中配置。
在manifest.json文件源碼視圖中設(shè)置 app-plus -> kernel -> ios 的值為 "WKWebview"或"UIWebview":
"app-plus": {
"kernel": {
"ios": "UIWebview" //或者 "WKWebview"
},
// ...
}
nvue頁面中的web-view組件強(qiáng)制使用WKWebview,不可配置
如何使用5+ API(plus.webview.create)創(chuàng)建Webview窗口時(shí)指定使用UIWebview或WKWebview內(nèi)核?
創(chuàng)建Webvie窗口時(shí)可通過kernel屬性指定內(nèi)核,如下:
// 通過kernel屬性指定Webview的內(nèi)核
var w = plus.webview.create('https://xxx.xxx.xxx', 'id', {
'kernel': 'UIWebview' //或者'WKWebview'
});
更多規(guī)范參考5+ API的 WebviewStyles
使用WKWebview的影響
使用WKWebview替換UIWebview將會影響以下功能:
更嚴(yán)格的跨域訪問限制
WKWebview認(rèn)為本地html通過js訪問網(wǎng)絡(luò)及本地文件都算跨域訪問(這種情況UIWebview不是跨域),跨域時(shí)訪問網(wǎng)絡(luò)資源使用5+ API(plus.net)來替換xmlhttp等傳統(tǒng)ajax寫法;ajax也不能訪問本地文件,需使用5+ API(plus.io)讀取本地文件,后者有個單獨(dú)文章可參考:https://ask.dcloud.net.cn/article/36858。
使用exif.js等三方庫可能涉及跨目錄的本地圖片下載請求,圖像方向獲取和旋轉(zhuǎn)Plus有專門的API,無需使用js庫做。
由于WKWebview不支持跨域訪問,標(biāo)準(zhǔn)的xhr或jq的ajax,都無法跨域。mui框架中網(wǎng)絡(luò)請求判斷為跨域訪問會自動調(diào)用5+ API(plus.net),如果在mui.plusReady觸發(fā)前調(diào)用,因?yàn)?+ API沒有準(zhǔn)備好會報(bào)“script error.filename:lineno:0”錯誤,這時(shí)必須保證mui的網(wǎng)絡(luò)請求在mui.plusReady后調(diào)用,或者直接改用plus.net寫法。
WKWebview下canvas也有跨域問題,比如canvas.toDataURL。
如果canvas使用網(wǎng)絡(luò)圖像遇到跨域問題,需要服務(wù)端設(shè)置圖像的響應(yīng)頭:Access-Control-Allow-Origin
如果canvas使用本地圖像遇到跨域問題,可以使用plus接口將圖像轉(zhuǎn)換為base64再使用,相關(guān)插件:https://ext.dcloud.net.cn/plugin?id=123
iOS手機(jī)內(nèi)存不足時(shí),如果是UIWebview的應(yīng)用,系統(tǒng)會整體回收這個App,現(xiàn)象是在重新打開已打開過的App時(shí)App整體重啟。而WKWebview則是單個頁面回收,這帶來的壞處就是內(nèi)存不足時(shí),會單個頁面白屏。詳見https://ask.dcloud.net.cn/article/35913。uni-app不涉及此問題,如果是5+App,方式1是在manifest切回UIWebview,暫時(shí)UIWebview還可以上架,只是會收到警告。方式2時(shí)監(jiān)聽白屏事件,自行恢復(fù)頁面:https://ask.dcloud.net.cn/article/36540
iOS8、9上的WKWebview不支持websql,iOS10恢復(fù)支持
不支持plus.navigator.setCookie
不支持webview的overrideresource方法
wk第一次渲染速度略慢于uiwebview;
由于資源攔截的API overrideresource 無法再使用,5+ APP(含wap2app)項(xiàng)目中,云打包時(shí)的js原生混淆功能會失效。如果要使用js原生混淆必須使用UIWebview。uni-app有單獨(dú)的原生js加密方案,因?yàn)閡ni-app的js不運(yùn)行在webview里,而是在獨(dú)立的jscore里,所以不受影響。
但WKWebview的好處是:節(jié)省內(nèi)存;滾動時(shí)懶加載的圖片也可以實(shí)時(shí)渲染,而uiwebview在滾動停止后懶加載的圖片才能顯示。
如果同時(shí)在一個app里使用ui和wk兩種webview,注意2種webview之間的cookie、localstorage、session不共享,但plus.storage是共享的。
uni-app中Webview的使用注意
uni-app的js運(yùn)行在獨(dú)立的jscore中,而不是Webview中,不存在跨域問題。
uni-app的渲染層,在iOS下是強(qiáng)制wkwebview。如果你編寫了renderjs代碼,在渲染層執(zhí)行js,則同樣會遇到跨域問題。此時(shí)盡量把與跨域相關(guān)的操作放到普通的js邏輯層操作。
除了渲染層,還有一個web-view組件的問題要注意:
uni-app的vue頁面的web-view組件,從HBuilderX 2.2.5+起是WKWebview,之前版本默認(rèn)是UIWebview
uni-app的非自定義組件模式的js邏輯層,在HBuilderX 2.2.5之前是UIWebview。升級到HBuilderX2.3+后可能導(dǎo)致網(wǎng)絡(luò)跨域問題,fail{"statusCode":0,"errMsg":"request:fail abort"}
。不過非自定義組件已于2019年11月1日起停止支持。
如果需要調(diào)整uni-app下web-view組件的渲染內(nèi)核設(shè)置,將manifest.json源碼視圖的app-plus -> kernel -> ios 的值設(shè)為 UIWebview。
uni-app的nvue頁面問題
nvue頁面不使用webview渲染,但其中的web-view組件說明如下。
三方SDK中UIWebview的使用
目前如下SDK中仍然使用了UIWebview,不管是5+App還是uni-app。
DCloud開屏廣告
HBuilderX 2.2.5版之前,點(diǎn)擊廣告打開的內(nèi)置網(wǎng)頁仍然使用UIWebview加載
HBuilderX 2.2.5+版本已調(diào)整改為WKWebview。
支付寶
HBuilderX 2.6.10版本之前,支付寶SDK為15.5.7版本,包含了UIWebview
HBuilderX 2.6.10+版本已更新支付寶SDK為15.7.4,沒有使用UIWebview
微信登錄、分享、支付
HBuilderX 2.6.6+版本已更新微信SDK為1.8.6.2版本,沒有使用UIWebview。
注意微信登錄支付的SDK升級后,會強(qiáng)制要求通用鏈接。另見文檔:https://ask.dcloud.net.cn/article/36445
微博登錄、分享
HBuilderX 2.6.10版本之前,微博SDK為3.2.5版本,包含了UIWebview
HBuilderX 2.6.10+版本已更新微博SDK為3.2.7版本,沒有使用UIWebview
QQ登錄、分享
HBuilderX 2.3.4+版本已更新QQSDK為3.3.6,沒有使用UIWebview。
小米登錄
小米官方SDK中使用了UIWebview,如果提交appstore建議不要使用小米登錄
5+App開發(fā)者建議直接升級為uni-app,一勞永逸,不會有跨域、白屏和無法加密等各種問題。
如果開發(fā)者需要在離線打包工程中使用UIWebview功能,需要在自己的離線工程中配置UIWebview模塊。
注意事項(xiàng)
如果配置正確后,提交Appstore,仍然被提示含有UIWebview,那么請檢查你的app是否使用了其他原生插件。
一般或者是配置錯誤,或者是三方原生插件造成。
該文章在 2023/5/29 16:34:52 編輯過