1. 程式人生 > >Android升級到7.0使得webview載入頁面為空白頁

Android升級到7.0使得webview載入頁面為空白頁

        前段時間,公司一哥們把他的手機拿給我看,問到公司的軟體載入進去是空白頁,等了好久也是空白。我也為是網路出現了問題,排查沒問題啊。看看是不是快取問題,又是清快取,又是解除安裝重灌。結果還是空白頁面。想了一下是不是系統問題,問他有沒有更新過系統。結果真的是,他剛更新了android7.0系統之後就出現了載入wenview是空白頁的問題。

      仔細檢視資料,貌似android7.0對webview好像沒什麼限制問題。只是可能會有區域性Api會改變。所以,我就一處處排查,列印各種error日誌。最後發現,公司的資料都是用https去請求資料。那會不會是系統因為安全性問題,進行了部分限制?因為,之前知道,當我們https請求資料,系統日期不對,證書有問題,也會導致請求不成功。

      所以,針對性的查看了webview關於SSL相關的Api。所以找到了這個方法

     這是一個SSL失敗時,都會回撥的一個方法,所以,我就在這裡列印了日誌

  Log.d("onReceivedSslError: ",""+error.getPrimaryError());
  日誌結果是:onReceivedSslError: 3,所以我就找到問題了,就是Ssl關於證書的錯誤。但是,這個3啥意思啊?
  當時,我一直不知道這個3是什麼意思,所以查看了關於SslError的原始碼,發現它原來已經定義了幾種錯誤,分別是:
       發現既有日期不對,又有對證書的不信任,所以也就知道這個3是什麼了。SSL_UNTAUSTED,就是對證書丟失,接下來就要去處理它了。網上也有一種最暴力的做法,如果回撥到這個public void onReceivedSslError(WebView view, android.webkit.SslErrorHandler handler, android.net.http.SslError error) {  },就通過SslErrorHandler.process放過它,就是忽略它。雖然,這個方法簡單粗暴,但是卻忽略了SSL的作用,因為我們都不進行校驗,很容易導致資料被竊取,資料不安全啊。所以我並不想這麼做。

      我的做法就是全部去判斷

  if(error.getPrimaryError() ==  SslError.SSL_DATE_INVALID  
          || error.getPrimaryError() == SslError.SSL_EXPIRED 
          || error.getPrimaryError() == SslError.SSL_INVALID 
          || error.getPrimaryError() == SslError.SSL_UNTRUSTED) { 

          handler.proceed();  

  }else{
      handler.cancel();
}
  前兩個是代表日期問題,第三個是webview的bug,最後一個是證書丟失,如果有這些問題,將忽略它,而不是什麼情況都跳過SSL這一層,這樣真的很不友好。所以
問題也就解決了。