为什么在通过蜂窝网络下载图像时总是会出现NSURLConnection超时?

时间:2012-10-04 11:55:50

标签: ios nsurlconnection 3g

我的应用程序似乎在蜂窝网络上工作非常繁琐 - 用户界面通常有旋转器而不是图像,但并非总是如此。它使用由并发NSOperations驱动的NSURLConnections。它在WIFI上工作正常 - 完全没问题。

我发现我获得了很多NSURLConnection超时,但不知道为什么。如何查找此问题?

1 个答案:

答案 0 :(得分:7)

为了追踪问题,我首先测量了最大并发连接数,并发现这一直是55左右。

  • 将最大值减少到10(通过设置操作队列最大值,减少超时,但仍然不完美

  • 将最大值减少到4 - 甚至更少的超时但仍然有一些

  • 将最大值设置为1 - 这必须起作用,对吧?都能跟得上!

有时应用程序可以正常工作而根本没有并发(max == 1),但它仍然在大约一半的时间内失败。

所以我与Apple烧毁了一个支持事件,并得到了一位经验最丰富的工程师提供建议。基于他的建议,我尝试了以下内容:

  • 在不同运营商的移动网络(Verizon)上运行该应用,效果非常好。所以问题不是蜂窝本身(或iOS),而是AT& T的蜂窝网络(纽约和新泽西都失败了)

  • 从http切换到https,现在它在AT& T上完全并发完美无缺

  • 调查了网络端点以确定其功能,结果证明它非常差(更晚些时候)。我尝试了一个具有更多功能的不同Web端点,原始问题使用http。

  • 消失了

我从中学到的内容如下:

  • 使用iOS5.1或iOS6

  • 没有区别
  • 如果您在AT& T 3G上遇到此问题且正在使用http,请尝试切换到https

  • 如果端点使用HTTP1.0且不支持“连接:保持活动”,那么每个http请求都会设置并拆除TCP连接。我相信这会让我们感到沮丧。蜂窝网络的原因是AT& T断开我的一些会话,但当然无法确定这一点。

  • 使用支持持久连接的HTTP1.1服务,问题就消失了。在这种情况下,没有TCP连接抖动。

  • 一些HTTP1.1服务支持'流水线',iOS(使用NSURLRequest设置,HTTPShouldUsePipelining),如果我可以切换到这个,那么我的性能应该会大大提高

  • 有一个WWDC 2012视频,讨论如何提高网络性能:会话706"网络最佳实践"

修改

所以当我剥洋葱时,这变得更奇怪!在进一步讨论之后,一些网络用户使用CloudFront进行了测试,并确实接受了“连接:保持活着”。我一遍又一遍地尝试让它上班,但不能。

网络专家建议我在使用https时尝试使用低,看看它确实如此!出于某种原因,使用' http'在AT& T 3G上,该标题标记被删除或被忽略。我也用Wifi测试了我的应用程序。在所有情况下,除了AT& T / 3G之外,连接'在回复中被退回。