Flutter macOS环境WebSocket代码Debug正常但Release模式报错
Flutter macOS Release模式下WebSocket连接失败(SocketException: errno=8)
问题场景
基于Flutter官方WebSocket示例代码修改(仅添加错误展示Text组件)的程序,在macOS Debug模式下可正常运行,但执行flutter build macos打包为Release版本后,出现以下错误:
SocketException: Failed host lookup: ‘...’ (OS Error: nodename nor servname provided, or not known, errno = 8)
已尝试的排查动作:
- 添加
com.apple.security.network.client权限 - 查阅相关技术问题
- 关闭系统防火墙
- 确认网络连接正常,
flutter doctor -v检测无异常
原因分析
Debug与Release模式下macOS应用的权限生效逻辑、签名机制存在差异:
- Debug模式下Flutter会自动注入调试相关配置,权限默认生效;但Release模式需要显式在对应配置文件中声明权限,且需保证签名正确才能让权限生效。
- 若仅修改了Debug环境的权限配置文件,未同步到Release配置,会导致Release版本缺失网络权限。
- 旧的构建缓存可能导致配置未正确更新到Release包中。
解决方案
1. 同步Release与Debug的权限配置
打开macos/Runner目录下的两个权限配置文件:
DebugProfile.entitlementsRelease.entitlements
确保两者都添加网络客户端权限,内容如下:
<key>com.apple.security.network.client</key> <true/>
2. 检查Release打包的签名配置
- 若使用开发者证书打包,确保证书有效且配置正确;
- 本地测试时可尝试无签名打包:
运行无签名应用时需右键选择「打开」绕过系统安全验证,验证是否为签名导致的权限问题。flutter build macos --release --no-codesign
3. 验证WebSocket URL合法性
确认代码中使用的WebSocket URL为标准格式(如wss://your-server.com/ws或ws://localhost:8080),无中文符号、拼写错误,避免因URL解析失败触发主机查找错误。
4. 清理构建缓存后重新打包
执行以下命令清理缓存并重新构建:
flutter clean rm -rf macos/build flutter build macos
内容的提问来源于stack exchange,提问作者MendelG
相关产品推荐
相关产品推荐

