1

我有一个 iOS 5 应用程序,它使用 NSURLConnection 通过 GET 加载一些 XML。在极少数情况下,连接似乎会陷入反复超时的情况。

一个示例请求:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url]];
/*
The request is set with a timeout interval of 10 because (due to the nature of 
the app and the XML feed) this data is reloaded every 15 seconds.
*/
[request setTimeoutInterval:10];
[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[request setHTTPMethod:@"GET"];
self.afOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
self.afOperation.successCallbackQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
self.afOperation.failureCallbackQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
//snip success/completion block code
[self.afOperation start];

到目前为止,当请求开始挂起时,我已经看到了三种“恢复”场景。

  • 退出整个应用程序
  • 将设备插入计算机(是的,真的)。在 iPhone/iPad 确认连接后,它将立即停止超时。
  • 离开应用程序,然后去做其他事情。快速离开和重新进入应用程序通常不足以导致恢复。

正如你可能想象的那样,我觉得这非常奇怪。此时我已经用 AFNetworking 替换了我自己的 NSURLConnectionDelegate 实现(如上所示),并且仍然遇到同样的问题。我已经为每个 NSURLConnectionDelegate 协议选择器添加了日志记录,发现唯一调用的选择器(在调用之后start)是connection:didFailWithError:. 我确保我没有堆积多个请求(之前的请求总是被取消并且在开始新的请求之前被取消)。此外,我已验证实际上没有通过路由器上的 tcpdump 发送请求。什么可能导致这种行为?

4

2 回答 2

1

原来这个问题是由TestFlight SDK v1.0及以下版本引起的。请参阅为什么 NSURLConnection 无法到达后端?

在他们发布修复程序之前,除了完全剥离 SDK 之外,没有办法解决这个问题。

于 2012-04-28T03:34:47.037 回答
1

安装 testflight sdk 后我开始看到错误,删除它帮助我摆脱了它。但是,我认为这是由 Testflight 和 ASIHttpRequest (或您使用的任何其他工具包)之间的交互引起的。它也可以通过以下链接中的解决方案来解决(在构建阶段禁用 ASIHttpRequest 和 ASIFormDataRequest 文件的编译器优化)

https://groups.google.com/forum/?fromgroups#!topic/asihttprequest/fw7PDcD2wKI%5B1-25%5D

于 2012-08-09T03:24:00.710 回答