如何打印出失败的 NSURLConnection url 以查找一组 NSAppTransportSecurity 异常?

How to print out failed NSURLConnection urls to find set of NSAppTransportSecurity exceptions?

我的应用程序中的网络视图已经从新的 iOS 9 NSAppTransportSecurity 标准中得到这些错误:

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

我不知道这个错误是在哪里产生的,但本质上我想知道如何知道尝试了哪个 URL?

之后我可以适当地配置 plist。

到目前为止,我已经在 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 中设置了一个断点,但是在出现错误时不会调用此代码。

如果您只是调试,请将 CFNETWORK_DIAGNOSTICS 环境变量设置为 3,例如

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

在您的应用程序的开头,在您调用可能导致 CFNetwork 框架代码加载的任何内容之前(即在 main 的开头)。您应该在控制台中获得 URLs。

如果您需要在发布的应用程序中以允许您远程调试它的方式执行此操作,请全局注册一个 NSURLProtocol 对象,并在canInitWithRequest: 方法,打印值和 return 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 可能会在失败之前大致打印出来。