前言
今天这事儿很可乐,干了8年开发,自认为对Charles用的不说头头是道,也是炉火纯青了吧,18年写的那篇《关于https抓包那点事》 简书也有几十个点赞,今天这个问题确实第一次遇到
问题
在其他部门的项目上,配合server接口新增一个字段,遇到问题不想去跑项目了,想抓包看看,结果Charles里面居然没有对应的url列表。(而且很奇怪的就是ReactNative包里面能抓,原生的不能抓)
排查了Charles版本、证书、网络ip等等,还是没解决,刚好看到一片文章 iOS小技能:APP 不走全局proxy的方案(隧道APP的请求接口,一些自己特殊接口不走隧道),又填补了一个知识盲区
1、核心
NSURLSessionConfiguration 的 connectionProxyDictionary 属性设置成空字典,请求就不会走全局设置的proxy,也就是Charles列表都不会显示抓包的数据
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.connectionProxyDictionary = @{};
...
2、调试优化
- 2.1、测试环境可抓包:采用debug编译配置
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
#ifdef DEBUG
configuration.connectionProxyDictionary = @{};
#endif
- 2.2、一劳永逸:搞两个AFHTTPSessionManager,结合server搞一个白名单
- 白名单里面的url走_sessionManager
- 非白名单里面的url走_nonProxySessionManager
@interface XYNetworkProxy ()
{
AFHTTPSessionManager *_sessionManager;
AFHTTPSessionManager *_nonProxySessionManager;
....
}
@end
- (void)initSessionManager {
_sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:nil sessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.connectionProxyDictionary = @{}; // 设置后不走代理
_nonProxySessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:nil sessionConfiguration:configuration];
}
- (AFHTTPSessionManager *)sessionManager {
// 白名单内部的url走_sessionManager
if (self.whitelist.count > 0 && [self.whitelist containsObject:url.host]) {
return _sessionManager;
}
return _nonProxySessionManager;
}