關於 Webview 的混合模式(華為 P30 出現問題)

aaronzzx發表於2019-04-22

前言:

從 Android 5.0 開始,Webview 預設不支援同時載入 Https 和 Http 混合模式,加上這段程式碼主動開啟混合模式(但並不是萬能的):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    webSetting.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}
複製程式碼

Webview 的 3 種模式:

  1. MIXED_CONTENT_NEVER_ALLOW:Webview 不允許一個安全的站點(Https)去載入非安全的站點內容(Http), 比如 Https 網頁內容的圖片是 Http 連結。強烈建議 App 使用這種模式,因為這樣更安全。
  1. MIXED_CONTENT_ALWAYS_ALLOW:在這種模式下,Webview 是可以在一個安全的站點(Https)里載入非安全的站點內容(Http), 這是 Webview 最不安全的操作模式,儘可能地不要使用這種模式。
  1. MIXED_CONTENT_COMPATIBILITY_MODE:在這種模式下,當涉及到混合式內容時,Webview 會嘗試去相容最新 Web 瀏覽器的風格。 一些不安全的內容(Http)能被載入到一個安全的站點上(Https),而其他型別的內容將會被阻塞。 這些內容的型別是被允許載入還是被阻塞可能會隨著版本的不同而改變,並沒有明確的定義。 這種模式主要用於在 App 裡面不能控制內容的渲染,但是又希望在一個安全的環境下執行。

後記:

  1. 第三種模式極少會用到,因為它是真的不安全了,而第二種方式,在某種意義上來說,它其實還是安全的。 後來貌似是遇到了 Https 的網頁,載入了 Http 的 JS 檔案,導致不得不用到第三種方式。
  1. 另外:即使開啟了MIXED_CONTENT_ALWAYS_ALLOW或者MIXED_CONTENT_COMPATIBILITY_MODE,部分情況下還是會出問題, 目前最新情況出現在華為 P30(Android 9.0) 上,即使開啟了混合模式,Https 載入 Http 資源(如圖片),還是會出現圖片載入不出來,並回撥 WebviewClient 的 onReceivedError() ,所以如果有根據此方法回撥而設定錯誤佔點陣圖的話,即使 Webview 介面載入出來了也還是會回撥 onReceivedError() ,所以這種情況只能讓後臺去修改 Http 為 Https 了,混合模式並不是萬能的,至少在華為 P30 的 Android 9.0 上行不通。
  2. 備註:在 X5 核心的 Webview 中,是找不到MIXED_CONTENT_ALWAYS_ALLOW這些引數的,只能手動把值設上去: MIXED_CONTENT_NEVER_ALLOW = 0; MIXED_CONTENT_ALWAYS_ALLOW = 1; MIXED_CONTENT_COMPATIBILITY_MODE = 2;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    webSetting.setMixedContentMode(2);
}
複製程式碼

相關文章