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

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

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

  1. 互联网连接没问题
  2. “应用程序传输安全设置”是正确的,服务器使用https(我也试过“NSAllowsArbitraryLoads = true”,但没有帮助)
  3. 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; 

问题解决了!!