關(guān)于Flutter的webview無法訪問私有SSL證書鏈接的問題

問題原因

項(xiàng)目部署服務(wù)器的Https為私有SSL證書,目前確認(rèn)不會(huì)提供共有SSL證書,導(dǎo)致WebView訪問網(wǎng)頁空白問題
官方設(shè)計(jì)WebView插件時(shí),為了考慮安全性在訪問https鏈接時(shí),必須要求SSL證書有效,不支持自定義SSL錯(cuò)誤的處理

解決方式

有三種處理方式:

  1. 使用flutter_inappwebview插件代替,它能做很多事件,包括管理SSL錯(cuò)誤和SSL客戶端證書請(qǐng)求的事件
  2. 使用flutter_webview_plugin插件,最新版本支持SSL證書的錯(cuò)誤處理
  3. 本地修改flutter插件原生代碼,兼容ssl證書錯(cuò)誤的處理,代碼如下
目錄:android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
  handler.proceed();
}

修改后的代碼:

import android.net.http.SslError;
import android.webkit.SslErrorHandler;

private WebViewClient internalCreateWebViewClient() {
    return new WebViewClient() {
      @TargetApi(Build.VERSION_CODES.N)
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        return FlutterWebViewClient.this.shouldOverrideUrlLoading(view, request);
      }

      @Override
      public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
        }

      @Override
      public void onPageFinished(WebView view, String url) {
        FlutterWebViewClient.this.onPageFinished(view, url);
      }
    };
  }

決策

考慮到前2個(gè)為非官方插件,且各自有300+issue未解決,最近半年沒有update,存在較大使用風(fēng)險(xiǎn)。而閱讀官方源碼發(fā)現(xiàn),F(xiàn)lutter插件通過調(diào)用原生webview代碼來實(shí)現(xiàn),因此我們只需要在Android的FlutterWebViewClient代碼中新增SSL證書兼容的處理即可,只需調(diào)整插件的引入地址,不用調(diào)整任何代碼。最終決定采用本地修改插件的方式來實(shí)現(xiàn)

實(shí)現(xiàn)

checkout官方源碼,根據(jù)上述代碼修復(fù)SSL兼容問題后,托管到github平臺(tái),修改原插件的引入地址改為:https://github.com/Fitem/webview_flutter.git,解決問題

  # webView使用本地插件,忽略ssl證書
  webview_flutter:
    git:
      url: https://github.com/Fitem/webview_flutter.git

總結(jié)

遇到問題多閱讀源碼、查詢相關(guān)資料,解析問題本質(zhì)。了解熟知市面上常用處理方式,針對(duì)多種方案進(jìn)行分析,列出各方案優(yōu)缺點(diǎn),根據(jù)實(shí)際情況綜合考慮決策,給出最優(yōu)方案

參考文章

  1. SSL error prevents website login in flutter
  2. Is a SSL certificate still needed in a Flutter webview?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容