ios – NSURLConnection随机失败,直到设备重启

前端之家收集整理的这篇文章主要介绍了ios – NSURLConnection随机失败,直到设备重启前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在努力解决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];

}

解决方法

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

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

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

猜你在找的iOS相关文章