Android WebView打開網頁一片空白

本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點瀏覽器

問題描述:

  • 網頁連接是Https連接
  • 網頁連接在電腦的Chrome瀏覽器中打開正常
  • 網頁連接在手機的Chrome瀏覽器中打開正常
  • 網頁連接在IOS的App上打開正常
  • 網頁連接在Android App中打開一片空白,沒有任何提示

問題緣由

試了不少方法,最後發現是Https的證書有問題,因爲網頁連接是客戶提供的,不知道證書是如何生成的,致使不被Android系統信任bash

問題的發現之旅

網頁連接在手機和電腦都能打開,因此想着網頁連接自己應該沒有問題。微信

debug網頁加載的過程也沒有發現問題ide

可是後來用UC瀏覽器打開之後發現加載的過程當中會彈出提示:this

出錯的提示

根據彈出的提示知道極可能是證書的問題,因而從新開始debug項目中的WebViewspa

通常咱們在初始化一個WebView時都有幾個固定的步驟,其中最重要的一步就是設置WebViewClientdebug

enWebview.setWebChromeClient(new WebChromeClient());
enWebview.setWebViewClient(new WebViewClient());
複製代碼

若是WebView加載由於證書的問題失敗,就會回調WebViewClient的一個接口:code

@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, SslError error) {
}
複製代碼

WebViewClient默認會終止加載cdn

public class WebViewClient {

    public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {
       //終止加載     
        handler.cancel();
    }
    ...
}
複製代碼

這個handler是一個SslErrorHandler接口blog

public class SslErrorHandler extends Handler {

    /**
     * @hide Only for use by WebViewProvider implementations.
     */
    @SystemApi
    public SslErrorHandler() {}

    /**
     * Proceed with the SSL certificate.
     */
    public void proceed() {}

    /**
     * Cancel this request and all pending requests for the WebView that had
     * the error.
     */
    public void cancel() {}
}
複製代碼

經過上面的註釋咱們能夠知道,調用proceed就是繼續利用當前證書加載,而cancel就是終止本次的全部請求。而上面WebViewClient顯然默認是終止全部請求了。

經過debug發現,WebViewClient在調用了上面的SslErrorHandlercancel方法之後,就立刻會回調onPageFinished方法,不會回調onReceivedError,因此也就不會展現自定義的加載錯誤頁面,結果就是一片空白了。

緣由找到了,那怎麼解決呢?

其實答案也已經在上面給出了。咱們直接覆寫WebViewClientonReceivedSslError方法,而後根據須要作些處理。好比彈出提示框告訴用戶當前證書有問題,是否繼續加載等。

public class MyWebViewClient {

    public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {
       //彈出提示框,讓用戶決定是否繼續加載
       //1.用戶選擇繼續加載
      // handler.proceed();
       //2.用戶取消
       //handler.cancel()
    }
    ...
}
複製代碼

總結

這個問題困擾了好久,剛剛開始想到多是WebView兼容問題,由於印象裏WebView有不少坑。可是同一個客戶提供的另外一個Https的連接是正常的,並且以前沒有出現過這種狀況,因而debug進去發現網頁連接正常傳入了就沒多想,就認爲是沒問題了。仍是"too young, too simple"啊!

並且對WebViewClientonReceivedSslError也不熟悉,沒有想到這一層。現現在基本上全部的網頁連接都是Https的了,咱們之後在開發過程當中仍是要注意這個問題,在onReceivedSslError中提早作好處理。


歡迎關注個人微信公衆號,和我一塊兒天天進步一點點!
複製代碼

AntDream
相關文章
相關標籤/搜索