Как каждый из iOS-фона извлекает типы UIBackgroundFetchResult, обрабатываемые после обработки обработчика завершения?

После того как ваше приложение завершит свои действия во время фоновой выборки, вы должны вызвать блок completHandler с одним из трех состояний UIBackgroundFetchResult: UIBackgroundFetchResultNoData, UIBackgroundFetchResultNewData или UIBackgroundFetchResultFailed.

Как каждый из этих трех результатов обрабатывается ОС после вызова обработчика завершения?

Ответ 1

В Руководстве по программированию приложений для приложений iOS:

Когда вызывается приложение: performFetchWithCompletionHandler: метод вашего делегата, используйте этот метод для проверки нового содержимого и загрузки этого содержимого, если оно доступно. Когда ваши загрузки будут завершены, выполните предоставленный блок обработчика завершения, передав результат, который указывает, доступен ли контент. Выполнение этого блока сообщает системе, что оно может переместить ваше приложение обратно в приостановленное состояние и оценить его использование энергии. Приложения, которые загружают небольшие объемы контента быстро и точно отражают, когда у них есть контент для загрузки, с большей вероятностью получат время выполнения в будущем, чем приложения, которые занимают больше времени, чтобы загрузить их контент.

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

В обоих случаях система пробудит ваше приложение, примет во внимание время начала, ваше приложение начнет загрузку, а затем сообщит системе, что имеется или нет доступный контент.

Через некоторое время вы увидите, что система пробудит первое приложение реже, чем второе, оптимизировав потребление батареи.

Кроме того, если вы используете NSURLSession для начала загрузки, система будет оценивать потребление энергии вашего приложения (поскольку с помощью NSURLSession у вас есть "неограниченное" время для загрузки файлов), даже эта метрика используется для определения того, как часто просыпается ваше приложение.