如何解决 "SocketException:连接失败(操作不允许)",在macOS上使用Flutter

1,183 阅读2分钟

在Flutter应用中添加网络支持是一个非常常见的需求。

这主要是按照以下步骤进行。

  • pub.dev中安装一个网络包,如httpdio
  • 在您的 Flutter 应用程序中添加所有必要的网络代码
  • 如果需要,添加任何所需的API密钥

但是,如果你在macOS上运行该应用程序,你会被这个可怕的错误所欢迎。

SocketException错误已经来拜访你了

这就是它,以更可读的格式。

DioError (DioError [DioErrorType.other]: SocketException: Connection failed (OS Error: Operation not permitted, errno = 1), address = api.themoviedb.org, port = 443
Source stack:
#0      DioMixin.fetch (package:dio/src/dio_mixin.dart:488:35)
#1      DioMixin.request (package:dio/src/dio_mixin.dart:483:12)
#2      DioMixin.get (package:dio/src/dio_mixin.dart:61:12)
#3      DioHttpService.get (package:movies_app/core/services/http/dio_http_service.dart:47:35)

所以,让我们弄清楚为什么会发生这种情况,以及如何修复它。👇

注意:如果你要给一个旧的Flutter应用添加macOS支持,你可能需要运行flutter create --platforms macos . ,把macOS添加为构建目标。我在macOS上运行我的大部分应用程序,所以在构建响应式UI时,我可以轻松地调整窗口的大小。

macOS上的客户端联网权限

macOS应用程序默认为沙盒,如果你没有添加所需的权限,就会发生SocketException 的错误。

要解决这个问题,请打开名为macos/Runner/DebugProfile.entitlements 的文件并添加以下内容。

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

然后,打开macos/Runner/Release.entitlements ,做同样的事情。

一旦你完成了,entitlements文件在Xcode中应该是这样的。

DebugProfile.entitlements文件中的客户端网络权限

那么iOS呢?

在iOS上,只要你连接到一个安全的https 终端,该应用就可以正常运行(不需要额外的配置)。

但请记住,在某些情况下,你可能需要定制应用程序的传输安全设置,如这里所解释的。

安卓的情况如何?

在安卓系统中,曾经需要AndroidManifest.xml 文件中添加INTERNET权限。

<uses-permission android:name="android.permission.INTERNET" />

但根据这个答案,现在已经不需要了,因为大多数应用程序都需要互联网访问。

其他资源