iOS 和 Android 默认禁用不安全的 HTTP 连接
概述
#如果您的代码尝试在 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 文件,您还需要在清单文件中的 <application>
标签中添加一个 metadata
条目。此元数据条目应包含名称:io.flutter.network-policy
,并包含 XML 的资源标识符。
例如,如果您将 XML 配置放在 res/xml/network_security_config.xml
下,您的清单文件将包含以下内容:
<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