为什么NSURLConnection会生成此错误,NSPOSIXErrorDomain"取消操作"?

时间:2015-11-18 20:59:37

标签: nsurlconnection ios9 nsurl

在iOS 9中,我使用NSURL和NSURLConnection,对于一个特定的网址,它会在- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error委托方法中产生以下错误。

  

错误域= NSPOSIXErrorDomain代码= 89"操作已取消"   UserInfo = {NSErrorFailingURLStringKey = URL,_kCFStreamErrorDomainKey = 1,   NSErrorPeerAddressKey = {length = 16,   capacity = 16,bytes = 0x100201bb41d733370000000000000000},   _kCFStreamErrorCodeKey = 89,NSErrorFailingURLKey = URL}

请求未被取消,至少不是我们的代码。有什么奇怪的是,这里的错误甚至不是NSURLErrorDomain,它是NSPosixErrorDomain。

该领域的用户报告了一个问题,这是根本原因,但很难确定为什么会发生这种情况。在OS X上使用curl访问此特定URL(使用相同的请求,User-Agent和all),不会产生此错误,响应完全符合预期。但是,即使从iOS Safari浏览器访问此特定URL仍然无法正常工作。可能有一些奇怪的服务器配置,但我不会期望错误如此一般,如取消。

据报道,iOS 8并没有发生这种情况。这个网址并没有什么特别之处,它似乎无法通过我们的堆栈。除了didFailWithError之外,不会发生auth质询或任何类型的委托回调,它会立即发生。其他人在iOS 9中看到过这种行为吗?

更新:似乎产生此错误的特定网址不仅限于我们的应用程序。实际上,只是尝试在iOS 9上的iOS Safari中访问此特定URL会产生相同的错误。我设法在iOS Safari iOS iOS中测试了这个,并且没有重现错误。

2 个答案:

答案 0 :(得分:1)

这可能是ATS问题吗?对于针对iOS 9 SDK链接的应用程序,iOS 9对其将接受的TLS证书类型以及它将允许的TLS协议(例如,不再有SSLv3)使用更严格的规则。此外,它要求所有请求都是HTTPS(而不是HTTP)。

您可以覆盖此行为(如果必须)或修复服务器。

有关详情,请参阅Apple的Info.plist documentation

如果这没有帮助,请尝试按QA 1887中所述启用CFNetwork调试,并查看其吐出的内容。

答案 1 :(得分:0)

只是为这个问题添加一些颜色,我将解释我们的类似情况以及我们如何处理它。

设置:

  • 我们在iOS 9上使用SPDY进行HTTP / 2请求
  • 我们随机收到代码为89的NSPOSIXErrorDomain错误;这是在非常low-level in the OS kernel here
  • 定义的
  • 我们排除了大多数服务器条件和缺乏网络原因

根本原因:

  • 我们发现,如果我们在我们的一个后端路由中引入了一个睡眠,那么iOS会将其表现为这个神秘的POSIX 89内核错误
  • iOS端的超时正好是120秒,这是TCP默认的最大段寿命

我们还尝试了什么:

  • 如果我们将服务器设置为使用HTTPS而不是SPDY(HTTP / 2),则会出现正常的网络连接错误

我们如何“修理”它:

  • 向Apple提交雷达,以便更好地了解为什么HTTPS呼叫正确处理超时但SPDY没有正确处理
  • 假设我们唯一一次看到此错误域/代码组合是在网络超时期间,此时我们应该在某些情况下重试