Как распечатать сбойные ссылки NSURLConnection, чтобы найти множество исключений NSAppTransportSecurity?

Веб-просмотры в моих приложениях получают эти ошибки от новых стандартов iOS 9 NSAppTransportSecurity:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

Я не знаю, где генерируется эта ошибка, но по сути я хочу узнать, как узнать, какой URL был предпринят?

После этого я могу настроить plist соответствующим образом.

До сих пор я установил точку останова в - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error но этот код не вызывается при получении ошибки.

1 ответ

Решение

Если вы просто отлаживаете, установите для переменной среды CFNETWORK_DIAGNOSTICS значение 3, например

setenv("CFNETWORK_DIAGNOSTICS", "3", 1);

в начале вашего приложения, прежде чем вызывать что-либо, что потенциально может привести к загрузке кода инфраструктуры CFNetwork (т. е. в начале main). Вы должны получить URL-адреса в консоли.

Если вам нужно сделать это в приложении доставки таким образом, чтобы вы могли отлаживать его удаленно, зарегистрируйте объект NSURLProtocol глобально, а в методе canInitWithRequest: напечатайте значение и верните NO. Это должно произойти достаточно рано в процессе, чтобы оно работало даже при включенной строгой транспортной безопасности.

Пример:

@interface MyProtocol: NSURLProtocol
@end

@implementation MyProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
    NSLog(@"Request: %@\n", request); // Log it in whatever way you need.
    return NO;
}
@end

...

// Somewhere else, e.g. in applicationDidFinishLaunching:, do this:
[NSURLProtocol registerClass:[MyProtocol class]];

Заказ не гарантируется, но ошибочный URL-адрес, скорее всего, будет напечатан примерно до сбоя.

Другие вопросы по тегам