概述

#

如果你的代码试图在 iOS 或 Android 上向主机打开 HTTP 连接,现在将抛出 StateException 异常,并附带以下消息

Insecure HTTP is not allowed by platform: <host>

请使用 HTTPS 代替。

背景

#

从 Android API 28iOS 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 将包含以下内容

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 中

XML
<application android:usesCleartextTraffic="true"/>

对于 iOS,你可以按照这些说明创建一个 Info-debug.plist 并将其放入

XML
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

我们**不**建议你为发布版本执行此操作。

附加信息

#
  • 构建时配置是更改网络策略的唯一方法。它无法在运行时修改。
  • 本地主机连接始终被允许。
  • 你只能允许不安全连接到域。不接受特定的 IP 地址作为输入。这与平台支持的功能一致。如果你想允许 IP 地址,唯一的选择是允许你的应用中使用明文连接。

时间线

#

在版本 1.23 中引入
稳定版本:2.0.0
在版本 2.2.0 中恢复(提议)

参考资料

#

API 文档:此更改没有 API,因为网络策略的修改是通过上面详述的平台特定配置完成的。

相关 PR