美文网首页
macOS Android Flutter Dio Https

macOS Android Flutter Dio Https

作者: 戴维王 | 来源:发表于2022-06-15 17:25 被阅读0次

平台、工具

macOS、Charles

步骤

  • 下载 Charles 证书


    image.png
  • 手机上安装
    命令行使用 adb push 命令将 PC 端下载的 CA 证书推送到手机上的 Download 目录:
    adb push ~/Downloads/charles-ssl-proxying-certificate.pem sdcard/Download
    安装:设置-安全-加密与凭证-安装证书- CA 证书,选择 Download 文件夹中的证书安装
    安装成功后可以在:设置-安全-加密与凭证-信任的凭证-用户,下看到 Charles CA 证书
  • 代码实现 Proxy 配置
    实现方案是 Flutter 端通过 MethodChannel 获取 Android 端的 Proxy host 以及 port(这部分借鉴了https://juejin.cn/post/7029974646137028638),也可以用 pigeon 工具简化了 channel 的配置,代码如下:

flutter 端获取 proxy

    MethodChannel channel =
        const MethodChannel('flutter_channel_get_proxy_config');
    Future<String> getHost = channel.invokeMethod('getProxyHost');
    Future<String> getPort = channel.invokeMethod('getProxyPort');
    var result = await Future.wait([getHost, getPort]);
    if (result?.length == 2 &&
        (result[0]?.isNotEmpty ?? false) &&
        (result[1]?.isNotEmpty ?? false)) {
      String host = result[0].toString();
      String port = result[1].toString();
      // 将该句中 _dio 替换为项目中 dio 实例
      (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
          (HttpClient client) {
        // 设置代理
        client.findProxy = (uri) {
          return "PROXY $host:$port";
        };
        // 信任证书,否则会请求失败
        client.badCertificateCallback = (cert, host, port) {
          return true;
        };

        return client;
      };
    }

Android 端提供 proxy 配置

   class HttpProxyPlugin(messenger: BinaryMessenger): MethodChannel.MethodCallHandler {
       private var channel: MethodChannel? = null

       init {
           channel = MethodChannel(messenger, "flutter_channel_get_proxy")
           channel?.setMethodCallHandler(this)
       }

       override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
           when (call.method) {
               "getProxyHost" -> result.success(getProxyHost())
               "getProxyPort" -> result.success(getProxyPort())
           }
       }

       private fun getProxyHost(): String? {
           return System.getProperty("http.proxyHost")
       }

       private fun getProxyPort(): String? {
           return System.getProperty("http.proxyPort")
       }
   }
  • 以上配置完成后,在手机上按照正常 Charles 抓包设置好就可以抓 https 的包了

相关文章

网友评论

      本文标题:macOS Android Flutter Dio Https

      本文链接:https://www.haomeiwen.com/subject/ekmxvrtx.html