通过NSURLProtocol捕获请求和响应

时间:2019-01-09 07:52:56

标签: ios objective-c nsurlsession nsurlprotocol

我想实现一个可以捕获我的应用程序的所有请求和响应的工具。我选择 NSURLProtocol

为了不妨碍现有网络库的实现,我通过模糊方法钩住了 NSURLSessionConfiguration 的类方法defaultSessionConfiguration。像这样:

+ (void)load{
  swizzleSelector([self class], @selector(defaultSessionConfiguration), @selector(pro_defaultSessionConfiguration));
}

+ (NSURLSessionConfiguration *)pro_defaultSessionConfiguration {
  NSURLSessionConfiguration *con = [[self class] pro_defaultSessionConfiguration];
  con.protocolClasses = @[[MyURLProtocol class]];//[classes copy];
  return con;
}

然后我实现自己的url协议并成功捕获。

问题是:

当我执行不带花哨方法的任务时:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];

NSURLSessionConfiguration *con = [NSURLSessionConfiguration defaultSessionConfiguration];

NSLog(@"%@", con.protocolClasses);

NSURLSession *session = [NSURLSession sessionWithConfiguration:con delegate:nil delegateQueue:nil];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
[dataTask resume];

日志为:

(
  "_NSURLHTTPProtocol",
  "_NSURLDataProtocol",
  "_NSURLFTPProtocol",
  "_NSURLFileProtocol",
  NSAboutURLProtocol
)

当我使用复杂方法触发任务时:

日志为:

(
  MyURLProtocol
)

使用swizzle方法后,将替换默认的协议类,所以我不知道这种情况是否会影响现有任务。

顺便说一句,我想知道默认协议类的作用。

0 个答案:

没有答案