flutter截取字符串_Flutter抓包实践

背景

在原生flutter混合开发项目第一次提测阶段,发现使用Charles原生端抓包正常,flutter模块却无法抓包。通过查阅文章发现flutter使用Dio库进行网络请求时,默认情况下是不走手机代理的,想要抓包需要通过代码去配置代理en~~~~~~

实现方案

本来想到两种方案:

第一种:在flutter端通过弹框输入IP和端口号,这样可以省去iOS和Android两端的处理,但是抓包时,既需要给手机配置代理,又需要在APP上输入代理,对测试人员来说,操作太过麻烦。

第二种:APP启动时,在原生端直接获取手机代理,通过channel调用flutter方法保存代理,在Dio初始化时进行设置。优点是省去测试人员二次输入过程,原生和flutter抓包保持一致,缺点,两端都需要获取代理。

所以,果断选择第二种,毕竟用户至上,两端处理也只是一次性操作😁~~~~

实践过程

1.原生端获取手机代理

// iOS获取手机代理

- (void)syncProxy{

//自动获取手机代理

NSString * portalBaseUrlStr = @"http://www.baidu.com";

NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());

NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:portalBaseUrlStr]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));

NSDictionary *settings = [proxies firstObject];

NSString *hostName = [NSString stringWithFormat:@"%@",settings[@"kCFProxyHostNameKey"]];

NSString *portName = [NSString stringWithFormat:@"%@",settings[@"kCFProxyPortNumberKey"]];

//获取为空时居然是字符串"(null)"

if ([hostName isEqualToString:@"(null)"]) {

hostName = @"";

}

if ([portName isEqualToString:@"(null)"]) {

portName = @"";

}

//第二步:调用flutter方法将IP和端口传入 自己写😁

}

portalBaseUrlStr变量需要有值才能拿到IP和Port。方法调用可以放在APP启动时,flutter初始化完成后,通过条件编译只在DEBUG时调用即可~

2.flutter保存代理信息

///保存代理

void saveProxy(Map setting) async {

String host = setting['host'] ?? '';

String port = setting['port'] ?? '';

String proxy = '';

if (host.isNotEmpty && port.isNotEmpty) {

proxy = 'PROXY ' + host + ':' + port;

}

SharedPreferences prefs = await SharedPreferences.getInstance();

prefs.setString('proxy', proxy);

}

将从原生端接收到的代理信息保存在本地

3.Dio设置代理

///设置代理

void setupProxy() async {

Dio dio = Dio();

SharedPreferences prefs = await SharedPreferences.getInstance();

String proxyStr = prefs.getString('proxy');

if (proxyStr != null && proxyStr.isNotEmpty) {

(dio.httpClientAdapter as DefaultHttpClientAdapter)

.onHttpClientCreate = (client) {

client.findProxy = (uri) {

return proxyStr;

};

//忽略证书

client.badCertificateCallback = (X509Certificate cert, String host, int port) => true;

};

}

}

dio可通过懒加载方式进行创建,在dio对象初始化完成后,获取本地保存的代理信息进行设置即可。这里做了条件判断,如果没有代理信息,则不进行配置。APP启动时会重置代理信息,所以无需担心缓存代理的清理问题。

结语

本文是对在flutter抓包实践的一次学习和总结,分享出来希望大家都能有所收获😏~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值