Flutter如何检测设备是否连接代理

在Flutter开发中,如何检测当前设备是否连接了代理服务器?我想在应用中根据代理连接状态执行不同的逻辑,但没找到直接可用的API。是否有可靠的方法可以判断设备是否通过HTTP/HTTPS代理访问网络?最好能兼容Android和iOS平台。

2 回复

Flutter中可通过dart:iofindProxyFromEnvironment检测代理设置。示例代码:

import 'dart:io';

void checkProxy() async {
  String? proxy = await findProxyFromEnvironment(Uri.parse('https://example.com'));
  print(proxy != 'DIRECT' ? '代理已连接: $proxy' : '无代理');
}

更多关于Flutter如何检测设备是否连接代理的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中检测设备是否连接代理,可以通过以下方法实现:

1. 使用 connectivitydio 包检测代理

首先添加依赖到 pubspec.yaml

dependencies:
  connectivity: ^4.0.0
  dio: ^5.0.0

然后使用以下代码:

import 'package:connectivity/connectivity.dart';
import 'package:dio/dio.dart';

Future<bool> isProxyConnected() async {
  try {
    // 检查网络连接
    var connectivityResult = await Connectivity().checkConnectivity();
    if (connectivityResult == ConnectivityResult.none) {
      return false;
    }

    // 通过Dio发送请求检测代理
    final dio = Dio();
    dio.options.connectTimeout = Duration(seconds: 5);
    
    // 尝试访问一个已知地址
    final response = await dio.get('http://www.google.com');
    
    // 检查请求是否通过代理
    if (response.redirects.isNotEmpty) {
      return true; // 存在重定向,可能经过代理
    }
    
    // 检查真实IP与设备IP是否一致(简单检测)
    return false;
  } catch (e) {
    // 如果出现特定异常,可能涉及代理
    if (e is DioException) {
      return true; // 某些代理设置可能导致特定异常
    }
    return false;
  }
}

2. 平台通道方法(Android/iOS)

对于更精确的检测,可以使用平台通道:

Flutter端:

import 'package:flutter/services.dart';

class ProxyDetection {
  static const platform = MethodChannel('proxy_detection');
  
  static Future<bool> isProxyActive() async {
    try {
      final bool result = await platform.invokeMethod('isProxyActive');
      return result;
    } on PlatformException {
      return false;
    }
  }
}

Android端(Kotlin):

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "proxy_detection").setMethodCallHandler { call, result ->
            if (call.method == "isProxyActive") {
                val proxyHost = System.getProperty("http.proxyHost")
                result.success(proxyHost != null)
            } else {
                result.notImplemented()
            }
        }
    }
}

iOS端(Swift):

import Flutter

class ProxyDetectionPlugin: NSObject, FlutterPlugin {
  static func register(with registrar: FlutterPluginRegistrar) {
    let channel = FlutterMethodChannel(name: "proxy_detection", binaryMessenger: registrar.messenger())
    let instance = ProxyDetectionPlugin()
    registrar.addMethodCallDelegate(instance, channel: channel)
  }

  func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
    if call.method == "isProxyActive" {
      let proxySettings = CFNetworkCopySystemProxySettings()?.takeRetainedValue()
      let proxies = CFNetworkCopyProxiesForURL(URL(string: "http://www.google.com")! as CFURL, proxySettings).takeRetainedValue() as NSArray
      result(proxies.count > 0)
    } else {
      result(FlutterMethodNotImplemented)
    }
  }
}

使用建议:

  • 方法1 适用于简单的代理检测,但可能不够准确
  • 方法2 提供更精确的检测,但需要编写平台特定代码
  • 代理检测可能受到VPN、企业网络设置等影响
  • 某些代理设置可能无法被完全检测到

根据你的具体需求选择合适的方法。

回到顶部