NSURLErrorDomain Code=-1004 应用程序启动后几秒钟
NSURLErrorDomain Code=-1004 for few seconds after app start up
Alamofire API 调用出现 "NSURLErrorDomain Code=-1004" 错误,
但仅在应用程序启动后几秒钟(或在应用程序打开后休息几分钟,然后再拨打电话)
如果我在几秒钟后尝试拨打相同的电话,一切正常。
我搜索了所有 Stack Overflow 问题并检查了以下所有可能的原因:
- 互联网连接没有问题
- "App Transport Security Settings" 是正确的并且服务器使用 https(我也尝试了 "NSAllowsArbitraryLoads=true" 但没有帮助)
- 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;
问题已解决!!
Alamofire API 调用出现 "NSURLErrorDomain Code=-1004" 错误, 但仅在应用程序启动后几秒钟(或在应用程序打开后休息几分钟,然后再拨打电话)
如果我在几秒钟后尝试拨打相同的电话,一切正常。 我搜索了所有 Stack Overflow 问题并检查了以下所有可能的原因:
- 互联网连接没有问题
- "App Transport Security Settings" 是正确的并且服务器使用 https(我也尝试了 "NSAllowsArbitraryLoads=true" 但没有帮助)
- 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;
问题已解决!!