Запустите приложение в течение более 10 минут в фоновом режиме - PullRequest
46 голосов
/ 16 марта 2012

Я пытаюсь держать приложение iOS в активном состоянии более 10 минут, когда оно переходит в фоновое состояние.

Как я могу это реализовать.

Ответы [ 7 ]

56 голосов
/ 16 марта 2012

См. Раздел «Фоновое выполнение» iPhoneAppProgrammingGuide .Короче говоря, ваше приложение должно быть одного из следующих типов:

  • Приложения, которые воспроизводят звуковой контент для пользователя в фоновом режиме, такие как приложение музыкального проигрывателя
  • Приложения, которые удерживают пользователейпостоянно информируется о своем местонахождении, например, приложение для навигации
  • Приложения, поддерживающие протокол голосовой связи через Интернет (VoIP)
  • Приложения для газетных киосков, которым требуется загружать и обрабатывать новый контент
  • Приложения, которые регулярно получают обновления от внешних аксессуаров

И вы должны добавить его в Info.plist следующим образом: Добавьте ключ UIBackgroundModes в файл Info.plist и установите его значение в массив, содержащий один илиследующие строки:

  • audio - приложение воспроизводит звуковой контент для пользователя, находясь в фоновом режиме.(Это содержимое включает потоковое аудио или видео с использованием AirPlay.)
  • местоположение - приложение информирует пользователей об их местоположении, даже когда оно работает в фоновом режиме.
  • voip - приложение предоставляетвозможность пользователю совершать телефонные звонки с использованием подключения к Интернету.
  • newsstand-content - приложение представляет собой приложение Newsstand, которое загружает и обрабатывает журнальный или газетный контент в фоновом режиме.
  • external-accessory—Приложение работает с аппаратным аксессуаром, который должен доставлять обновления на регулярной основе через платформу внешнего аксессуара.
  • bluetooth-central - приложение работает с аксессуаром Bluetooth, который должен доставлять обновления на регулярной основе черезБазовая структура CoreBluetooth

Обратите внимание, что часть процесса проверки будет проверять, чтобы убедиться, что ваше приложение выполняет то, что оно делает в отношении фоновой обработки.

20 голосов
/ 09 декабря 2012

Вот что я сделал, используя beginBackgroundTaskWithExpirationHandler .

  • Напишите метод, который запускает фоновую задачу.
  • Внутри этой фоновой задачи выполните NSTimer с запланированным (не повторяющимся) временем менее 10 минут.Для целей моей ситуации я использовал 5 минут.
  • Как только селектор NStimer сработает, завершите фоновую задачу, а затем немедленно вызовите метод, который вы написали ранее, чтобы запустить другую фоновую задачу.
  • Если вы хотите запланировать запуск методов в определенное время, вам придется проверить их в фоновой задаче.

Это решение на самом деле не идеально и все еще требует много энергии.но будет делать то, что вы хотите.

Редактировать: Начиная с iOS7, я предлагаю вам прочитать этот отличный пост .

2 голосов
/ 16 ноября 2013

Этот код заставляет ваше приложение 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;
    }
}
2 голосов
/ 16 марта 2012

Только определенные типы приложений могут работать в фоновом режиме.См. Раздел «Реализация длительных фоновых задач» этого руководства .

. Если вы не запрашиваете разрешения на фоновую обработку, вы можете использовать beginBackgroundTaskWithExpirationHandler UIApplication, ноВы не можете получить дополнительное время.

1 голос
/ 31 августа 2016

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 отклонит это, если вы попытаетесь отправить его!

0 голосов
/ 05 декабря 2017

Если тип вашего приложения не относится к типу VOIP / Аудио / Местоположение .... (отметьте Режимы фона ),

или вы не хотите указывать свое приложение в качестве фонового приложения, вы можете реализовать beginBackgroundTaskWithName: expirationHandler или beginBackgroundTaskWithExpirationHandler , чтобы запросить дополнительное время для запуска вашего процесса в фоновом режиме. Вы можете найти подробное описание здесь

Ожидается, что приложения, перемещающиеся в фоновый режим, приведут себя в состояние покоя как можно быстрее, чтобы система могла их приостановить. Если ваше приложение находится в середине задачи и для ее выполнения требуется немного дополнительного времени, оно может вызвать beginBackgroundTaskWithName: expirationHandler: или beginBackgroundTaskWithExpirationHandler: метод объекта UIApplication, чтобы запросить дополнительное время выполнения. Вызов любого из этих методов временно приостанавливает работу вашего приложения, давая ему немного дополнительного времени для завершения работы. По завершении этой работы ваше приложение должно вызвать метод endBackgroundTask:, чтобы система знала, что она завершена и может быть приостановлена.

При каждом вызове beginBackgroundTaskWithName: expirationHandler: или beginBackgroundTaskWithExpirationHandler: метод генерирует уникальный токен для сопоставления с соответствующей задачей. Когда ваше приложение завершает задачу, оно должно вызвать метод endBackgroundTask: с соответствующим токеном, чтобы система знала, что задача выполнена. Ошибка вызова метода endBackgroundTask: для фоновой задачи приведет к завершению работы вашего приложения. Если вы указали обработчик истечения срока действия при запуске задачи, система вызовет этот обработчик и даст вам последний шанс завершить задачу и избежать ее завершения.

0 голосов
/ 16 марта 2012

Вы не можете. Если ваше приложение не использует аудио, VoIP или GPS. Что вы можете сделать, это уведомить пользователя (через локальные уведомления), что время почти истекло, и попросить его открыть / закрыть приложение.

Также, если вам просто нужно уведомить пользователя, вы можете использовать push-уведомления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...