我的应用程序似乎在蜂窝网络上运行得非常糟糕——用户界面通常有微调器而不是图像,但并非总是如此。它使用由并发 NSOperations 驱动的 NSURLConnections。它在 WIFI 上运行良好 - 完全没有问题。
我发现我收到很多 NSURLConnection 超时,但不知道为什么。我怎样才能找到这个问题?
我的应用程序似乎在蜂窝网络上运行得非常糟糕——用户界面通常有微调器而不是图像,但并非总是如此。它使用由并发 NSOperations 驱动的 NSURLConnections。它在 WIFI 上运行良好 - 完全没有问题。
我发现我收到很多 NSURLConnection 超时,但不知道为什么。我怎样才能找到这个问题?
为了追查这个问题,我首先测量了最大并发连接数,发现它始终在 55 左右。
将最大值减少到 10(通过设置操作队列最大值,减少超时,但仍然不完美
将最大值减少到 4 - 甚至更少的超时,但仍然有一些
将最大值设置为 1 - 这必须工作,对吧?没有!
有时应用程序可以在完全没有并发的情况下正常工作(最大值 == 1),但它仍然有一半的时间失败。
所以我烧毁了苹果的支持事件,并让其中一位最有经验的工程师提供建议。根据他的建议,我尝试了以下方法:
在不同运营商的蜂窝网络 (Verizon) 上运行该应用程序,并且运行良好。所以问题不是蜂窝本身(或 iOS),而是 AT&T 的蜂窝网络(纽约和新泽西都失败了)
从 http 切换到 https,现在它可以在 AT&T 上完美运行,完全并发
调查了 Web 端点以确定它的功能,结果证明它很差(稍后会详细介绍)。我尝试了一个具有更多功能的不同 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 视频讨论如何提高网络性能:Session 706 "Networking Best Practices"
编辑
所以当我剥洋葱的时候,这变得更加奇怪了!经过进一步讨论,一些网络人用 CloudFront 做了一个测试,它确实接受了 'Connection: keep-alive'。我昨天一遍又一遍地尝试让它工作,但不能。
网络专家建议我在使用 https 和 low 时尝试一下,结果确实如此!出于某种原因,在 AT&T 3G 上使用“http”时,该标头标签要么被删除,要么被忽略。我也用 Wifi 测试了我的应用程序。在除 AT&T/3G 之外的所有情况下,响应中都返回了“连接”。