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

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

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

  1. нет проблем с подключением к интернету
  2. " App Транспорт Настройки безопасности "верны и сервер использует https (я также пробовал "NSAllowsArbitraryLoads=true", но это не помогло)
  3. API работает нормально

мое чувство кишки заключается в том, что получение сетевых настроек занимает несколько секунд, и когда я делаю вызов API, прежде чем это будет сделано, он сразу же терпит неудачу. ИЛИ.. Я использую Websocket в фоновом режиме, который может быть связан?

ошибка: Ошибка домена=Nsurlerrordomain Code=-1004 " не удалось подключиться к сервер."Пользователи={NSUnderlyingError=0x137d39380 {ошибка домен=kCFErrorDomainCFNetwork код=-1004 "(нуль)" пользователи={NSErrorPeerAddressKey={длина = 16, грузоподъемность = 16, число байт = 0x100201bb341a9f540000000000000000}, _kCFStreamErrorCodeKey=-2200, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=[отфильтровано], NSErrorFailingURLKey=[отфильтровано], _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2200, NSLocalizedDescription=не удалось подключиться к серверу.}

любой предложения?

обновлено

обнаружил, что приложение делает 4 запроса при запуске, и 1 или 2 из них случайно терпит неудачу, и я проверил доступ Nginx и журнал ошибок, и нет журнала для неудачных вызовов вообще.

6 ответов


У нас такая же проблема здесь с 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 с исправлением, упомянутым ранее в этом разделе;

Change: клиенты 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 все работает нормально.


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

  • 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, если то же самое не произошло ничего вокруг вашего swift кода неверно, попробуйте задайте параметры веб-сервера..

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

варианты:

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

когда конфигурация такая:

listen 443 ssl; 

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

но !!!

когда конфигурация такая:

listen 443 ssl http2;

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