Flutter 平台不允许不安全的http

问题描述 投票:0回答:13

Flutter 团队最近进行了此更改,现在不允许不安全的 http 连接。 https://flutter.dev/docs/release/writing-changes/network-policy-ios-android

我想知道如何将移动设备上的 flutter 应用程序连接到 PC 上运行的本地 go 服务器。

我的服务器正在运行:http://192.168.29.45:4001但它没有连接到它。

android flutter http
13个回答
69
投票

通常需要(并且最好)使用 https 链接而不是 http 链接。但是,这可以被覆盖,如下所示。

安卓

打开 android/app/src/main 文件夹中的 AndroidManifest.xml 文件。然后将

usesCleartextTraffic
设置为
true

<application
    ...
    android:usesCleartextTraffic="true"
    ...   >

请参阅此问题了解更多信息。

iOS

打开 ios/Runner 文件夹中的 Info.plist 文件。然后添加以下键。

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

请参阅此答案了解更多信息。

macOS

这与iOS相同。打开 macos/Runner 文件夹中的 Info.plist 文件。然后添加以下键。

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

11
投票

正如我已经回答过的那样。临时解决您的问题。首先在 res/xml 目录中名为

network_security_config
的文件中添加以下配置(我的完整路径是
/Users/dolphin/source/third-party/Cruise/android/app/src/main/res/xml/network_security_config
):

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后在 AndroidManifest.xml 文件中的

<application
标签内添加以下配置:

android:networkSecurityConfig="@xml/network_security_config"

这可能允许 http 流量。但它只是用于在本地环境或测试环境中进行调试,最好的方法是使用 https 流量。更多信息:如何在 Android (9) Pie 中允许所有网络连接类型 HTTP 和 HTTPS?


8
投票

实现此目的的简单方法是在 AndroidManifest.xml 中使用此属性,这将允许 http 流量:

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

更多信息在这里


6
投票

在 android/app/AndroidManifest 中

<application ...
  android:networkSecurityConfig="@xml/network_security_config" >

 <meta-data android:name="io.flutter.network-policy"
        android:resource="@xml/network_security_config"/>

然后创建一个文件夹xml,里面创建一个文件:network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <base-config cleartextTrafficPermitted="true">
     <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
  </base-config>
 </network-security-config>

6
投票

对我来说最简单的解决方案是将以下行添加到我的 DEBUG 清单文件中,该文件可以在 $project_path ndroid pp\src\debug\AndroidManifest.xml 中找到:

<application android:usesCleartextTraffic="true"/>

重要 - 直到我重新启动模拟器后它才起作用,因此请确保不要跳过此步骤。


6
投票

最简单的方法:

安卓

转到 android/app/src/main/AndroidManifest.xml。打开 AndroidManifest.xml 文件。然后在里面设置 android:usesCleartextTraffic="true"

示例:

    <uses-permission android:name="android.permission.INTERNET" /> //This line add
    <application
        android:name="io.demo.app.test"
        android:label="ProjectName"
        android:usesCleartextTraffic="true" //This line add
        android:icon="@mipmap/ic_launcher">

iOS

进入主词典下的ios/Runner/info.plist,打开info.plist设置这行代码:

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

完成此陡峭后,关闭此应用程序并运行:

  • 扑扑干净
  • flutter 酒吧获取
  • 颤抖奔跑

3
投票

我不知道人们说要更改 app/src/main/AndriodManifest.xml 中的 Android Manifest 文件,而 flutter webiste 上的教程明确指出:

如果您想允许 Android 调试版本使用 HTTP 连接,您可以将以下代码段添加到您的 $project_path ndroid pp\src\ debug\AndroidManifest.xml:

< application android:usesCleartextTraffic="true" />


2
投票

1- 转到此路径:yourProject ndroid pp\src\main es
并创建名为 xml 的文件夹

2 - 打开此路径:yourProject ndroid pp\src\main es\xml 并创建名为 network_security_config.xml 的 xml 文件

3 - 在 network_security_config.xml 文件中写入以下内容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

4-您需要转到此路径:yourProject ndroid pp\src\main\AndroidManifest.xml:

<application
    android:usesCleartextTraffic="true"

    <activity>
         <meta-data android:name="io.flutter.network-policy"
              android:resource="@xml/network_security_config"/>
     </activity>
 </application>

5-停止并重新启动您的应用程序,它将与您一起工作


2
投票

如果您已尝试上述所有解决方案但没有解决问题,您应该关闭模拟器并再次打开它,因为 gradle 中的更改是重要的更改,因此它们需要它。您需要关闭模拟器并再次打开才能看到上述解决方案的结果。


2
投票

将此添加到 android pp\src*debug*\AndroidManifest.xml 文件:

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

不要添加到 android pp\src*MAIN*\AndroidManifest.xml 它们是两个不同的东西。 然后停止并重建应用程序,因为热重启和热重载将不起作用,那么所有错误都会消失。


1
投票

我将flutter HTTP库升级到最新版本 https://pub.dev/packages/http

http: ^0.13.1

然后将 URI 声明更改为 HTTPS 而不是 HTTP

    final http.Response response = await http.post(
        Uri.https('<IP_ADDRESS>', ''),

        headers: <String, String>{
            '<YOUR_HEADERS>',
        },
        body: jsonEncode(<String, Object>{
            '<REQUEST_BODY>',
        }),
    );

这解决了我的问题


0
投票

我正在使用

final String baseUrl='http://......herokuapp.com/';

这个网址给了我这个异常,但后来我做了 httphttps

final String baseUrl='https://......herokuapp.com/';

这是由于某些手机的安全目的

这对我有用,提前谢谢!


0
投票

有人知道这在 Flutter Web 上是否可行吗?

© www.soinside.com 2019 - 2024. All rights reserved.