iOS端Flutter应用使用移动数据时触发SocketException域名解析错误
iOS Flutter应用移动数据下SocketException(errno=8)解决方法
核心原因与修复方案
1. 补全iOS蜂窝网络权限与ATS配置
iOS应用默认不会自动获得蜂窝网络访问权限,且ATS(App Transport Security)会限制非HTTPS请求,需要修改ios/Runner/Info.plist:
<!-- 添加蜂窝数据权限说明 --> <key>NSCellularDataUsageDescription</key> <string>应用需要使用蜂窝网络连接互联网</string> <!-- 配置ATS,若仅需访问HTTPS域名可替换为NSExceptionDomains --> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
NSCellularDataUsageDescription是iOS 10+强制要求的,必须向用户说明蜂窝数据用途,否则应用无法获取蜂窝网络权限。- 若你的请求全是HTTPS,可更严谨地配置
NSExceptionDomains指定允许的域名,避免全局关闭ATS。
2. 替换更可靠的网络检测逻辑
InternetAddress.lookup仅做DNS解析,在部分移动数据环境下可能出现解析失败但实际网络可用的情况,建议改用TCP连接测试:
import 'dart:io'; Future<bool> hasNetworkConnection() async { try { // 尝试连接Google的80端口,超时5秒 final socket = await Socket.connect('google.com', 80, timeout: const Duration(seconds: 5)); socket.close(); return true; } on SocketException { return false; } }
这种方式直接验证TCP连通性,比单纯DNS lookup更准确反映实际网络状态。
3. 检查Xcode项目配置
- 打开Xcode的
Signing & Capabilities页面,若应用需后台联网,勾选Background Modes下的Background fetch或Remote notifications。 - 在
Build Settings中设置Enable Bitcode为No,部分网络库在Bitcode开启时会出现兼容性问题。
验证操作
- 执行
flutter clean清理缓存 - 重新编译运行:
flutter run - 在iOS真机切换到移动数据测试网络检测功能
内容的提问来源于stack exchange,提问作者Camillo Rinaldi
相关产品推荐
相关产品推荐

