iOS有UIWebview和WKWebview兩種webview。從iOS13開始蘋果將UIWebview列為過期API。
2020年4月起App Store將不再接受使用UIWebView的新App上架、2020年12月起將不再接受使用UIWebView的App更新。
從HBuilderX 2.2.5起,iOS上默認均已經(jīng)是WKWebview,除非開發(fā)者手動在代碼中指定要用UIWebview,否則實際渲染的頁面都是在WKWebview里渲染的。
不過,雖然實際頁面是WKWebview渲染的,但App底層引擎源碼里仍然有UIWebview的可選引用。Appstore的機審會發(fā)現(xiàn)二進制代碼中包括對UIWebview的引用,從而引發(fā)告警。
從HBuilderX 2.6.6起,uiWebview從基礎引擎中移除,變成可選模塊(manifest里選擇)。機審也沒有提示了。
老HBuilder和HBuilderX 2.2.5之前的版本,App端策略如下:
HBuilderX 2.2.5+版本已將iOS上所有webview的默認內核由UIWebview調整為WKWebview。
HBuilderX 2.6.6+版本已將iOS中所有UIWebview代碼從基礎引擎中摘除,獨立為UIWebview模塊,如繼續(xù)使用UIWebview則需在manifest中勾選使用UIWebview模塊
配置使用UIWebview模塊
打開項目的manifest.json文件,在“App模塊配置”項中勾選“iOS UIWebview”:
配置后需提交云端打包生效
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創(chuàng)建的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)創(chuàng)建Webview窗口時指定使用UIWebview或WKWebview內核?
創(chuàng)建Webvie窗口時可通過kernel屬性指定內核,如下:
// 通過kernel屬性指定Webview的內核
var w = plus.webview.create('https://xxx.xxx.xxx', 'id', {
'kernel': 'UIWebview' //或者'WKWebview'
});
更多規(guī)范參考5+ API的 WebviewStyles
使用WKWebview的影響
使用WKWebview替換UIWebview將會影響以下功能:
更嚴格的跨域訪問限制
WKWebview認為本地html通過js訪問網(wǎng)絡及本地文件都算跨域訪問(這種情況UIWebview不是跨域),跨域時訪問網(wǎng)絡資源使用5+ API(plus.net)來替換xmlhttp等傳統(tǒng)ajax寫法;ajax也不能訪問本地文件,需使用5+ API(plus.io)讀取本地文件,后者有個單獨文章可參考:https://ask.dcloud.net.cn/article/36858。
使用exif.js等三方庫可能涉及跨目錄的本地圖片下載請求,圖像方向獲取和旋轉Plus有專門的API,無需使用js庫做。
由于WKWebview不支持跨域訪問,標準的xhr或jq的ajax,都無法跨域。mui框架中網(wǎng)絡請求判斷為跨域訪問會自動調用5+ API(plus.net),如果在mui.plusReady觸發(fā)前調用,因為5+ API沒有準備好會報“script error.filename:lineno:0”錯誤,這時必須保證mui的網(wǎng)絡請求在mui.plusReady后調用,或者直接改用plus.net寫法。
WKWebview下canvas也有跨域問題,比如canvas.toDataURL。
如果canvas使用網(wǎng)絡圖像遇到跨域問題,需要服務端設置圖像的響應頭:Access-Control-Allow-Origin
如果canvas使用本地圖像遇到跨域問題,可以使用plus接口將圖像轉換為base64再使用,相關插件:https://ext.dcloud.net.cn/plugin?id=123
iOS手機內存不足時,如果是UIWebview的應用,系統(tǒng)會整體回收這個App,現(xiàn)象是在重新打開已打開過的App時App整體重啟。而WKWebview則是單個頁面回收,這帶來的壞處就是內存不足時,會單個頁面白屏。詳見https://ask.dcloud.net.cn/article/35913。uni-app不涉及此問題,如果是5+App,方式1是在manifest切回UIWebview,暫時UIWebview還可以上架,只是會收到警告。方式2時監(jiān)聽白屏事件,自行恢復頁面: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的好處是:節(jié)省內存;滾動時懶加載的圖片也可以實時渲染,而uiwebview在滾動停止后懶加載的圖片才能顯示。
如果同時在一個app里使用ui和wk兩種webview,注意2種webview之間的cookie、localstorage、session不共享,但plus.storage是共享的。
uni-app中Webview的使用注意
uni-app的js運行在獨立的jscore中,而不是Webview中,不存在跨域問題。
uni-app的渲染層,在iOS下是強制wkwebview。如果你編寫了renderjs代碼,在渲染層執(zhí)行js,則同樣會遇到跨域問題。此時盡量把與跨域相關的操作放到普通的js邏輯層操作。
除了渲染層,還有一個web-view組件的問題要注意:
uni-app的vue頁面的web-view組件,從HBuilderX 2.2.5+起是WKWebview,之前版本默認是UIWebview
uni-app的非自定義組件模式的js邏輯層,在HBuilderX 2.2.5之前是UIWebview。升級到HBuilderX2.3+后可能導致網(wǎng)絡跨域問題,fail{"statusCode":0,"errMsg":"request:fail abort"}
。不過非自定義組件已于2019年11月1日起停止支持。
如果需要調整uni-app下web-view組件的渲染內核設置,將manifest.json源碼視圖的app-plus -> kernel -> ios 的值設為 UIWebview。
uni-app的nvue頁面問題
nvue頁面不使用webview渲染,但其中的web-view組件說明如下。
三方SDK中UIWebview的使用
目前如下SDK中仍然使用了UIWebview,不管是5+App還是uni-app。
DCloud開屏廣告
HBuilderX 2.2.5版之前,點擊廣告打開的內置網(wǎng)頁仍然使用UIWebview加載
HBuilderX 2.2.5+版本已調整改為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升級后,會強制要求通用鏈接。另見文檔: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模塊。
注意事項
如果配置正確后,提交Appstore,仍然被提示含有UIWebview,那么請檢查你的app是否使用了其他原生插件。
一般或者是配置錯誤,或者是三方原生插件造成。
該文章在 2023/5/29 16:34:52 編輯過