解决两个问题:
1、webview访问http页面
2、webview忽略一些异常的ssl
如果我们的 URL 是 HTTP 而不是 HTTPS 的话,那么就只可以在 Android 9.0 以下的设备运行(iOS同样不可以)。
如果运行在 iOS 上会出现白屏,如果运行在 Android 9.0+ 的设备上就会出现 net::ERRCLEARTEXTNOT_PERMITTED 的错误。
其实原因很简单,因为无论是 iOS 还是 Android 9.0+ 都对非 HTTPS 的请求做了一些限制,并且对https安全性做了严格要求,比如一些私有ssl证书,或者廉价的证书,就可以出现认证失败(比如打开ssl页面空白,debug日志提示错误handshake failed; returned -1, SSL error code 1)
下面给出我的解决方案。
iOS
我们需要在 IOS 模块的 Runner 中的 info.plist 文件中添加如下字段:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
image.png
然后执行 flutter clean 后重新运行即可访问 HTTP 网页了。
Android
1、清单文件AndroidManifest.xml的application标签里面设置networkSecurityConfig
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
<!-- ... -->
<!-- ... -->
</application>
</manifest>
2、在资源文件夹res/xml下面创建network_security_config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
image.png
然后执行 flutter clean 后重新运行即可访问 HTTP 网页了。