gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:20:45 26 4
gpt4 key购买 nike

我一直在努力解决 NSURLConnection 调用立即失败的问题。设备需要完全重启或飞行模式需要打开/关闭才能解决问题。单独重启应用(向上滑动)没有帮助。

一些事实:

-所有 URL 都是 HTTPS,TLS 1.2 兼容前向保密。 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];

}

最佳答案

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

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

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

关于ios - NSURLConnection 随机失败,直到设备重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34493536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com