应用启动后几秒内NSURLErrorDomain Code = -1004
我在Alamofire API调用时出现“NSURLErrorDomain Code = -1004”错误,但仅在应用程序启动后几秒钟 (或者在应用程序打开后rest几分钟并在此之后拨打电话)
如果我在几秒钟后尝试拨打同一个电话,一切正常。 我搜索了所有Stack Overflow问题并检查了以下所有可能的原因:
- 互联网连接没问题
- “应用程序传输安全设置”是正确的,服务器使用https(我也试过“NSAllowsArbitraryLoads = true”,但没有帮助)
- API工作正常
我的直觉是,获取网络设置需要几秒钟,当我在完成之前进行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访问和错误日志,根本没有记录失败的调用。
我们在Nginx 1.10.0(和1.9.15),iOS 9.3.1使用HTTP / 2和TLS 1.2时遇到了同样的问题。
这个问题在HTTP / 1.1中消失了,它也在Nginx版本中使用HTTP / 2,最高可达1.9.14。
Nginx 1.11.0 Mainline现在可以使用本主题前面提到的修复程序;
更改:HTTP / 2客户端现在可以立即开始发送请求正文; “http2_body_preread_size”指令控制在nginx开始读取客户端请求主体之前使用的缓冲区的大小。
我测试了它,对我来说这个版本现在再次正常工作。
这似乎是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上; Android,Windows和OSX本身在协商有效的http2连接时似乎没有问题。
我还可以确认nginx 1.9.15无法正常工作。 有些调用总是“无法连接到服务器”,并在恢复到nginx 1.9.12之后一切正常。
这些是我试图遵循的步骤:
- 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)使用像http://www.google.com这样的硬链接进行测试,如果你的swift代码周围没有发生任何相同的事情是不正确的,请尝试设置你的web服务器参数..
问题解决了!!!
版本:
1. Nginx version: 1.10.2 2. IOS version: 9.3.2
当配置像这样:
listen 443 ssl;
和你一样有同样的问题。
但是!!!
当配置像这样:
listen 443 ssl http2;
问题解决了!!