我最近一直在努力解决HTTP超时问题.经过一个多月的调查,我很确定它是由错误的HTTP持久连接引起的.详情如下:
>这是一个iOS应用程序.
>大多数用户正在运行iOS 8.
>我正在使用NSURLConnection.
> iOS 8有一个known keep alive
bug但我的是另一个问题.更具体地说,该bug导致NSURLErrorNetworkConnectionLost但我的错误是NSURLErrorTimedOut.但是,我不确定我的问题是否是由iOS 8的另一个错误引起的.
>我的问题的行为:经过一段时间的使用 – 在成功发送一些HTTP请求并收到相应的响应后 – 一个请求将导致NSURLErrorTimedOut,以及所有跟随(与最后一个不太远的时间重用持久连接) )请求会导致NSURLErrorTimedOut.
>一些工作解决方法:
>杀死并重新启动应用程序.
>在iPhone上关闭WiFi连接以强制使用3G / 4G.
>打开空气模式然后将其关闭.
>我的分析:从行为来看,问题似乎是由一个糟糕的持久连接引起的.所有后续请求都继续使用此持久连接,因此所有请求都会因NSURLErrorTimedOut而失败.从解决方法中我们可以看到所有这些都有效,因为它们会导致丢弃坏的持久连接并创建新的持久连接.
我的问题:
>还有其他人遇到过这个问题吗?
>这是iOS 8的已知错误吗?
>它是由服务器的一些非常规配置引起的吗?我不控制服务器,但我知道他们使用的是Nginx 1.6.1,他们的工程师正在和我一起调查这个问题.我应该要求他们提供哪些信息?
>有没有办法强制NSURLConnection不重用当前的持久连接,但创建一个新的连接,所以我可以解决这个问题后,我在我的代码中检测到它?
更新:
我通过使用CFNetwork并直接控制Connection头,成功地在iOS 8上缓解了这个问题.然而,在iOS 9上似乎问题变得更糟.
由于我希望Apple能够在iOS 9上修复它,我终于开了一个雷达:http://www.openradar.me/22770738.
如果你也遇到这个问题,请复制我的雷达,或者更好的是,如果你有一个更可靠的可重复样本,你可以发射你自己的雷达.
> Nginx的持久连接超时在服务器上设置为5秒,这不应该是原因.服务器工程师发现这些超时请求实际上是正常接收和响应的.所以它更可能是客户端问题.由于我有一个minimal reproducible code来排除我的代码作为原因,原因应该在iOS中.
>我发现的唯一方法是使用CFNetwork.更高级别的API(如NSURLConnection或NSURLSession的Connection标头)将被系统覆盖.