本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點瀏覽器
試了不少方法,最後發現是Https的證書有問題,因爲網頁連接是客戶提供的,不知道證書是如何生成的,致使不被Android系統信任bash
網頁連接在手機和電腦都能打開,因此想着網頁連接自己應該沒有問題。微信
debug網頁加載的過程也沒有發現問題ide
可是後來用UC瀏覽器打開之後發現加載的過程當中會彈出提示:this
根據彈出的提示知道極可能是證書的問題,因而從新開始debug項目中的WebViewspa
通常咱們在初始化一個WebView
時都有幾個固定的步驟,其中最重要的一步就是設置WebViewClient
debug
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
在調用了上面的SslErrorHandler
的cancel
方法之後,就立刻會回調onPageFinished
方法,不會回調onReceivedError
,因此也就不會展現自定義的加載錯誤頁面,結果就是一片空白了。
緣由找到了,那怎麼解決呢?
其實答案也已經在上面給出了。咱們直接覆寫WebViewClient
的onReceivedSslError
方法,而後根據須要作些處理。好比彈出提示框告訴用戶當前證書有問題,是否繼續加載等。
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"啊!
並且對WebViewClient
的onReceivedSslError
也不熟悉,沒有想到這一層。現現在基本上全部的網頁連接都是Https
的了,咱們之後在開發過程當中仍是要注意這個問題,在onReceivedSslError
中提早作好處理。
歡迎關注個人微信公衆號,和我一塊兒天天進步一點點!
複製代碼