NSURLErrorDomain Code=-1004 应用程序启动后几秒钟

NSURLErrorDomain Code=-1004 for few seconds after app start up

Alamofire API 调用出现 "NSURLErrorDomain Code=-1004" 错误, 但仅在应用程序启动后几秒钟(或在应用程序打开后休息几分钟,然后再拨打电话)

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

  1. 互联网连接没有问题
  2. "App Transport Security Settings" 是正确的并且服务器使用 https(我也尝试了 "NSAllowsArbitraryLoads=true" 但没有帮助)
  3. API 工作正常

我的直觉是获取网络设置需要几秒钟,当我在此之前进行 API 调用时,它会立即失败。或者..我在后台使用可能相关的 Websocket?

FAILURE: Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." 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=Could not connect to the server.}

有什么建议吗?

已更新

发现应用程序在启动时发出 4 个请求,其中 1 或 2 个随机失败,我检查了 Nginx 访问和错误日​​志,根本没有失败调用的日志。

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

  • 1) 在模拟器和设备中测试我的应用程序
  • 2) 查看是否真的需要 https 而不是 http
  • 3) 配置一个 alamofire 管理器并更改超时时间(对于这一步我 写一些代码):

    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) 用硬 link 测试 http://www.google.com,如果相同的话 什么都没发生 你的 swift 代码不正确,尝试 设置您的网络服务器参数..

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

问题在 HTTP/1.1 中消失了,它也适用于 HTTP/2 Nginx 版本高达 1.9.14。

这似乎是 nginx 1.10 中已确认的错误。关于它的问题可以在 https://trac.nginx.org/nginx/ticket/979. The actual issue can be found at https://trac.nginx.org/nginx/ticket/959

的 nginx 错误跟踪器上找到

您可能要考虑切换到 1.9 分支,该分支有可用的版本。希望nginx快点发布没有这个bug的1.10.1版本。

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

我还可以确认 nginx 1.9.15 无法正常工作。有些电话总是收到 "Could not connect to the server",恢复到 nginx 1.9.12 后一切正常。

Nginx 1.11.0 Mainline 现已可用,包含本主题前面提到的修复程序;

Change: HTTP/2 clients can now start sending request body immediately; the "http2_body_preread_size" directive controls size of the buffer used before nginx will start reading client request body.

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

问题已解决!!!

版本:

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

当这样的配置时:

listen 443 ssl; 

和你一样的问题

但是!!!

当这样的配置时:

listen 443 ssl http2;

问题已解决!!