Как долго Apple разрешает выполнение фоновой задачи?

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

Но в описании он говорит giving it a little extra time to finish its work, если мы вызываем beginBackgroundTaskWithName:expirationHandler: или beginBackgroundTaskWithExpirationHandler: для запуска фоновой задачи.

Как долго little extra time точно?

Ответ 1

Исправьте меня, если я ошибаюсь, но я наткнулся на идеальную статью от Xamarin, в которой обсуждается функция фоновой привязки iOS.

Я просто разбиву на две части: ios pre 7 и ios 7 +:

версия iOS до 7

Ответ просто 600 секунд (10 минут), причина предоставляется статья выше.

версия iOS 7 +

Ответ заключается в том, что система времени выделяет вас оппортунистически. Вы должен будет использовать предложение @Gary Riches

NSLog(@"Time Remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);

чтобы узнать. Причиной того, что он является оппортунистическим, является способ iOS 7+ обрабатывает фоновые задачи совершенно разные, безусловно оптимизированы. к быть точным, оно имеет прерывистое поведение, и поэтому, если вам нужно фоновые задачи, такие как загрузка большого патрона данных, это будет гораздо эффективнее, если вместо этого использовать NSURLSession.

Однако, в моем специальном случае, я загружаю один единственный объект, который содержит один файл, чтобы быть точным. Мне не нужно учитывать NSURLSession для загрузки небольшого количества данных. И, кроме того, он загружает задачу, это может занять столько времени, сколько захочет.: -)

Для этих посетителей TL;DR, ответ выше должен быть достаточным. Для получения дополнительной информации см. Статью выше.

Ответ 2

Количество времени будет отличаться в зависимости от множества разных переменных, но значение можно проверить, ссылаясь на свойство backgroundTimeRemaining на UIApplication:

NSLog(@"Time Remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);

Ответ 3

Если вы хотите загрузить свои файлы, когда приложение находится в фоновом режиме, вы должны использовать фоновый сервис Apple. iOS предоставит вам время прибл. 3 минуты (на основе некоторого опыта) для выполнения вашей задачи, а затем он убьет ваше приложение.

Apple разрешает более длительный запуск приложения в особых случаях. Для этого вам нужно будет использовать UIBackgroundModes в вашем файле info.plist. Для получения дополнительной информации об этих особых случаях см. Таблицу 3-1 в этой ссылке.

РЕДАКТИРОВАТЬ
Вот хорошая статья, в которой описывается время выполнения фоновой задачи и как добиться длительной фоновой задачи в iOS.
https://gooddevbaddev.wordpress.com/2013/10/22/ios-7-running-location-based-apps-in-the-background/

Ответ 4

Теоретически, у вас есть 2/3 минуты, чтобы закрыть задачи, которые вы хотите сделать в фоновом режиме, если вы не сделаете это, ваше приложение может быть убито.

После этого вы можете вызвать метод beginBackgroundTaskWithExpirationHandler и быть готовым на тот случай, если "небольшого дополнительного времени", которое отводит Apple, недостаточно для выполнения задач, которые необходимо выполнить.

EDIT:

Когда приложение iOS переходит в фоновый режим, длительные ли задачи приостанавливаются?:

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

Ваше приложение делегирует applicationDidEnterBackground: метод имеет примерно 5 секунд, чтобы закончить любые задачи и вернуться. На практике, этот метод должен возвращаться как можно быстрее. Если метод делает не вернется до истечения времени, ваше приложение будет убито и очищено от Память. Если вам все еще нужно больше времени для выполнения задач, позвоните в beginBackgroundTaskWithExpirationHandler: метод для запроса фона время выполнения, а затем запустить любые длительные задачи в дополнительном нить. Независимо от того, запускаете ли вы какие-либо фоновые задачи, applicationDidEnterBackground: метод должен завершиться в течение 5 секунд.

От Raywenderlich: "Опять же, нет никаких гарантий, и документация API даже не дает приблизительный номер - так что не полагайтесь на этот номер. Вы можете получить 5 минут или 5 секунд, поэтому ваше приложение должно быть готово ко всему! ':

http://www.raywenderlich.com/29948/backgrounding-for-ios

Сколько времени вы получаете после того, как ваше приложение становится фоновым, определяется iOS. На время предоставления вам нет никаких гарантий, но вы всегда можете проверить свойство backgroundTimeRemaining UIApplication. Это скажет вам, сколько времени у вас осталось. Общий консенсус, основанный на наблюдениях, состоит в том, что обычно вы получаете 10 минут. Опять же, нет никаких гарантий, и документация API даже не дает приблизительный номер - так что не полагайтесь на этот номер. Вы можете получить 5 минут или 5 секунд, поэтому ваше приложение должно быть готово ко всему!

Ответ 5

Это не исправлено: в Xcode 10 и Swift4.1

func applicationDidEnterBackground(_ application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    print(UIApplication.shared.backgroundTimeRemaining)


} 

OP1:166,13057912699878, среднее прибл. 2,7 мин, OP2: 177,4997792619979, среднее прибл. 2,95 мин.