likes
comments
collection
share

iOS Flutter App设置HttpOverrides.global无法用charels抓包问题

作者站长头像
站长
· 阅读数 10

iOS flutter混合开发的app中,发现手机开启代理,flutter发起的网络请求HttpOverrides.global,无法通过代理抓包。

手机代理是通过系统的网络连接直接设置,连接配置没有错误(没有使用三方的代理app)。

flutter 网络请求关键代码设置如下:

在App启动前的初始化网络配置是,首先获取当前开发环境标志,然后获取代理地址, 最后设置HttpOverrides.global,用来达到设置全局配置,即网络连接对象Dio对象的网络代理配置,所有必要无界面流程初始化完成后才进入App主页面。

HttpOverrides.global = _HttpOverrides(systemProxy, isProduction: !BasicConfig.getInstance().appIsDebug);


class _HttpOverrides extends HttpOverrides {
  @override
  String findProxyFromEnvironment(Uri url, Map<String, String>? environment) {
    String proxy = PROXY_DIRECT;

    ///生产环境不使用代理
    if (!isProduction && systemProxy?.isNotEmpty == true) {
      proxy = "PROXY $systemProxy;$PROXY_DIRECT";
    }
    return proxy;
  }
}

代码流程也没有错误,那为什么此刻电脑charles 代理软件,没有网络请求走过来呢。

问题解决

通过开发代码flutter 网络相关初始化配置,没有发现问题。初始化顺序,app启动,main主页面加载,请求顺序都是正确的。

想到有一个IOS上的网络弹窗,在新app安装后首次启动有一个弹窗

iOS Flutter App设置HttpOverrides.global无法用charels抓包问题

弹窗弹出逻辑 通过测试发现,这个弹窗的弹出,是在新安装,之前没有弹出过 弹出是 手机设置了代理的情况下,因为当前项目用了自定义HttpOverrides子类实现 findProxyFromEnvironment方法,在达到了用本地网络条件的时候才会弹出一次弹窗。

iOS Flutter App设置HttpOverrides.global无法用charels抓包问题

修改为允许访问本地网络后,可以抓包了。并且后续通过修改这个开关设置,可以实时修改flutter网络请求是否通过charels代理。

整理了一下 app当初为什么添加了 这个字段 NSLocalNetworkUsageDescription。

NSLocalNetworkUsageDescription 使用场景

回顾一下,iOS 什么时候需要用到 NSLocalNetworkUsageDescription

苹果官方文档:developer.apple.com/documentati…

可以发现这个是iOS14新添加的权限字段。

1,在iOS app native启用一个本地http server服务的时候,需要申请这个NSLocalNetworkUsageDescription

比如我们的一个播放器sdk,为了实现边下载边播放,第二次播放从本地播放这个功能时,就APP内部启用了一个本地服务器,来实现节省流量的这一大功能。

2, 在Flutter 的官方文档中,也看到这样一个推荐的配置: flutter.cn/...

在 Info-Debug.plist 中 只 添加 key NSBonjourServices,并将它的值设置为数组 (Array),然后在该数组中添加 _dartobservatory._tcp 字符串 (String)。

可以选择添加 key NSLocalNetworkUsageDescription,并设置为你自定义的权限提示对话框文本。

iOS Flutter App设置HttpOverrides.global无法用charels抓包问题

那么分别来说明: NSBonjourServices 这个是 用来给flutter开发过程中, 在app使用flutter 的 attach 时,flutter 的attach需要用到这个才能 通过dns发现安装了flutter 程序的app,才可以 attach 到flutter app。

NSLocalNetworkUsageDescription 这个字段 flutte官方网页上没有注明,只是说需要添加。 那么通过本次问题发现,其实这个就是 flutter网络请求能否使用代理的一个关键配置。

综上就是这次 iOS端 Flutter App设置HttpOverrides.global无法用charels抓包问题的解决方法,并且说明了NSLocalNetworkUsageDescription字段的作用。