NSURLConnection IOS 3G 问题

Posted

技术标签:

【中文标题】NSURLConnection IOS 3G 问题【英文标题】:NSURLConnection IOS 3G issue 【发布时间】:2012-10-18 01:46:05 【问题描述】:

我在我的应用程序中使用了 NSURLConnection(异步),它在 wifi(ios5 和 iOS6)上运行良好。但它与 3G 产生了问题。当我运行我的应用程序 3G 连接时,我的 didReceiveData 方法中没有得到任何数据。

我已将日志放入我的委托方法中,但在使用 3G 时,请求超时。可能是什么问题。

编辑: 在服务器端 -> 显示我的请求已发送到服务器,服务器也已将响应发送到客户端。

编辑 2:

我写的代码如下。

NSURL *url = [NSURL URLWithString:@"someURL"];

NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url     
 cachePolicy:NSURLRequestUseProtocolCachePolicy                                   
 timeoutInterval:40.0];

//[req setHTTPShouldUsePipelining:YES];

[req setValue:@"x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"someValue" forHTTPHeaderField:@"Accept"];
[req setValue:@"myCrdentails" forHTTPHeaderField:@"Authorization"];
[req setHTTPMethod:@"GET"];

[[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];

响应头如下

< HTTP/1.1 200 OK
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< Content-Type: text/event-stream; charset=utf-8
< Connection: keep-alive
< Transfer-Encoding: chunked

【问题讨论】:

更重要的是,connectionDidFinishLoading:didFailWithError: 被解雇了吗? 是的,在我的超时间隔 (40.0 - 120.0) 之后 didFailWithError 被调用 说得有道理,这是苹果工程师提出的一些建议:***.com/a/12726729/792677 谢谢,但没有成功。我已经尝试过两个不同的网络运营商,服务器端也使用 HTTP 1.1。尝试了 HTTPShouldUsePipelining,但没有结果。问题依然存在 【参考方案1】:

在解决这个问题几个小时后,我终于找到了一个可行的解决方案。 NSMutableURLRequest 对象有一个方法来设置是否允许使用蜂窝网络:

[req setAllowsCellularAccess:YES];

即使 NSURLRequest 类型的对象的默认值似乎是 YES,但它为我解决了问题。

希望这会帮助像我这样在这个问题上苦苦挣扎并最终解决这个问题的人。

【讨论】:

【参考方案2】:

尝试使用Reachability 框架并检查它是否为 3G 返回 false。如果它确实返回 true 并且您仍然得到超时,请尝试转到同步模型并查看会发生什么。可能是连接正常,但有东西拦截了你的回调。

【讨论】:

是的,我在我的应用程序中添加了可达性框架,并且它为 3G 恢复了 TRUE。什么是同步模型,如何做到这一点。 您现在正在使用异步方式,在回调中处理数据。尝试使用一些同步连接方法(如 NSData dataWithContentsOfURL:url ),看看它的行为是否相同。 我尝试使用同步 -> 在 wifi 上它会在发生超时时显示数据,而在 3g 上它甚至没有显示任何数据。它显示空字符串。我不明白怎么回事。 您是只使用一个连接还是队列或池中有很多连接? NSURLConnection 正在被 iOS 池化,如果没有正确关闭,池将满并且连接失败。此外,尝试使用相同的代码(Flickr 或一些 RSS 提要)连接到另一台服务器,看看会发生什么。还要检查服务器端的 HTTP 标头,确保它具有缓存和“更新”标头的编译指示。 我只有一个连接。相同的代码适用于 RSS 提要(espncricinfo)。我的代码中有一些标题,我必须将其发送到我的请求中,否则我的请求将不起作用。我尝试使用所有缓存方法,但它们都不适合我【参考方案3】:

这是https吗?我想知道是否可能会发生一些 SSL 验证失败...您是否尝试过从 curl over 3G 查询这个?如果蜂窝运营商代理并且没有为您提供有效数据,或者如果它的 IP 相关(黑名单、封闭端口等),那么您可能会得到不同的响应。我肯定会用 curl 测试。要么来自一部破牢的手机,要么来自被束缚的手机。

【讨论】:

【参考方案4】:

NSURLConnection 超过 3g 的问题是超时,基本上是你无法控制的,,

如果您正在将数据上传或流式传输到服务器并且该数据在那里处理并且需要超过NSURLConnection时间阈值或连接太慢,则连接将被关闭并返回NULL数据..因为连接进入空闲状态...

要克服这样的问题,你需要让 web 服务发送一个空包“空格” 您将看到在每个数据包到达时调用didReceiveData ..

空格不会影响receivedData .. 在我的情况下,响应是JSON,我使用JSonKit 来解析它,,...

希望它会帮助某人..

【讨论】:

以上是关于NSURLConnection IOS 3G 问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 使用 3G 随机“无法连接到主机”

IOS:多个 NSUrlConnection 以及多个 UIProgressBar

iOS5 中的 NSURLConnection

NSURLConnection 在 iOS 4.3 中完美运行,但在 iOS 5 / iOS 6 中却不行

我在 iOS 中收到 NSURLConnection 的错误 -1100?

NSURLConnection/CFURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9813) iOS