Запрос не отправлен

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

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

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

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

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

  • Запустите приложение в Xcode и остановите отладку, чтобы приложение было на вашем телефоне.
  • Откройте приложение, нажмите "Проверить соединение" (он преуспевает, загрузка колес останавливается сразу после).
  • Перейдите в другие приложения, такие как facebook/twitter/сетевые игры (некоторые из которых немного тяжелы) и несколько раз переключайтесь в режим самолета
  • Вернитесь к моему приложению и нажмите "Проверить соединение" (загрузочное колесо никогда не останавливается)

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

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

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

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

Спасибо

ИЗМЕНИТЬ

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

в вашем времени изменения класса NetworkItem.

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

Ответ 4

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

      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