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

Dav*_*d H 4 nsurlconnection 3g ios

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

我发现我得到了很多NSURLConnection超时,但不知道为什么.我该如何追踪这个问题?

Dav*_*d H 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并且不支持"Connection:keep-alive",那么每个http请求都会设置并拆除TCP连接.我相信蜂窝网络的"颠簸"是AT&T断开我的一些会话的原因,但当然无法确定这一点.

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

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

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

编辑

因此,当我剥洋葱时,这变得更加离奇!经过进一步讨论,一些网络用户使用CloudFront进行了测试,并确实接受了"连接:保持活着".我昨天一遍又一遍地试着让它上班,但不能.

网络专家建议我在使用https时尝试使用,并且低,看看它确实如此!出于某种原因,当在AT&T 3G上使用"http"时,该标头标签将被删除或忽略.我也用Wifi测试了我的应用程序.在所有情况下,除了AT&T/3G之外,响应中都返回了"连接".