瀏覽器兼容性是前端常見問題,經常有人會問:我的代碼在xx瀏覽器上可以用,為什么在HBuilder真機運行或打包的就有問題?
先說iOS。
iOS的webview有uiwebview和wkwebview的區別
從iOS8起,Apple推出了wkwebview,Safari默認使用wkwebview。
由於iOS13將uiwebview列入非公開api,並說明未來會禁止使用uiwebview的應用上架。所以從HBuilderX 2.2.5起,默認使用的是wkwebview,如果要切換為uiwebview,需要在manifest里或創建webview時的參數里指定kernel。
uni-app的app端視圖層固定使用wkwebview。這個和微信小程序的策略一樣,它在iOS上也是只能渲染在wkwebview下。
這兩種webview各有利弊。
wk的問題是:不支持websql(iOS8、9上不支持,iOS10恢復支持)、不支持plus.navigator.setCookie、不支持webview的overrideresource方法、不支持js原生加密、在聯網及本地文件讀取等有各種跨域限制、wk第一次渲染速度略慢於uiwebview;(uni-app的js本來也不運行在webview里,所以無所謂這些限制)
但wkwebview的好處是:節省內存、滾動時懶加載的圖片也可以實時渲染而uiwebview在滾動停止后懶加載的圖片才能顯示(滾動前就加載圖片不受影響)、wkwebview的video播放支持AirPlay(uni-app的video組件是原生的,暫不支持ariplay)。
如果同時在一個app里使用ui和wk兩種webview,注意2種webview之間的cookie、localstorage、session不共享,但plus.storage是共享的。
詳細的wkwebview的使用注意參考:https://ask.dcloud.net.cn/article/36348
Android手機的webview,分系統webview和x5兩種
Android系統webview
系統webview,是默認的webview,及Google的Android system webview,它自帶於手機rom中,所有依賴系統webview的應用都調用這個webview。
在Android4.4以前,webview是Android webkit 瀏覽器內核,很多HTML5標准語法不支持,比如indexeddb、webgl等,canvas性能也非常差。
Android4.4起,變成了chromium內核,內核版本是chrome30,性能和現代語法支持大幅提升。
從Android5開始,webview脫離rom可單獨更新,伴隨着chrome的發版,google會在google play store上同步更新Android system webview。
由於google play store被牆,國內用戶可通過華為應用市場的鏡像下載安裝最新版Android system webview。http://a.vmall.com/app/C10730262
也有個別國產rom改壞了這塊的機制,使得自身的system webview無法獨立安裝升級。
目前國內的Android5以上手機webview版本差異很大,從chrome37一直跨度到60,手機用戶側使用了到底是哪個版本是不一定的。
所以HBuilder的開發者需要注意,盡量不要使用chrome40以后的新增的語法,使用普通常規的寫法完成業務開發。
關於如何查看Android手機端webview的版本:
- 日志里查ua
- 在系統設置里找到所有應用,顯示隱藏系統進程,在里面找到Android system webview,顯示的版本即為chrome版本。
-
Android手機默認瀏覽器和webview的區別
國外品牌的安卓手機,自帶瀏覽器就是chrome。而國內安卓手機,自帶瀏覽器大多是QQ瀏覽器、UC瀏覽器的貼牌,極個別是自己改造chromium。
所以手機自帶的瀏覽器並不等於webview,在一個平台可運行,不代表另一個平台可兼容。
QQ、UC、360等瀏覽器也基本是基於chromium做改造,不同版本的瀏覽器其使用的chromium內核版本也不一樣。具體可以打印ua查看。
注意夜神等安卓模擬器的Android版本是4.4,很多新語法都不支持。 -
如果你有影響用戶的能力,為了給用戶更好的體驗,可以引導Android用戶安裝最新版Android system webview。應用寶、華為、金立等應用市場均可下載這個apk,或者FQ到google play store。
在華為、小米、金立手機上,wifi下會自動更新Android system webview。
尤其是有些Android5用戶使用的Android system webview 37版本,有硬件加速bug,閃屏花屏,此時升級webview即可解決。 -
有人問可否在打包時直接集成新版Android system webview,減少瀏覽器兼容問題?
webview體積至少50M起,體積實在太大了。有興趣的開發者可以自己研究離線打包。
倒是可以這樣:js里判斷當前手機是Android5以上,且webview版本過低,比如低於40(ua可以判斷),可以提醒用戶是否升級webview,然后引導用戶去之前貼出的地址下載更新webview。
但不管怎么樣,盡量少寫可能遇到兼容性問題的代碼。
Android App也可以使用x5 webview
從HBuilderX 2.5.3起,支持使用騰訊的x5內核,詳見文檔https://ask.dcloud.net.cn/article/36806
各小程序平台的webview內核說明
- 各家小程序,在iOS上大多使用的是wkwebview內核,已知僅百度小程序是uiwebview。wkwebview是iOS的一部分,其版本根據iOS版本的不同而不同。可以在caniuse直接看到iOS版本對應的瀏覽器兼容問題。
- Android上各家小程序使用的是基於chromium改造的瀏覽器內核。具體如下:
- 微信:老版微信使用的是x5,ua特征字符串有
Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044903
;后來微信團隊自研了MWEB內核,ua特征字符串有Chrome/67.0.3396.87 XWEB/882 MMWEBSDK/190506
- 百度小程序:ua特征是
Chrome/63.0.3239.83
,並且包含baiduboxapp
字符串 - 支付寶小程序:根據支付寶版本,chrome有57和69等版本,ua特征字符串有
NebulaSDK
- QQ小程序:根據QQ版本,chrome有66和68等版本,ua特征字符串有
QQ/MiniApp
- 頭條小程序:ua特征是
Chrome/62
,ua特征字符串有ToutiaoMicroApp
- 微信:老版微信使用的是x5,ua特征字符串有
uni-app中,js方面不存在瀏覽器兼容問題,因為js都使用的是獨立的js引擎,與webview無關,API也是僅小程序支持的API才可以使用。所以uni-app的瀏覽器兼容性問題,主要是css。注意不要使用太新的css就可以。
如果要查閱真機運行和打包的區別,訪問此文:http://ask.dcloud.net.cn/article/1322