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 应用移植到 macos 桌面。用户界面开始很好。但是,一旦应用进行网络调用,它就会立即失败并显示 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.entitlements
和macos/Runner/Release.entitlements
。
这已记录在here。
【讨论】:
我可以确认,尽管我在功能中选择了“全部”,但遵循接受的解决方案并没有添加发布权利。我持怀疑态度,但这应该是 IMO 公认的答案。【参考方案3】:如果您仅在 Android 版本中遇到此错误,则 Internet
权限必须在 main
manifest
中丢失。您只需要在Manifest
文件中添加Internet
权限即可。
只需在清单中添加此权限<uses-permission android:name="android.permission.INTERNET"/>
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 请求的最简单方法是啥?