Я пытаюсь сохранить приложение iOS в активном состоянии более 10 минут, когда оно входит в фоновое состояние.
Как я могу реализовать это.
Я пытаюсь сохранить приложение iOS в активном состоянии более 10 минут, когда оно входит в фоновое состояние.
Как я могу реализовать это.
См. раздел "Выполнение фона" в iPhoneAppProgrammingGuide. Короче говоря, ваше приложение должно быть одним из следующих типов:
И вы должны добавить в Info.plist следующее: Добавьте ключ UIBackgroundModes к своему Info.plist и установите его значение в массив, содержащий одну или несколько следующих строк:
Обратите внимание, что часть процесса проверки будет проверять, чтобы ваше приложение выполняло то, что, как он говорит, делает в отношении фоновой обработки.
Вот что я сделал, используя beginBackgroundTaskWithExpirationHandler.
NSTimer
с запланированным (не повторяющимся) временем, которое составляет менее 10 минут. Для моей ситуации я использовал 5 минут.NSTimer
запускается, завершите фоновое задание, а затем немедленно вызовите метод, который вы написали ранее, чтобы начать другую фоновую задачу.Это решение на самом деле не идеально и по-прежнему является голодным, но будет делать то, что вы хотите.
Изменить: начиная с iOS7, я предлагаю вам прочитать этот отличный пост.
В фоновом режиме разрешено запускать только определенные типы приложений. См. Раздел "Реализация долгосрочных фоновых задач" это руководство.
Если вы не запрашиваете разрешения на выполнение фоновой обработки, вы можете использовать UIApplication beginBackgroundTaskWithExpirationHandler, но вы не можете получить дополнительное время.
Этот код заставляет ваше приложение iOS работать бесконечно в фоновом режиме. Скопируйте и вставьте приведенные ниже методы в singleton/manager, который обрабатывает задачи, которые вам нужно выполнить в фоновом режиме.
// @interface
// Declare Private property
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
//@end
// ...
// Copy into
//@implementation
- (void)setupBackgrounding {
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appBackgrounding:)
name: UIApplicationDidEnterBackgroundNotification
object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appForegrounding:)
name: UIApplicationWillEnterForegroundNotification
object: nil];
}
- (void)appBackgrounding: (NSNotification *)notification {
[self keepAlive];
}
- (void) keepAlive {
self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
[self keepAlive];
}];
}
- (void)appForegrounding: (NSNotification *)notification {
if (self.backgroundTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
}
}
Вы не можете. Если ваше приложение не использует аудио, voip или gps. Что вы можете сделать, это уведомить пользователя (через локальные уведомления) о том, что время почти дошло и попросить его открыть/закрыть приложение.
Также, если вам просто нужно уведомить пользователя, вы можете использовать push-уведомления.
https://github.com/yarodevuci/backgroundTask Проверьте мой код здесь Я использую аудиоплеер, который воспроизводит пустой wav файл Работает отлично на IOS 8 Использование батареи около 10% в течение 24-часового периода Как использовать:
var backgroundTask = BackgroundTask()
backgroundTask.startBackgroundTask() //Starts playing blank audio file. You can run NSTimer() or whatever you need and it will continue executing in the background.
backgroundTask.stopBackgroundTask() //Stops the task
Предупреждение: Apple откажется от этого, если вы попытаетесь его отправить!
Если ваш тип приложения не относится к VOIP/Audio/Location.... (проверьте Фоновые режимы),
или вы не хотите, чтобы указать ваше приложение в качестве фона приложения, вы можете реализовать beginBackgroundTaskWithName: expirationHandler или beginBackgroundTaskWithExpirationHandler попросить больше времени, чтобы запустить свой процесс в фоновом режиме. Подробное описание здесь
Ожидается, что приложения, перемещающиеся на задний план, будут как можно быстрее погружаться в состояние покоя, чтобы система могла быть приостановлена. Если ваше приложение находится в середине задачи и для выполнения этой задачи требуется немного дополнительного времени, он может вызвать метод beginBackgroundTaskWithName: expirationHandler: или beginBackgroundTaskWithExpirationHandler: метод объекта UIApplication для запроса дополнительного времени выполнения. Вызов любого из этих методов временно приостанавливает приостановку действия вашего приложения, предоставляя ему немного дополнительного времени для завершения работы. По завершении этой работы ваше приложение должно вызвать метод endBackgroundTask:, чтобы система узнала, что она завершена и может быть приостановлена.Каждый вызов метода beginBackgroundTaskWithName: expirationHandler: или beginBackgroundTaskWithExpirationHandler: генерирует уникальный токен для связи с соответствующей задачей. Когда ваше приложение завершает задачу, оно должно вызвать метод endBackgroundTask: с соответствующим токеном, чтобы система узнала, что задача завершена. Невозможность вызвать метод endBackgroundTask: для фоновой задачи приведет к прекращению действия вашего приложения. Если вы предоставили обработчик истечения при запуске задачи, система вызывает этот обработчик и дает вам последний шанс завершить задачу и избежать завершения.