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

标签 ios nsurlconnection 3g

我的应用程序似乎在蜂窝网络上运行得非常糟糕 - 用户界面通常有微调器而不是图像,但并非总是如此。它使用由并发 NSOperations 驱动的 NSURLConnections。它在 WIFI 上运行良好 - 完全没有问题。

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

最佳答案

为了排查问题,我先测量了最大并发连接数,发现一直在55左右。

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

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

  • 将最大值设置为 1 - 这一定行得通,对吧?不!

有时应用程序可以在没有并发的情况下正常工作(最大 == 1),但它仍然有一半的时间失败。

因此,我解决了 Apple 的支持事件,并请来了其中一位最有经验的工程师来提供建议。根据他的建议,我尝试了以下方法:

  • 在不同运营商的蜂窝网络 (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 断开我的一些 session 的原因,但当然无法确定这一点。

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

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

  • 有一个 WWDC 2012 视频讨论了如何提高网络性能:第 706 节“网络最佳实践”

编辑

所以当我剥洋葱时,这变得更奇怪了!经过进一步的讨论,一些网络人用 CloudFront 做了一个测试,它确实接受了 'Connection: keep-alive'。昨天我一遍又一遍地尝试让它工作,但没有成功。

网络专家建议我在使用 https 和 low 时尝试一下,结果确实如此!出于某种原因,当通过 AT&T 3G 使用“http”时,该 header 标签将被删除或忽略。我也用 Wifi 测试了我的应用程序。在除 AT&T/3G 之外的所有情况下,都会在响应中返回“连接”。

关于ios - 为什么在通过蜂窝网络下载图像时总是出现 NSURLConnection 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12726727/

相关文章:

ios - Swift 将 json 解析为 Table View

iOS-包括不同显示尺寸的不同图像尺寸

ios - 如何在 objective-c 中逐行解析JSON文件

iphone - 如何使用恢复选项从互联网下载数据..?

android - 智能手机是否可以通过 3G/4G 进行点对点通信?

ios - 我们如何将按钮标题标签设置在 x 轴和 y 轴的中心

ios - NSURLConnection的奇怪错误代码4294966295

iphone - 连接到 Windows Live Messenger 网络时出现不可能的问题

linux - 具有3G/4G加密狗的Raspberry Pi的连接问题

gsm - 使用 AT 命令通过 GSM 模块中的 UART 传输音频和 3G 数据