Тайм-аут фоновой передачи NSURLSession не сработал

Когда я пытаюсь начать базовую передачу NSURLSession, когда сеть находится в автономном режиме (режим полета), с NSURLSessionConfiguration defaultSessionConfiguration и ephemeralSessionConfiguration, я, конечно, сразу же получаю NSError:
Domain = NSURLErrorDomain Code = -1009 "Интернет-соединение отключено."
Но с NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier NSURLSession никогда не возвращается, никакой ответ, никакое время ожидания не срабатывает, он застревает.
Это происходит с iOS 8.x. С iOS 7.x я получил NSError, как и ожидалось.
Почему так? Есть ли способ вернуть ошибку?

1 ответ

В общем, фоновый сеанс NSURLSession не завершает задачу, если что-то идет не так по сети. Скорее, он продолжает искать подходящее время для выполнения запроса и повторных попыток. Это продолжается, пока не истечет время ожидания ресурса (то есть значение свойства timeoutIntervalForResource в объекте NSURLSessionConfiguration, который вы используете для создания сеанса). Текущее значение по умолчанию для этого значения составляет одну неделю! Другими словами, поведение сбоя в течение тайм-аута в iOS7 было неправильным. В контексте фонового сеанса более интересно не сразу потерпеть неудачу из-за проблем с сетью. Таким образом, начиная с iOS8, задача NSURLSession продолжается, даже если она сталкивается с таймаутами и потерей сети. Однако это продолжается до тех пор, пока не будет достигнуто значение timeoutIntervalForResource.

Поэтому timeoutIntervalForRequest не будет работать в фоновом сеансе, а timeoutIntervalForResource будет работать.

Я получил этот ответ от одного из сотрудников Apple на форуме разработчиков. Кроме того, я подтвердил это путем реализации.

Другие вопросы по тегам