背景
在最近的 Flutter 开发中使用了WebView请求http协议的页面,遇到了这个问题:
net :: ERR_CLEARTEXT_NOT_PERMITTED
网上说是因为安卓9以上,官方禁用了使用80端口的 http 请求页面,所有的请求必须发生在https协议(443)端口下。
谷歌会这么做并不奇怪,早在一两年前,由于中间人攻击的泛滥,各大浏览器厂商及Web行业执牛耳者已经在推行更安全的HTTPS协议了,谷歌更是把之前“https显示绿锁”的策略在一次Chrome更新后改为了“http显示不安全”。
推荐方案
所以对于我们遇到的这个问题,更推荐的方案是使用https协议替换和升级原有网站。推荐一下我之前自己写的 这篇文章
但我们常说,路不止有一条。
本文尝试研究的场景,就是无法更新网站协议的情况,如政府/高校等内网环境、请求第三方页面等。
绕过 Flutter 及原生 安卓 WebView 的 HTTPS 验证
国内国外搜了一圈,大家都是同一种解决办法:
在 AndroidManifest 文件中将 usesCleartextTraffic 属性设置为 true
没毛病,我最后也是通过这个解决的,但是有一些细节说的不够清楚。所以我把详细步骤整理如下:
- 终止当前调试的 Flutter 及原生 安卓 进程;
- 找到 android/app/src/main/AndroidManifest.xml 文件
- 在 Application 标签中添加 android:usesCleartextTraffic =“ true”(详细位置如下)
- 在终端中运行
flutter clean
,并在成功后启动项目
<manifest xmlns:android=……>
<uses-permission android:name=……/>
<application
android:name="xxxxxxx"
android:label="xxx"
android:icon="xxxxxxx"
android:usesCleartextTraffic="true"
……>
<activity
android:name="xxx"
……
总结
上述步骤的重点有两个:
- 一个是第三步中,添加的位置
- 另一个是在改完之后要运行
flutter clean