Flutter - http.get 在 macos 构建目标上失败:连接失败

Posted

技术标签:

【中文标题】Flutter - http.get 在 macos 构建目标上失败:连接失败【英文标题】:Flutter - http.get fails on macos build target: Connection failed 【发布时间】:2020-01-10 12:05:50 【问题描述】:

我开始将我的 Flutter 应用移植到 ma​​cos 桌面。用户界面开始很好。但是,一旦应用进行网络调用,它就会立即失败并显示 Connection failed (OS Error: Operation not allowed)

运行单线:

final response = await http.get('https://jsonplaceholder.typicode.com/posts/1');

失败:

Unhandled Exception: SocketException: Connection failed (OS Error: 
    Operation not permitted, errno = 1),
         address = jsonplaceholder.typicode.com, port = 443
#0      IOClient.send (package:http/src/io_client.dart:33:23)

macos 构建目标来自 Google 的示例 here。

Flutter(频道主控,v1.9.8-pre.108)

【问题讨论】:

【参考方案1】:

您的 macOS XCode 项目缺少 Internet 权限,称为“传出连接(客户端)”。

打开你的 macos xcode 项目 - [root]/macos/Runner.xcworkspace

在项目导航器中单击“Runner” - 将显示常规设置。从标签栏中选择“功能”并勾选选项“传出连接(客户端)”

在 XCode 中重建您的应用程序并启动项目。

【讨论】:

您应该使用 macOS Flutter Runner 的 Capabilities UI。见github.com/google/flutter-desktop-embedding/blob/master/…。您很可能只启用了 Debug+Profile 或 Release 的传出连接,但没有同时启用。 @smorgan 感谢您的澄清。我很惊讶<key>com.apple.security.network.client</key><true/> 默认没有启用。但是,有问题的文件是:/macos/Runner-DebugProfile.entitlements/macos/Runner-Release.entitlements 您能否详细说明为什么您希望它默认启用? Flutter for (release) android 也默认不启用 Internet 访问 (flutter.dev/docs/deployment/android#reviewing-the-app-manifest),因此这与 Flutter 当前的工作方式是一致的(ios 没有这样的设置,因此无法在那里进行比较)。同样,Xcode 中的默认 macOS 项目模板为您提供了一个沙盒应用程序,而无需启用 Internet 访问。您是否有理由认为 Flutter for macOS 在默认情况下不如 Flutter for mobile 或 native macOS 项目安全? 如何在 IntelliJ 中为 Flutter 桌面应用启用 Internet 连接? @kosiara-BartoszKosarzycki 请考虑删除或编辑您的答案;阅读您的答案而不是上面的 cmets 的人会得到关于他们应该如何向 Flutter 应用程序添加互联网功能的错误信息。【参考方案2】:

根据我对另一个答案的评论,您应该为此使用 Xcode 功能 UI。它不会正确处理 Flutter 项目中的两个单独的权利文件。

你需要添加:

<key>com.apple.security.network.client</key>
<true/>

macos/Runner/DebugProfile.entitlementsmacos/Runner/Release.entitlements

这已记录在here。

【讨论】:

我可以确认,尽管我在功能中选择了“全部”,但遵循接受的解决方案并没有添加发布权利。我持怀疑态度,但这应该是 IMO 公认的答案。【参考方案3】:

如果您仅在 Android 版本中遇到此错误,则 Internet 权限必须在 main manifest 中丢失。您只需要在Manifest 文件中添加Internet 权限即可。

只需在清单中添加此权限&lt;uses-permission android:name="android.permission.INTERNET"/&gt;

Android 文件夹中有三个可用的清单文件

app/src/debug
app/src/main
app/src/profile

【讨论】:

以上是关于Flutter - http.get 在 macos 构建目标上失败:连接失败的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 无法通过 http.get 从 api 获取数据

Flutter:为 Http GET 请求发送 JSON 正文

在 Flutter 中每 1 分钟发出一次定时 http.get 请求的最简单方法是啥?

无法使用带有工作 api 的 http.get flutter 获取数据

flutter http get请求

MacOS安装flutter(MacOS下flutter环境配置)