Подтвердить что ты не робот

NSURLErrorDomain Code = -1004 в течение нескольких секунд после запуска приложения

Я получаю ошибку "NSURLErrorDomain Code = -1004" с вызовами API Alamofire, но только в течение нескольких секунд после запуска приложения (или немного отдохнул в течение нескольких минут, пока приложение открылось и совершило вызов после этого)

Если я попытаюсь сделать тот же самый вызов через несколько секунд, все будет хорошо. Я просмотрел все вопросы о переполнении стека и проверил все возможные причины ниже:

  • Нет проблем с подключением к Интернету.
  • "Параметры безопасности в приложении для транспорта" являются правильными, а сервер использует 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 и журнал ошибок, и там вообще нет журнала для неудачных вызовов.

4b9b3361

Ответ 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.

Ответ 2

Nginx 1.11.0 Mainline теперь доступен с исправлением, упомянутым ранее в этом разделе;

Изменить: HTTP/2 клиенты могут теперь начать отправку тела запроса        немедленно; директива "http2_body_preread_size" контролирует размер        буфер, используемый до того, как nginx начнет читать тело запроса клиента.

Я тестировал его, и для меня этот релиз теперь корректно работает.

Ответ 3

Это похоже на подтвержденную ошибку в 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.

Ответ 4

Я также могу подтвердить, что nginx 1.9.15 работает неправильно. Некоторые звонки всегда получали "Не удалось подключиться к серверу", а после возврата к nginx 1.9.12 все работает нормально.

Ответ 5

Вот шаги, которые я попытаюсь выполнить:

  • 1) проверить мое приложение на тренажере и устройстве
  • 2) посмотрите, требуется ли https вместо http
  • 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....)

  • 4) с жесткой ссылкой, например http://www.google.com, если то же самое ничего не произошло вокруг вашего быстрого кода, неверно, попробуйте установите параметры веб-сервера..

Ответ 6

Проблема решена!!!

версии:

1. Nginx version: 1.10.2
2. IOS version: 9.3.2

Когда config такой:

listen 443 ssl; 

У вас такая же проблема, как и вы.

Но!!!

Когда config такой:

listen 443 ssl http2;

Проблема решена!