分类
Coder Life

Flutter 使用Webview如何应对Android9以上使用http报错的问题

背景

在最近的 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

没毛病,我最后也是通过这个解决的,但是有一些细节说的不够清楚。所以我把详细步骤整理如下:

  1. 终止当前调试的 Flutter 及原生 安卓 进程;
  2. 找到 android/app/src/main/AndroidManifest.xml 文件
  3. 在 Application 标签中添加 android:usesCleartextTraffic =“ true”(详细位置如下)
  4. 在终端中运行 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

欢迎访问我的博客 乱世之牙,最近也一直在维护着 Nim中文社区 ,希望大家可以多捧场~

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据