Flutter调用REST API仅iOS模拟器报SocketException连接失败如何解决
问题解决排查步骤
- 若你的API部署在本机开发环境,请将请求地址中的
localhost/127.0.0.1替换为Mac当前的局域网IP地址,iOS模拟器的本地网络栈与Mac本机不互通,无法直接访问127.0.0.1地址。 - 检查iOS项目ATS配置
打开iOS项目下的ios/Runner/Info.plist文件,在根dict节点下添加如下测试配置,临时放开应用传输安全限制:
配置添加完成后重新编译运行应用验证问题是否解决,若问题解决后续可将全局放开改为仅允许你的API域名,降低安全风险。<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> - 适配Dart HTTP客户端IPv6解析逻辑
该问题是Flutter 2.0.x版本搭配Xcode 12.5 iOS模拟器的高频故障:Dart内置HTTP客户端默认优先解析IPv4地址,但Xcode 12.5的iOS模拟器会优先将域名解析为IPv6地址,导致连接失败,可通过自定义地址解析逻辑修复:
若使用dio等第三方HTTP封装库,可通过自定义请求适配器替换底层HttpClient实现上述逻辑。import 'dart:io'; // 自定义HttpClient适配iOS模拟器 HttpClient getAdaptiveHttpClient() { HttpClient client = HttpClient(); client.connectionTimeout = const Duration(seconds: 15); client.addressLookup = (host, port) async { // 优先查询IPv6地址 List<InternetAddress> addresses = await InternetAddress.lookup(host, type: InternetAddressType.IPv6); if (addresses.isEmpty) { // IPv6无结果时再查询IPv4 addresses = await InternetAddress.lookup(host, type: InternetAddressType.IPv4); } return addresses.map((item) => SocketAddress(item, port)).toList(); }; return client; } - 重置iOS模拟器配置
模拟器网络缓存异常也会导致该问题,操作路径:打开模拟器后点击顶部菜单「Features」→「Erase All Content and Settings」,重置完成后重启模拟器重新运行应用测试。 - 关闭本机代理、VPN和防火墙
部分代理、VPN工具仅对系统应用(如Safari)生效,不会拦截转发Flutter应用的网络请求,可临时关闭所有代理、VPN和系统防火墙后重新测试。
内容的提问来源于stack exchange,提问作者Chathuranga Jayawardhana
相关产品推荐
相关产品推荐

