【发布时间】:2015-12-06 17:23:08
【问题描述】:
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。
这一切始于用户注意到我们应用中的几个“网络错误”。该错误似乎是随机发生的,没有任何与互联网连接、iOS 版本或后端更新相关的明显模式。幕后发生的两个错误是:
Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."
更频繁:
Error Domain=kCFErrorDomainCFNetwork Code=-1005 "The network connection was lost.
在调试了几天之后,我设法通过触发大约.向我们的后端发送 10 个随机(GET 和 POST)请求,每个请求之间有一个随机睡眠计时器(设置为 1-20 秒)。但是,它只发生在周期中。我最近几天经历的是,当“错误期”开始时,我每隔一两次运行代码就会遇到两个错误之一(意味着错误率为 1/10 或 1/20 的请求)。这种错误率会持续几个小时,然后错误会消失几个小时,然后重新开始。
关于设置的一些小知识:
- 发生在设备和模拟器上
- 在 iOS 8.4 和 iOS 7.1 上发生 - 尽管 v. 8.4 是我用于测试的主要版本。
- 我们使用
NSURLSession处理我们的网络请求。我们还包含 AFNetworking(更新到最新版本),但我们仅将安全部分用于 SSL 固定。即使 SSL 固定完全关闭,错误仍然存在。
我在过去几天写下的一些发现:
- 这似乎只发生在我们的生产环境中,它与我们的暂存环境有一些不同的配置。这让我认为它可能与here 和here 讨论的
keep-alive错误有关。但是,我们的运维部门已经设置了一个新的暂存环境,发送与生产环境相同的keep-alive标头,但这并没有使暂存环境发生错误。 - 我们的 Android 版本应用无法使用相同的请求设置重现错误。此外,我们没有收到任何关于 Android 应用中“网络错误”的客户问题。
我的直觉说它与服务器环境和 iOS 中的 HTTP 实现有关。然而,我无法找到一个令人信服的模式来证明任何事情。我已经使用一个简单的 Rails 脚本进行了相同的设置,当下一个“错误期”发生时,我将准备好尝试在 iOS 领域之外重现它。发生这种情况时,我会更新问题。
我不是在寻找涉及重置 wifi 设置、关闭模拟器或类似的解决方案,因为我认为这在生产环境中不是可行的解决方案。我也考虑过进行 GitHub 问题中提到的重试循环修复,但我认为这是最后的手段。
如果您需要更多信息,请告诉我。
【问题讨论】:
-
你在使用 WebSocket 吗?
-
没有基本的
NSURLSession和NSURLSessionDataTask -
嗨,Steffen,你解决了这个问题吗?
-
@NadaGamal 很遗憾没有。
标签: ios networking ios7 ios8 nsurlsession