You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter http_proxy在iOS设备失效,求iOS代理感知解决方案

Flutter iOS代理感知问题解决方法

你用http_proxy库在Android上能生效,但iOS不行,核心原因是iOS的网络底层实现和Android不同,HttpOverrides无法完全覆盖iOS的URLSession代理配置,得结合iOS原生特性调整方案:

方案一:手动获取系统代理并配置客户端

放弃依赖HttpOverrides全局覆盖,改为手动获取系统代理后给每个网络客户端设置:

  1. 用flutter_proxy库获取系统代理信息:
import 'package:flutter_proxy/flutter_proxy.dart';

// 获取系统代理设置
final proxyConfig = await FlutterProxy.proxySettings;
if (proxyConfig.isNotEmpty) {
  // 提取代理地址(格式:host:port)
  final proxyAddress = proxyConfig['HTTPProxy'];
  if (proxyAddress != null) {
    // 给http包的HttpClient设置代理
    final httpClient = HttpClient();
    httpClient.findProxy = (Uri uri) {
      return 'PROXY $proxyAddress; DIRECT';
    };
    // 如果用Dio,这么配置
    Dio dio = Dio();
    dio.httpClientAdapter = HttpClientAdapter()..onHttpClientCreate = (client) {
      client.findProxy = (uri) => 'PROXY $proxyAddress; DIRECT';
      // 可选:忽略证书验证(若代理需要)
      client.badCertificateCallback = (cert, host, port) => true;
      return client;
    };
  }
}
  1. 若不想用第三方库,可自行通过MethodChannel调用iOS原生代码获取代理:
    在iOS端AppDelegate.swift中添加方法:
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let proxyChannel = FlutterMethodChannel(name: "com.example.proxy", binaryMessenger: controller.binaryMessenger)
    proxyChannel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) in
      if call.method == "getProxy" {
        let config = URLSessionConfiguration.default
        if let proxyDict = config.connectionProxyDictionary {
          result(proxyDict)
        } else {
          result(nil)
        }
      }
    }
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

Flutter端调用代码:

import 'package:flutter/services.dart';

final channel = MethodChannel('com.example.proxy');
final proxyDict = await channel.invokeMethod('getProxy');
if (proxyDict != null) {
  final proxyAddress = proxyDict['HTTPProxy'];
  // 后续同上配置客户端
}

方案二:调整http_proxy库适配(可选)

若坚持使用http_proxy,需要确认其iOS端实现是否正确拦截了URLSession的代理设置,可能需要修改库的iOS原生代码,但这种方式可靠性不如手动配置——很多第三方网络库会绕过HttpOverrides。

额外注意事项

  • iOS的ATS设置:若代理访问HTTP地址,需在Info.plist中添加NSAllowsArbitraryLoads并设为YES,或针对特定域名配置NSExceptionDomains。
  • 确保应用已配置网络权限,在Info.plist中添加对应权限描述。

内容的提问来源于stack exchange,提问作者Hari Prasad G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:13:59