Ответ 1
Мы имеем ту же проблему с 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.
Я получаю ошибку "NSURLErrorDomain Code = -1004" с вызовами API Alamofire, но только в течение нескольких секунд после запуска приложения (или немного отдохнул в течение нескольких минут, пока приложение открылось и совершило вызов после этого)
Если я попытаюсь сделать тот же самый вызов через несколько секунд, все будет хорошо. Я просмотрел все вопросы о переполнении стека и проверил все возможные причины ниже:
У меня возникает ощущение, что для получения сетевых настроек требуется несколько секунд, и когда я делаю вызов 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, а также работает с HTTP/2 в версии Nginx до 1.9.14.
Nginx 1.11.0 Mainline теперь доступен с исправлением, упомянутым ранее в этом разделе;
Изменить: HTTP/2 клиенты могут теперь начать отправку тела запроса немедленно; директива "http2_body_preread_size" контролирует размер буфер, используемый до того, как nginx начнет читать тело запроса клиента.
Я тестировал его, и для меня этот релиз теперь корректно работает.
Это похоже на подтвержденную ошибку в nginx 1.10. Вопрос об этом можно найти на трекере ошибок nginx по адресу https://trac.nginx.org/nginx/ticket/979. Актуальную проблему можно найти на https://trac.nginx.org/nginx/ticket/959
Возможно, вы захотите перейти на ветку 1.9, в которой есть выпуски, которые работают. Надеюсь, nginx скоро выпустит версию 1.10.1, у которой нет этой ошибки.
Проблема действительно возникает только в iOS; Android, Windows и OSX, похоже, не имеют проблем с ведением переговоров по действительному соединению http2.
Я также могу подтвердить, что nginx 1.9.15 работает неправильно. Некоторые звонки всегда получали "Не удалось подключиться к серверу", а после возврата к nginx 1.9.12 все работает нормально.
Вот шаги, которые я попытаюсь выполнить:
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....
)
Проблема решена!!!
версии:
1. Nginx version: 1.10.2
2. IOS version: 9.3.2
Когда config такой:
listen 443 ssl;
У вас такая же проблема, как и вы.
Но!!!
Когда config такой:
listen 443 ssl http2;
Проблема решена!