最近几天,我一直在尝试调试d00m的网络错误。我的想法已经用尽了,希望其他SO用户有宝贵的经验可以提供帮助。我希望能够提供所有相关信息,但我个人无法控制服务器环境。
整个问题始于用户注意到我们的应用程序中出现了几个"网络错误"。该错误似乎是随机发生的,与互联网连接、iOS版本或后端更新没有明显的相关模式。两个发生在幕后的错误是:
关于设置的一些快速事实:
- 在设备和模拟器上发生 - 发生在iOS 8.4和iOS 7.1上 - 尽管v.8.4是我用于测试的主要版本。 - 我们使用NSURLSession进行网络请求。我们还包括了AFNetworking(更新到最新版本),但我们仅使用安全部分进行SSL固定。即使完全关闭SSL固定,错误仍会发生。
我在过去几天中写下的一些发现:
如果您需要更多信息,请告诉我。
整个问题始于用户注意到我们的应用程序中出现了几个"网络错误"。该错误似乎是随机发生的,与互联网连接、iOS版本或后端更新没有明显的相关模式。两个发生在幕后的错误是:
Error Domain=NSURLErrorDomain Code=-1001 "请求超时。"
和更频繁的:
Error Domain=kCFErrorDomainCFNetwork Code=-1005 "网络连接丢失。
经过几天的调试,我设法通过向我们的后端发送大约10个随机(GET和POST)请求,并在每个请求之间设置1-20秒的随机睡眠计时器来复制这些错误(随机发生)。然而,它只发生在一段时间内。我最近几天的经历是,当“错误周期”开始时,每次运行代码时我都会得到两种错误中的一种(意味着每10或20个请求中有1个错误率)。这种错误率会持续几个小时,然后错误会消失几个小时,然后重新开始。关于设置的一些快速事实:
- 在设备和模拟器上发生 - 发生在iOS 8.4和iOS 7.1上 - 尽管v.8.4是我用于测试的主要版本。 - 我们使用NSURLSession进行网络请求。我们还包括了AFNetworking(更新到最新版本),但我们仅使用安全部分进行SSL固定。即使完全关闭SSL固定,错误仍会发生。
我在过去几天中写下的一些发现:
- 似乎只发生在我们的生产环境中,该环境与我们的演示环境有一些不同的配置。这使我认为它可能与 这里 和 这里 讨论的
keep-alive
bug 有关。然而,我们的运维部门设置了一个新的演示环境,发送与生产环境相同的keep-alive
头信息,但这并没有在演示环境中出现错误。 - 我们的 Android 应用程序版本使用相同的请求设置无法复现错误。此外,在 Android 应用程序中,我们没有收到任何有关“网络错误”的客户问题。
我的直觉告诉我这与服务器环境和 iOS 中的 HTTP 实现有关。然而,我无法找到一个令人信服的模式来证明任何事情。我已经使用一个简单的 Rails 脚本进行了相同的设置,当下一个“错误周期”发生时,我将准备在 iOS 环境之外尝试复制它。当这发生时,我会更新问题。
我不希望使用重置wifi设置、关闭模拟器或类似的解决方案,因为我认为这在生产环境中不可行。我也考虑过在GitHub问题中提到的重试循环修复,但我认为这是最后的手段。如果您需要更多信息,请告诉我。
NSURLSession
和NSURLSessionDataTask
。 - Steffen D. Sommer