在设备重启之前,NSURLConnection会随机失败

nic*_*dnk 8 nsurlconnection ios

我一直在努力解决NSURLConnection电话立即失败的问题.需要完全重启设备或需要打开/关闭飞行模式以解决问题.单独重新启动应用程序(向上滑动)无济于事.

一些事实:

- 所有URL均为HTTPS,TLS 1.2与Forward Secrecy兼容.ATS和iOS 9没有问题.自iOS 7以来一直存在错误,并且仍然存在9.2.

应用程序不使用第三方框架.我只使用NSURLConnection始终有效的本机调用,除非出现这种奇怪的情况.

- 没有基础设施/网络问题 - 同一网络上的其他设备(例如,相同的WiFi)同时在同一个应用程序中工作.来往/来自3G/Wifi没有任何区别.

- 我总是执行willCacheResponse返回nil.

- 该服务托管在AWS Elastic Beanstalk上,因此一些人建议在IP地址更改时可能是DNS缓存问题 - 这对我来说似乎不太可能并且应该在不同的设备上同时触发多个错误,这是我从未见过的.

- didFailWithError即时调用的方法就好像设备上根本没有互联网连接 - 但是所有其他应用程序都可以工作.

- 可以随时浏览承载应用程序使用的API的网站.该网站实际上提出了获取数据的相同请求.

返回的错误代码是-1003 , kCFURLErrorCannotFindHost. 我一直在关注Git处理相同问题的线程无济于事.https://github.com/AFNetworking/AFNetworking/issues/967

我尝试使用NSURLRequestReloadIgnoringCacheData我的所有请求,但这没有帮助.

有了这些信息,是否有人会冒险猜测我可能做错了什么?我添加了赏金,因为我不知道如何处理这个问题 - 特别是因为它是如此不一致.它肯定不是一个合法的错误(也就是说,找不到域),因为服务运行正常,而这种情况发生在随机客户端上.

我用一个看起来像这样的静态方法创建我的请求.它被剥夺了一些非公开信息,但基本上它只是用JSON数据执行POST请求.[Controller getSQLHost]只返回一个URL - 基本域.

+(NSURLConnection*)initiatePOSTwithJSONDictionary:(NSDictionary*)dictionary toURL:(NSString*)urllocation withDelegate:delegate {

    NSMutableDictionary *connectionDictionary = [[NSMutableDictionary alloc] init];

    if (dictionary) {
        [connectionDictionary setObject:dictionary forKey:@"input"];
    }

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:connectionDictionary options:kNilOptions error:nil];

    NSURL *url = [NSURL URLWithString:[[Controller getSQLHost] stringByAppendingString:urllocation]];

    NSString *postLength = [NSString stringWithFormat:@"%i", (int)[jsonData length]];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:jsonData];

    return [[NSURLConnection alloc] initWithRequest:request delegate:delegate];

}
Run Code Online (Sandbox Code Playgroud)

Ala*_* T. 0

您是否委托实现 connectionShouldUseCredentialStorage ?(或回答“是”)

我认为当此方法返回 yes 时,将使用设备的钥匙串,这可能解释了在运行的应用程序的生命周期之外持续出现的故障,以及为什么重新启动或以其他方式重置网络连接可以“修复”它。如果一次验证失败,它可能会在密钥链中停留一段时间,然后立即响应,而无需实际访问服务器。

首先导致身份验证在钥匙串中注册为失败的原因可能取决于多种因素。它可能像保存的密码中的拼写错误一样简单,也可能更复杂,例如某些证书过期,导致 SSL 层无法建立安全链接。