Flutter配置代理仅iOS模拟器生效 真机无法捕获Charles流量如何解决?
第一步 完成iOS项目原生基础配置
- 关闭iOS ATS限制,在项目
ios/Runner/Info.plist的根dict节点下添加如下配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
- 给真机安装并信任Charles根证书:手机和电脑连接同一WiFi,手动设置手机当前WiFi的代理为电脑局域网IP+Charles默认端口8888,手机 Safari 访问
chls.pro/ssl下载证书,依次进入「设置-通用-VPN与设备管理」信任安装的Charles证书,再进入「设置-通用-关于本机-证书信任设置」开启Charles证书的完全信任权限。 - 打开Charles的远程连接权限:进入Charles顶部菜单
Proxy -> Proxy Settings -> Proxies标签页,勾选Allow remote connections选项,避免真机连接被拦截。
第二步 修改Flutter侧代理适配代码
原有硬编码代理IP的方案仅适用于模拟器(模拟器和电脑共享回环网络),真机需要改为动态读取系统代理配置,不要写死IP地址:
// 原生HttpClient适配方案 HttpClient createProxyHttpClient() { final client = HttpClient(); client.findProxy = (uri) { // 本地调试接口可跳过代理 if (uri.host == '127.0.0.1' || uri.host == 'localhost') { return 'DIRECT'; } // 自动读取系统配置的代理,无需硬写IP return HttpClient.findProxyFromEnvironment(uri, environment: {}); }; // 调试阶段关闭证书校验,避免Charles自签证书导致请求失败 client.badCertificateCallback = (cert, host, port) => true; return client; }
如果使用Dio等第三方网络库,同步修改对应配置即可:
final dio = Dio(); (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { client.findProxy = (uri) { if (uri.host == '127.0.0.1' || uri.host == 'localhost') { return 'DIRECT'; } return HttpClient.findProxyFromEnvironment(uri, environment: {}); }; client.badCertificateCallback = (cert, host, port) => true; return client; };
第三步 运行验证
重新编译Flutter项目安装到真机,发起网络请求即可在Charles中捕获到对应流量。
内容的提问来源于stack exchange,提问作者Hayden Young
相关产品推荐
相关产品推荐

