You need to enable JavaScript to run this app. Flutter调用REST API仅iOS模拟器报SocketException连接失败如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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节点下添加如下测试配置,临时放开应用传输安全限制:
    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
    </dict>
    
    配置添加完成后重新编译运行应用验证问题是否解决,若问题解决后续可将全局放开改为仅允许你的API域名,降低安全风险。
  • 适配Dart HTTP客户端IPv6解析逻辑
    该问题是Flutter 2.0.x版本搭配Xcode 12.5 iOS模拟器的高频故障:Dart内置HTTP客户端默认优先解析IPv4地址,但Xcode 12.5的iOS模拟器会优先将域名解析为IPv6地址,导致连接失败,可通过自定义地址解析逻辑修复:
    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;
    }
    
    若使用dio等第三方HTTP封装库,可通过自定义请求适配器替换底层HttpClient实现上述逻辑。
  • 重置iOS模拟器配置
    模拟器网络缓存异常也会导致该问题,操作路径:打开模拟器后点击顶部菜单「Features」→「Erase All Content and Settings」,重置完成后重启模拟器重新运行应用测试。
  • 关闭本机代理、VPN和防火墙
    部分代理、VPN工具仅对系统应用(如Safari)生效,不会拦截转发Flutter应用的网络请求,可临时关闭所有代理、VPN和系统防火墙后重新测试。

内容的提问来源于stack exchange,提问作者Chathuranga Jayawardhana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 19:24:04