NSURLErrorDomain代码= -1004几秒钟后,应用程序启动

问题描述:

我得到“NSURLErrorDomain代码= -1004”与Alamofire API调用, 但只有几秒钟错误后应用程序启动(或拍了休息几分钟,而应用程序的打开,然后拨打电话)NSURLErrorDomain代码= -1004几秒钟后,应用程序启动

如果我尝试几秒钟后进行相同的调用,一切工作正常。 我找遍了所有的堆栈溢出的问题,并检查以下所有可能的原因:

  1. 与Internet连接没有问题
  2. “应用交通运输安全设置”是正确的,服务器的使用HTTPS(我也试过“NSAllowsArbitraryLoads =真“但这并没有帮助)
  3. API的工作正常

我的直觉是,让网络设置需要几秒钟,当我提出一个API调用的完成之前,它只是立即失败。或..我在背景中使用WebSocket可能是相关的?

FAILURE:错误域= NSURLErrorDomain代码= -1004“无法连接到服务器。” UserInfo = {NSUnderlyingError = 0x137d39380 {Error Domain = kCFErrorDomainCFNetwork Code = -1004“(null)”UserInfo = {NSErrorPeerAddressKey = {length = 16,capacity = 16,bytes = 0x100201bb341a9f540000000000000000},_kCFStreamErrorCodeKey = -2200,_kCFStreamErrorDomainKey = 4} NSErrorFailingURLStringKey = [FILTERED],NSErrorFailingURLKey = [FILTERED],_kCFStreamErrorDomainKey = 4,_kCFStreamErrorCodeKey = -2200,NSLocalizedDescription =无法连接到服务器。}

任何建议?

修订

研究发现,应用程序,使得在启动4个请求,以及1或2其中随机失败,我检查Nginx的访问和错误日​​志,有没有日志失败的电话都没有。

+0

我有这个确切的问题,因为我将我的网络库从AFNetworking 2.x升级到3.x.如果您想出解决方案,请告诉我。到目前为止,我还确认了SSL协商正在发生,这表明“无法连接到服务器”并不是真正的原因。我也尝试关闭ATS和证书锁定。所有事情在一分钟或两分钟后开始工作,但前几个请求失败。 –

+0

有没有人最终发现了什么错误?我有同样的问题... :( –

+1

@BartoszHernas,你运行的是什么版本的nginx?我们在这里与nginx 1.10,iOS 9.3.1使用HTTP/2和TLS 1.2相同的问题。 /1.1。我们可以在Wireshark看到应用只连接一次,这是成功的,但第一个请求失败。 –

在这里,我们有同样的问题与Nginx的1.10.0(和15年9月1日),的iOS 9.3.1使用HTTP/2 TLS 1.2。

问题消失与HTTP/1.1和它也与HTTP/2工作在Nginx的版本长达14年1月9日。

+1

我在生产中使用nginx/1.9.12,在分段上使用nginx/1.9.15。 我可以证实你在说什么,你有什么想法为什么会发生? 你是否为nginx开了个问题? –

+0

是的,它被标记为这个问题的重复:https://trac.nginx.org/nginx/ticket/959 –

+2

哦,太棒了感谢这个信息!我花了2天时间找到解决方案。我已经尝试了很多App Transport Security设置,http libs和其他。 –

这些是我想尝试遵循的步骤:

  • 1)测试我的应用程序在模拟器和设备
  • 2)看,如果HTTPS是真正需要的,而不是http
  • 3 )配置alamofire经理和变化超时(此步骤i 写一些代码):

    var alamofireManager = Alamofire.Manager.sharedInstance  
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    configuration.HTTPMaximumConnectionsPerHost = 10 
    configuration.timeoutIntervalForRequest = 30 
    configuration.timeoutIntervalForResource = 30 
    alamofireManager.delegate.taskWillPerformHTTPRedirection = nil 
    

(所以白衣这最后一步,接下来的alamofire呼叫可以是例如:alamofireManager.request(etc....

  • 4)测试与像http://www.google.com硬链接,如果同样的事情 不要发生在你的SWIFT代码没有什么是不正确的,尝试到 设置网络服务器参数..
+0

1.测试两个模拟器和几台设备,并且结果是真正需要同 –

+0

2. HTTPS,3试过了,没有解决 –

+1

4.尝试使用硬链接“https://google.com”,但没有发生。也许Nginx或网络服务器存在一些问题。我会看看。感谢您的回答 –

这似乎是nginx 1.10中的一个确认错误。关于它的一个问题可以在nginx的bug跟踪器https://trac.nginx.org/nginx/ticket/979上找到。实际的问题,可以在https://trac.nginx.org/nginx/ticket/959

找到你可能要考虑切换到1.9分支具有释放该做的工作。希望nginx能很快发布1.10.1版本,它没有这个bug。

这个问题实际上只发生在iOS上; Android,Windows和OSX本身在协商有效的http2连接时似乎没有问题。

+0

有没有解决这个问题的方法?或者我应该恢复到nginx 1.9.14? –

+0

恢复回来会有所帮助。然而,这不是稳定的分支。恢复到1.8.1会让你再次访问spdy。苹果确实标记了现在已确认的错误 –

我也可以确认nginx 1.9.15不能正常工作。一些调用总是得到“无法连接到服务器”,并在恢复到nginx 1.9.12后,一切正常。

+0

我也在1.9.15中也有同样的问题 –

Nginx的1.11.0主线与修复中包括本主题前面提到现在可用;

更改:HTTP/2客户端现在可以立即开始发送请求主体 ; “http2_body_preread_size”指令控制 的大小,在nginx开始读取客户端请求主体之前使用的缓冲区。

我测试了它和我这个版本现在又正确地工作。

问题解决了!

版本:

1. Nginx version: 1.10.2 
2. IOS version: 9.3.2 

当这样的配置:

listen 443 ssl; 

有像你一样的问题。

但是!!!

当这样的配置:

listen 443 ssl http2; 

问题解决了!