【发布时间】:2015-05-08 09:48:15
【问题描述】:
我最近一直在努力解决 HTTP 超时问题。经过一个多月的调查,我很确定这是由糟糕的HTTP持久连接引起的。详情如下:
- 这是一个 iOS 应用程序。
- 大多数用户运行的是 iOS 8。
- 我正在使用
NSURLConnection。 - iOS 8 有一个known
keep alivebug,但我的是另一个问题。更具体地说,该错误导致NSURLErrorNetworkConnectionLost,但我的错误是NSURLErrorTimedOut。但是,我不确定我的问题是否是由 iOS 8 的另一个错误引起的。 - 我的问题的表现:使用一段时间后——成功发送了一些HTTP请求并收到了相应的响应——一个请求会导致
NSURLErrorTimedOut,并且所有的following(距离最后一个不会太远)重用持久连接)请求将导致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。
如果您也遇到此问题,请复制我的雷达,或者如果您有更可靠的可重现样本,则最好使用您自己的雷达。
【问题讨论】:
-
你能分享一下设置请求和回调的代码吗?
-
@MarkusSchumann 当然,最普通的代码:github.com/an0/MokeTest/blob/master/MokeTest/ViewController.m。
-
@an0 - 您可以要求服务器工程师关闭 iOS 客户端的 keep-alive 功能并尝试重现问题。只是为了确认我们的方向正确。
-
@Duraiamuthan.H 我的第一个虽然也是将
connection标头设置为close,但不幸的是它是impossible 和NSMutableURLRequest。 -
@Duraiamuthan.H 这不是个人问题。相当多的用户会遇到它。我认为这不是一个糟糕的互联网问题,因为每次只需关闭和打开 Air Mode 即可立即解决。
标签: ios nginx nsurlconnection keep-alive persistent-connection