我在Alamofire API调用时收到“NSURLErrorDomain Code = -1004”错误, 但仅在应用程序启动后的几秒钟(或在应用程序打开后休息几分钟并在此之后拨打电话)
如果我在几秒钟后尝试拨打同一个电话,一切正常。 我搜索了所有Stack Overflow问题并检查了以下所有可能的原因:
我的直觉是,获取网络设置需要几秒钟,当我在完成之前进行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访问和错误日志,并且根本没有记录失败的调用。
答案 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)
这些是我尝试遵循的步骤:
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....
)
答案 5 :(得分:0)
问题解决了!!!
版本:
1. Nginx version: 1.10.2
2. IOS version: 9.3.2
当配置如下:
listen 443 ssl;
和你一样有同样的问题。
但是!!!
当配置如下:
listen 443 ssl http2;
问题解决了!!