应用启动后几秒内NSURLErrorDomain Code = -1004

时间:2016-04-28 07:14:04

标签: ios ios9 afnetworking alamofire

我在Alamofire API调用时收到“NSURLErrorDomain Code = -1004”错误, 但仅在应用程序启动后的几秒钟(或在应用程序打开后休息几分钟并在此之后拨打电话)

如果我在几秒钟后尝试拨打同一个电话,一切正常。 我搜索了所有Stack Overflow问题并检查了以下所有可能的原因:

  1. 互联网连接没问题
  2. “应用传输安全设置”是正确的,服务器使用https(我也试过“NSAllowsArbitraryLoads = true”,但没有帮助)
  3. API工作正常
  4. 我的直觉是,获取网络设置需要几秒钟,当我在完成之前进行API调用时,它会立即失败。或者..我在背景中使用的Websocket可能是相关的吗?

      

    FAILURE:Error Domain = NSURLErrorDomain Code = -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访问和错误日​​志,并且根本没有记录失败的调用。

6 个答案:

答案 0 :(得分:17)

我们在Nginx 1.10.0(和1.9.15),iOS 9.3.1使用带有TLS 1.2的HTTP / 2时遇到了同样的问题。

HTTP / 1.1的问题消失了,它也在Nginx版本中使用HTTP / 2,最高可达1.9.14。

答案 1 :(得分:6)

Nginx 1.11.0 Mainline现在可以使用本主题前面提到的修复程序;

  

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

我测试了它,对我来说这个版本现在可以再次正常工作。

答案 2 :(得分:3)

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

找到

您可能需要考虑切换到1.9分支,该分支具有可行的版本。希望nginx很快会发布一个没有这个bug的1.10.1版本。

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

  • 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这样的硬链接进行测试,如果相同的话 没有发生任何关于你的快速代码是不正确的,尝试 设置您的Web服务器参数..

答案 5 :(得分:0)

问题解决了!!!

版本:

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

当配置如下:

listen 443 ssl; 

和你一样有同样的问题。

但是!!!

当配置如下:

listen 443 ssl http2;

问题解决了!!