Flutter 团队最近进行了此更改,现在不允许不安全的 http 连接。 https://flutter.dev/docs/release/writing-changes/network-policy-ios-android
我想知道如何将移动设备上的 flutter 应用程序连接到 PC 上运行的本地 go 服务器。
我的服务器正在运行:http://192.168.29.45:4001但它没有连接到它。
通常需要(并且最好)使用 https 链接而不是 http 链接。但是,这可以被覆盖,如下所示。
打开 android/app/src/main 文件夹中的 AndroidManifest.xml 文件。然后将
usesCleartextTraffic
设置为 true
。
<application
...
android:usesCleartextTraffic="true"
... >
请参阅此问题了解更多信息。
打开 ios/Runner 文件夹中的 Info.plist 文件。然后添加以下键。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
请参阅此答案了解更多信息。
这与iOS相同。打开 macos/Runner 文件夹中的 Info.plist 文件。然后添加以下键。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
正如我已经回答过的那样。临时解决您的问题。首先在 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?
实现此目的的简单方法是在 AndroidManifest.xml 中使用此属性,这将允许 http 流量:
<application android:usesCleartextTraffic="true">
</application>
在 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>
对我来说最简单的解决方案是将以下行添加到我的 DEBUG 清单文件中,该文件可以在 $project_path ndroid pp\src\debug\AndroidManifest.xml 中找到:
<application android:usesCleartextTraffic="true"/>
重要 - 直到我重新启动模拟器后它才起作用,因此请确保不要跳过此步骤。
最简单的方法:
安卓
转到 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>
完成此陡峭后,关闭此应用程序并运行:
我不知道人们说要更改 app/src/main/AndriodManifest.xml 中的 Android Manifest 文件,而 flutter webiste 上的教程明确指出:
如果您想允许 Android 调试版本使用 HTTP 连接,您可以将以下代码段添加到您的 $project_path ndroid pp\src\ debug\AndroidManifest.xml:
< application android:usesCleartextTraffic="true" />
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-停止并重新启动您的应用程序,它将与您一起工作
如果您已尝试上述所有解决方案但没有解决问题,您应该关闭模拟器并再次打开它,因为 gradle 中的更改是重要的更改,因此它们需要它。您需要关闭模拟器并再次打开才能看到上述解决方案的结果。
将此添加到 android pp\src*debug*\AndroidManifest.xml 文件:
<application android:usesCleartextTraffic="true">
</application>
不要添加到 android pp\src*MAIN*\AndroidManifest.xml 它们是两个不同的东西。 然后停止并重建应用程序,因为热重启和热重载将不起作用,那么所有错误都会消失。
我将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>',
}),
);
这解决了我的问题
我正在使用
final String baseUrl='http://......herokuapp.com/';
这个网址给了我这个异常,但后来我做了 http 到 https
final String baseUrl='https://......herokuapp.com/';
这是由于某些手机的安全目的
这对我有用,提前谢谢!
有人知道这在 Flutter Web 上是否可行吗?