2015-07-20 2 views
11

У меня возникла странная проблема, когда я использую свой API из своего приложения. Иногда, без всякой причины, то запрос просто не передается, и он не в конце тайм-аут со следующей ошибкой:Запрос не отправлен

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." 

Я пробовал много API, такие как NSURLConnection делегатов, NSURLSession и NSURLConnection.sendSynchronousRequest без успех.

Вот пример проекта, который я сделал, чтобы выделить проблему. ConnectionBugApp

Вот шаги для воспроизведения:

  • Запустите приложение в Xcode и остановить отладку просто так, что приложение на телефоне
  • Откройте приложение, нажмите кнопку Test Connection (это удается, загрузки колеса прекращается прялка сразу же)
  • Перейти в другие приложения, такие как facebook/twitter/сетевые игры (несколько немного тяжелые) и несколько раз переключиться на режим самолета
  • Вернитесь к моему приложению и нажмите «Проверить соединение» (загрузочное колесо никогда не останавливается)

Несколько деталей, которые могли бы помочь:

  • Если я использую мой IP сервера вместо моего доменного имени, она преуспевает

  • Проблема возникает только тогда, когда в сети LTE/4G

Любые идеи или обходные пути были бы очень признательны! Не стесняйтесь спрашивать подробности.

Благодаря

EDIT

Я отредактированные описании много, так как я первый отправил его (в надежде сделать его чище и чище), я прошу прощения, если некоторые ответы или комментарии Дон» Это действительно имеет смысл.

+0

Если вы используете API NSURLSession, воспроизводится ли проблема? –

+0

@LeoNatan, да, у меня такая же проблема с 'NSURLSession' – streem

+0

Что вы видите на стороне сервера? Вы видите, что сервер принимает клиентское соединение или даже не достигает сервера? Я бы сказал, что это похоже на сервер, вы отбрасываете соединение. Возможно, брандмауэр. –

ответ

2

Как упоминалось в комментариях, у меня была включена DNSSEC (защита от отравления кешем) на моем хостинговом сервисе.

Отключить его, устранить проблему, даже если это может быть не очень приятное решение. После нескольких недель поиска, это будет достаточно хорошо.

Я дам щедрость кому-то, кто может это объяснить, или кто может обеспечить лучшее решение.

+0

«Пакеты DNSSEC могут быть лишены, потому что размер ответа слишком велик». Проверьте ссылку http://www.cisco.com/web/about/security/intelligence/dnssec.html Это может быть причиной. – Karlos

0

Используйте следующий код для подключения. Это вам поможет.

 let urlData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error) 

      if error != nil || urlData!.length == 0 
      { 
       println("Error happend timeout======\(error?.code)!") 

       continue 
      } 
      else //else1 
      {if let httpResponse = response as? NSHTTPURLResponse 
       { 
        println("Status Code for successful---\(httpResponse.statusCode)") 

        // For example 502 is for Bad Gateway 
        if (httpResponse.statusCode == 502) 
        { 
         // Check the response code from your server and break 
         break 
        } 
        else 
        { 

         //Your code 
        } 
      } 
    } 

Вы можете получить список кодов состояния HTTPS в следующей ссылке StatusCode

+0

Спасибо за ваш ответ. Я не уверен, по какой причине вы опубликовали этот код и, к сожалению, у меня такая же проблема. – streem

+0

Я попытался подключиться ConnectionBugApp к соединению LTE/4G, и он отлично работает для URL-адресов «https://tripaff.com/» и «https://meetsam.co/». Я получил ошибку 503 для «http://ip.jsontest.com/» Url. – Karlos

+0

Хм, вы пробовали использовать интенсивную сеть в других приложениях? Вы также можете попробовать забыть о приложении в течение нескольких часов и просто нажать кнопку Try Connection еще раз позже. – streem

2

я пришел через этот вопрос при использовании асинхронного запроса. Кажется, что iOS ограничивает количество открытых подключений к одному домену, так что все последующие соединения терпят неудачу, как вы описали.

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

Решение состоит в том, чтобы ограничить количество открытых подключений к одному домену, чтобы это не происходило.

Ответ отправлен karlos работает, потому что синхронизация соединения блокирует другие функции от открывания.

+0

Спасибо за ваш ответ, предложение Карлоса не работает. Если я могу добавить также, у меня есть заголовок 'Connection: close' в каждом ответе, и я считаю, что я использую другие приложения, которые не делают запрос. Как если бы ОС поставила мое приложение и его соединение в фоновом режиме и забыла его разбудить. – streem

+0

Вы пытались добавить тайм-аут для запроса https? – Karlos

+0

Вы имеете в виду, когда я инициирую свой запрос? да, он имеет тайм-аут 120 с. – streem

1

В вашем коде ваш запрос принимает тайм-аут по умолчанию 60 секунд, но вы можете изменить время запроса в своем коде, как показано ниже.

в вашем NetworkItem класс изменение тайм-аут.

init(request:NSMutableURLRequest){ 
    self.request = request 
    self.request.timeoutInterval = 120 
    super.init() 
} 
+0

Спасибо за ваш ответ, но это не проблема длительности таймаута. Когда он терпит неудачу, он всегда терпит неудачу в конце таймаута независимо от продолжительности. – streem

Смежные вопросы