我想实现一个可以捕获我的应用程序的所有请求和响应的工具。我选择 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方法后,将替换默认的协议类,所以我不知道这种情况是否会影响现有任务。
顺便说一句,我想知道默认协议类的作用。