用户注意到我们的应用程序中出现了几个“网络错误”,整个事情开始.错误似乎是随机发生的,没有任何与互联网连接,iOS版本或后端更新相关的明显模式.幕后发生的两个错误是:
错误域= NSURLErrorDomain代码= -1001“请求超时.”
更频繁地:
错误域= kcfErrorDomainCFNetwork代码= -1005“网络连接丢失.
调试了几天之后,我已经设法重现了这些错误(随机发生).在随机睡眠定时器(每个请求之间设置1-20秒),随机(GET和POST)请求向后端发送.然而,它只发生在时期.过去几天我遇到的是,当一个“错误时期”开始时,我每次运行代码一次或两次就会收到两个错误之一(意味着错误率为1/10或1/20请求).该错误率持续了几个小时,然后错误消失了几个小时,然后它全部开始.
关于设置的一些快速事实:
>在设备和模拟器上发生
>在iOS 8.4和iOS 7.1发生 – 虽然v.8.4是我用于测试的主要.
>我们使用NSURLSession作为我们的网络请求.我们还包括AFNetworking(更新到最新版本),但是我们只使用安全部分进行SSL固定.即使SSL固定完全关闭,仍然会出现错误.
在过去几天我已经写下的一些发现:
>似乎只有在我们的生产环境中才会有一些不同的配置作为我们的分级环境.这导致我认为它可能与here和here中讨论的活着的bug相关.但是,我们的操作部门已经建立了一个新的分段环境,发送与生产环境相同的保持活动头,但是这并不在分段环境中发生错误.
>我们的Android版本的应用程序无法使用相同的请求设置来重现错误.此外,我们还没有收到任何客户关于Android应用中的“网络错误”问题.
我的直觉感觉说它与iOS中的服务器环境和HTTP实现有关.然而,我无法追溯到证明什么的令人信服的模式.我使用一个简单的Rails脚本进行了相同的设置,当下一个“错误期”发生时,我将准备尝试在iOS版本之外进行复制.发生这种情况时,我会更新问题.
我不是在寻找有关重置WiFi设置,关闭模拟器或类似的解决方案,因为我不认为这是生产环境中可行的解决方案.我也考虑过在GitHub问题中提到的重试循环修复,但我认为这是最后的手段.
如果您需要更多信息,请通知我.
解决方法
想到的另一个可能性就是质量差的NAT实现,在这种不太可能的情况下,您的服务器的超时时间足以使NAT放弃TCP连接.
无论哪种方式,确定发生什么的唯一方法是采取数据包跟踪.为此,通过有线连接将Mac连接到互联网,通过Wi-Fi启用网络共享,并将iOS设备连接到该Wi-Fi网络.然后运行Wireshark并告诉它监视桥接口.说明:
http://www.howtogeek.com/104278/how-to-use-wireshark-to-capture-filter-and-inspect-packets/
从那里你应该可以看到正在发送什么和什么时候.这可能需要很长的路才能理解为什么会失败.