Я хочу реализовать инструмент, который может фиксировать все запросы и ответы моего приложения. Я выбираю NSURLProtocol
.
Чтобы не мешать реализации существующей сетевой библиотеки, я перехватываю метод класса defaultSessionConfiguration из NSURLSessionConfiguration
методом swizzling. как это:
+ (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 классы протоколов по умолчанию заменяются, поэтому я не знаю, повлияет ли эта ситуация на существующую задачу или нет.
Кстати, я хочу знать роли классов протокола по умолчанию.