Подтвердить что ты не робот

Запустить приложение на более чем 10 минут в фоновом режиме

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Это решение на самом деле не идеально и по-прежнему является голодным, но будет делать то, что вы хотите.

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Если ваш тип приложения не относится к VOIP/Audio/Location.... (проверьте Фоновые режимы),

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

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

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