跳至主要內容

在 iOS 和 Android 上,不安全的 HTTP 連線預設為停用

摘要

#

如果您的程式碼嘗試在 iOS 或 Android 上開啟與主機的 HTTP 連線,則現在會擲回 StateException,並顯示以下訊息

Insecure HTTP is not allowed by platform: <host>

請改用 HTTPS。

背景資訊

#

從 Android API 28iOS 9 開始,這些平台預設會停用不安全的 HTTP 連線。

隨著這項變更,Flutter 也會在行動平台上停用不安全的連線。其他平台(桌面、網頁等)則不受影響。

您可以依照平台專屬的指南來定義特定網域的網路策略,藉此覆寫此行為。詳情請參閱下方的遷移指南。

如同這些平台,應用程式仍然可以開啟不安全的 Socket 連線。Flutter 不會在 Socket 層級強制執行任何策略;您必須自行負責確保連線安全。

遷移指南

#

在 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>

我們不建議您為發佈版本執行此操作。

其他資訊

#
  • 建置時間設定是變更網路策略的唯一方法。它無法在執行時修改。
  • 始終允許連線到 Localhost。
  • 您只能允許連線到特定網域的不安全連線。不接受特定的 IP 位址作為輸入。這與平台支援的內容一致。如果您想要允許 IP 位址,唯一的選擇是在您的應用程式中允許明文連線。

時間軸

#

已在版本中推出:1.23
在穩定版本中:2.0.0
在版本中恢復:2.2.0 (建議)

參考

#

API 文件:此變更沒有 API,因為網路策略的修改是透過上述詳細說明的平台專屬設定來完成的。

相關的 PR