問題原因
項(xiàng)目部署服務(wù)器的Https為私有SSL證書,目前確認(rèn)不會(huì)提供共有SSL證書,導(dǎo)致WebView訪問網(wǎng)頁空白問題
官方設(shè)計(jì)WebView插件時(shí),為了考慮安全性在訪問https鏈接時(shí),必須要求SSL證書有效,不支持自定義SSL錯(cuò)誤的處理
解決方式
有三種處理方式:
- 使用flutter_inappwebview插件代替,它能做很多事件,包括管理SSL錯(cuò)誤和SSL客戶端證書請(qǐng)求的事件
- 使用flutter_webview_plugin插件,最新版本支持SSL證書的錯(cuò)誤處理
- 本地修改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)方案
參考文章