不安全的 HTTP 连接在 iOS 和 Android 上默认禁用
概述
#如果你的代码试图在 iOS 或 Android 上向主机打开 HTTP 连接,现在将抛出 StateException
异常,并附带以下消息
Insecure HTTP is not allowed by platform: <host>
请使用 HTTPS 代替。
背景
#从 Android API 28 和 iOS 9 开始,这些平台默认禁用不安全的 HTTP 连接。
通过此更改,Flutter 也在移动平台上禁用了不安全连接。其他平台(桌面、web 等)不受影响。
你可以通过遵循特定于平台的指南来定义域特定的网络策略,从而覆盖此行为。详情请参阅下面的迁移指南。
与平台类似,应用程序仍然可以打开不安全的套接字连接。Flutter 不在套接字级别强制执行任何策略;你将负责保护连接。
迁移指南
#在 iOS 上,你可以将 NSExceptionDomains 添加到应用程序的 Info.plist 中。
在 Android 上,你可以添加一个 网络安全配置 XML 文件。为了让 Flutter 找到你的 XML 文件,你还需要在 manifest 中的 <application>
标签中添加一个 metadata
条目。此 metadata 条目应包含名称:io.flutter.network-policy
,并应包含该 XML 的资源标识符。
例如,如果你将 XML 配置放在 res/xml/network_security_config.xml
下,你的 manifest 将包含以下内容
<application ...>
...
<meta-data android:name="io.flutter.network-policy"
android:resource="@xml/network_security_config"/>
</application>
允许调试版本使用明文连接
#如果你想允许 Android 调试版本使用 HTTP 连接,你可以将以下代码段添加到你的 $project_path\android\app\src\debug\AndroidManifest.xml 中
<application android:usesCleartextTraffic="true"/>
对于 iOS,你可以按照这些说明创建一个 Info-debug.plist
并将其放入
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
我们**不**建议你为发布版本执行此操作。
附加信息
#- 构建时配置是更改网络策略的唯一方法。它无法在运行时修改。
- 本地主机连接始终被允许。
- 你只能允许不安全连接到域。不接受特定的 IP 地址作为输入。这与平台支持的功能一致。如果你想允许 IP 地址,唯一的选择是允许你的应用中使用明文连接。
时间线
#在版本 1.23 中引入
稳定版本:2.0.0
在版本 2.2.0 中恢复(提议)
参考资料
#API 文档:此更改没有 API,因为网络策略的修改是通过上面详述的平台特定配置完成的。
相关 PR