場景復(fù)現(xiàn):
在Android5.0 以及以上的系統(tǒng),當(dāng)WebView加載的鏈接為Https開頭,但是鏈接里面的內(nèi)容,比如圖片為Http鏈接,這時候,圖片就會加載不出來
原因:
從Android5.0開始,WebView默認(rèn)不支持同時加載Https和Http混合模式。
知識儲備:
從Android5.0以后,當(dāng)一個安全的站點(https)去加載一個非安全的站點(http)時,需要配置Webview加載內(nèi)容的混合模式,一共有如下三種模式:
MIXED_CONTENT_NEVER_ALLOW:
Webview不允許一個安全的站點(https)去加載非安全的站點內(nèi)容(http),比如,https網(wǎng)頁內(nèi)容的圖片是http鏈接。強烈建議App使用這種模式,因為這樣更安全。
MIXED_CONTENT_ALWAYS_ALLOW:
在這種模式下,WebView是可以在一個安全的站點(Https)里加載非安全的站點內(nèi)容(Http),這是WebView最不安全的操作模式,盡可能地不要使用這種模式。
MIXED_CONTENT_COMPATIBILITY_MODE:
在這種模式下,當(dāng)涉及到混合式內(nèi)容時,WebView會嘗試去兼容最新Web瀏覽器的風(fēng)格。一些不安全的內(nèi)容(Http)能被加載到一個安全的站點上(Https),而其他類型的內(nèi)容將會被阻塞。這些內(nèi)容的類型是被允許加載還是被阻塞可能會隨著版本的不同而改變,并沒有明確的定義。這種模式主要用于在App里面不能控制內(nèi)容的渲染,但是又希望在一個安全的環(huán)境下運行。
分析:
在Android5.0以下,默認(rèn)是采用的MIXED_CONTENT_ALWAYS_ALLOW模式,即總是允許WebView同時加載Https和Http;而從Android5.0開始,默認(rèn)用MIXED_CONTENT_NEVER_ALLOW模式,即總是不允許WebView同時加載Https和Http。
雖然官網(wǎng)給出的建議是,為了安全考慮,使用MIXED_CONTENT_NEVER_ALLOW模式,但是在實際引用中,當(dāng)我們的服務(wù)器已經(jīng)升級到Https,但是一些頁面的資源是第三方的,我們不能要求第三方也都升級到Https,所以我們只能根據(jù)系統(tǒng)版本,用代碼去設(shè)置加載模式為MIXED_CONTENT_ALWAYS_ALLOW。
解決方法:
在webview加載頁面之前,設(shè)置加載模式為MIXED_CONTENT_ALWAYS_ALLOW
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {? ? ? webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);? }
備注:
我試著改成MIXED_CONTENT_COMPATIBILITY_MODE模式,也是可以的,但是還不明確其真正含義,為了保險起見,使用了MIXED_CONTENT_ALWAYS_ALLOW模式,有異議的,請不吝賜教。