2015-04-13 1 views
2

Мне нужно загрузить длинный список файлов, и поэтому все эти операции могут занять много времени. Я решил управлять этими задачами загрузки с помощью NSURLSession, созданной с использованием конфигурации фона. Как только вы построили и запустили код на моем iPhone, я пытаюсь проверить приложение, отключая устройство и запуская приложение без xCode. В этой ситуации я заметил, что загрузка больше не запускается, если соединение не осуществляется через WiFi. Кроме того, я замечаю, что во время операций загрузки, если устройство переходит в спящий режим, разблокировка его через несколько секунд (10-15 секунд) приложение будет перезаписано, и загрузка будет остановлена. Я не знаю, важно ли это, но я надеюсь, что эти проблемы не существовали в iOS 8.2 (теперь я использую iOS 8.3).background Проблемы с NSURLSession при развертывании ad-hoc при переходе устройства в спящий режим

Моя конфигурация сеанса, как следовать

NSString *sessionIdentifier = @"com.yourappfor.example"; 
NSURLSessionConfiguration *sessionConfiguration; 
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { 
    sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionIdentifier]; 
} else { 
    sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier]; 
} 
[sessionConfiguration setAllowsCellularAccess:YES]; 
[sessionConfiguration setSessionSendsLaunchEvents:YES]; 
[sessionConfiguration setURLCache:nil]; 
[sessionConfiguration setDiscretionary:YES]; 
[sessionConfiguration setTimeoutIntervalForRequest:90.0]; 
[sessionConfiguration setTimeoutIntervalForResource:43200.0]; 
[sessionConfiguration setHTTPMaximumConnectionsPerHost:15]; 
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; 
+0

И когда вы говорите, «загрузка остановлена», вы имеете в виду, что они потерпели неудачу с ошибкой, или что они просто не по всей видимости, возобновляя своевременно? Если вы включите питание и подключитесь к Wi-Fi, они возобновляются? – Rob

+0

Нет, ошибка не возвращена. Я снова подключу Wi-Fi, и загрузка возобновится. –

+0

OK. Тогда проблема, скорее всего, является «дискреционной» настройкой. См. Http://stackoverflow.com/a/25653066/1271826. – Rob

ответ

1

Как обсуждалось в других местах (например, см https://stackoverflow.com/a/25653066/1271826) при использовании discretionary может рассмотреть состояние WiFi, прежде чем начать запросы. Поскольку документация discretionary говорит:

При передаче больших объемов данных, рекомендуется установить значение этого свойства [т.е. discretionary] для YES. Это позволяет системе планировать эти передачи в разы, которые являются более оптимальными для устройства. Например, система может задерживать перенос больших файлов до тех пор, пока устройство не будет подключено и не подключено к сети через Wi-Fi. Значением по умолчанию этого свойства является NO.

Я подтвердил это эмпирический:

  • Я выключил Wi-Fi, начал discretionary фонового сеанс, подключил в моем устройстве, и оставил его в течение ночи, и когда я встал утром, мой запросы еще не были выполнены. Только когда я включил Wi-Fi, они продолжали (и, казалось, делали это очень быстро).

  • Я повторил это упражнение следующей ночью, на этот раз с выключенным discretionary. На этот раз запросы были выполнены, хотя и не сразу. Они были закончены примерно через 10 минут (как в сторону, они, вероятно, заняли бы менее минуты или около того, если бы выполнялись нормально, поэтому фоновое соединение сотовой связи было значительно медленнее).

Нижняя линия, discretionary рассмотрит статус WiFi при выполнении запросов, но с discretionary выключен, запросы будут выполняться на фоне сессий без Wi-Fi, хотя и не очень быстро.


Следует отметить, что это относится только к задачам, которые вы запускаете, когда приложение находится на переднем плане. Поскольку документация discretionary продолжает говорить:

Объект сеанса применяется значение этого [т.е. discretionary] собственности только к передачам, что ваше приложение начинается в то время как он находится на переднем плане. Для начала передачи, когда ваше приложение находится в фоновом режиме, система всегда начинает передачу по своему усмотрению - другими словами, система предполагает, что это свойство равно YES и игнорирует любое значение, указанное вами.

+0

Спасибо @Rob. Но если задача запускается, когда приложение находится в фоновом режиме, свойство 'discreionary' игнорируется, и iOS будет рассматривать его как ДА, правильно? Итак, по вашему мнению, если я разрешу дискреционному доступу к НЕТ, загрузки будут выполняться «немедленно» и без подключения к WiFi, и когда приложение войдет в фоновом режиме, они будут выполняться только в том случае, если WiFi доступен, а иногда и в будущем? –

+0

Приложение использует 'discreionary', если приложение было запущено в фоновом режиме, когда вы _start_ соединение (т. Е. Инициировано во время фоновой выборки или молчания push-уведомления). Но если вы запустили его с переднего плана с «дискреционным», он почитает «дискреционный», даже если приложение входит в фон (или в конечном итоге заканчивается из-за давления памяти). – Rob

+0

Извините, Роб, мой английский не идеален. Я пытаюсь сказать, что если у меня есть длинный список файлов для загрузки, и все эти файлы загружаются один за другим, что происходит? Фактически, первые файлы запускают свои загрузки, когда приложение находится на переднем плане ('discretionary' == NO), но последние запускают свои операции, а приложение вводится в фоновом режиме. –

0

10-15 секундное время ожидания может быть от блокировки устройства, а затем возможность защиты данных Apple, взятая под контроль.

См https://stackoverflow.com/a/25789737/4875987

+0

Пожалуйста, не только укажите ссылку на другой ответ. Пожалуйста, добавьте хотя бы краткое резюме (например, решение проблемы OP, если таковое имеется) ответа на ваш ответ, потому что, если другой ответ будет удален, ваш ответ станет менее полезным. – honk

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