[轉] 關於手機webview內核、默認瀏覽器、各家小程序的渲染層瀏覽器的區別和兼容性


瀏覽器兼容性是前端常見問題,經常有人會問:我的代碼在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的版本:

  1. 日志里查ua
  2. 在系統設置里找到所有應用,顯示隱藏系統進程,在里面找到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

uni-app中,js方面不存在瀏覽器兼容問題,因為js都使用的是獨立的js引擎,與webview無關,API也是僅小程序支持的API才可以使用。所以uni-app的瀏覽器兼容性問題,主要是css。注意不要使用太新的css就可以。

如果要查閱真機運行和打包的區別,訪問此文:http://ask.dcloud.net.cn/article/1322


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM