为什么当通过蜂窝networking下载图像时,总会遇到NSURLConnection超时?

我的应用程序似乎在蜂窝networking上工作非常糟糕 – 用户界面通常具有旋转器而不是图像,但并不总是如此。 它使用并发NSOperations驱动的NSURLConnections。 它在WIFI上运行良好 – 完全没有问题。

我发现我得到很多NSURLConnection超时,但不知道为什么。 我怎样才能跟踪这个问题呢?

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

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

  • 最多减less到4 – 甚至更less的超时,但仍然有一些

  • 设置最大值为1 – 这已经工作了,对吧? 不!

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

于是我就和苹果公司发生了一起支持事件,并且聘请了一位经验丰富的工程师来提供build议。 根据他的build议,我尝试了以下几点:

  • 在不同的运营商的蜂窝networking(Verizon)上运行该应用程序,并完美运行。 所以这个问题不是蜂窝本身(或iOS),而是AT&T的蜂窝networking(纽约州和新泽西州都失败了)

  • 从http切换到https,现在它在AT&T上完美并发地工作

  • 调查了networking端点以确定其function,结果相当差(稍后)。 我尝试了一个具有更多function的不同Web端点,原来的问题使用了http。

我从中学到如下:

  • 使用iOS5.1或iOS6没有区别

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

  • 如果端点正在使用HTTP1.0并且不支持“连接:保持活动”,那么每个http请求都将build立并拆除TCP连接。 我相信蜂窝networking的这种“颠簸”是为什么AT&T断开了我的一些会话,但当然无法确定这一点。

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

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

  • 有一个WWDC 2012video,讨论如何提高networking性能:会议706“networking最佳实践”

编辑

所以,当我剥洋葱时,这变得更奇怪了! 经过进一步的讨论,一些networking人员使用CloudFront进行了testing,并确实接受了“连接:保持活跃”。 我一遍又一遍地试着让它在昨天工作,但不能。

networking专家build议我尝试使用https和低时,它看到了! 出于某种原因,在AT&T 3G上使用“http”时,该标题标记将被删除或忽略。 我也用Wifitesting了我的应用程序。 在所有情况下,除AT&T / 3G之外,“连接”都是在响应中返回的。