Как долго Apple разрешает запуск фоновой задачи?
Я должен загрузить массив файлов изображений в базу данных, поэтому я наткнулся на справочное руководство Apple по выполнению, чтобы убедиться, что приложение все еще загружает данные, когда пользователь приостанавливает или завершает работу моего приложения.
Но в описании говорится giving it a little extra time to finish its work
если мы позвоним beginBackgroundTaskWithName:expirationHandler:
или же beginBackgroundTaskWithExpirationHandler:
запустить фоновое задание.
Как долго little extra time
точно?
4 ответа
Поправьте меня, если я ошибаюсь, но я наткнулся на отличную статью от 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
Посетители, ответ выше должен быть достаточным. Для более подробной информации, пожалуйста, обратитесь к статье выше.
Количество времени будет различаться в зависимости от множества различных переменных, но значение можно проверить, ссылаясь на свойство backgroundTimeRemaining в UIApplication:
NSLog(@"Time Remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);
Если вы хотите загрузить свои файлы, когда приложение находится в фоновом режиме, вы должны использовать фоновый сервис 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/
Теоретически, у вас есть 5 секунд, чтобы закрыть задачи, которые вы хотите сделать в фоновом режиме, если вы не сделаете это, ваше приложение может быть убито.
После этого вы можете вызвать 'beginBackgroundTaskWithExpirationHandler ', и вы должны быть готовы на тот случай, если "небольшого дополнительного времени", которое дает Apple, недостаточно для выполнения задач, которые вам нужно выполнить.
РЕДАКТИРОВАТЬ:
Когда приложение 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 секунд, поэтому ваше приложение должно быть готово ко всему!
Это не исправлено: в 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 мин