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

时间:2015-12-28 12:26:28

标签: ios nsurlconnection

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

一些事实:

- 所有网址均为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]只返回一个网址 - 基本域。

+(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];

}

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您正在当前的runloop上创建start date: 1/4/2016。一次有多少人活跃?您是否考虑过使用end date: 1/10/2016以免因负载错误而受到攻击?

您的委托是否是线程安全的?如果没有,这可以解释臭虫的零星现象。

你说你经常看不到这个问题,但其他人却这么做。你可以借用他们的设备,甚至是他们和他们的使用模式,从而更频繁地看到问题吗?