Фоновое выполнение

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

Большинство приложений может переместиться в расширенное состояние достаточно легко, но существуют также законные причины приложений, чтобы продолжать работать в фоновом режиме. Путешествующее пешком приложение могло бы хотеть отследить позицию пользователя в течение долгого времени так, чтобы это могло вывести на экран тот курс, наложенный поверх путешествующей пешком карты. Аудио приложение, возможно, должно было бы продолжать играть музыку по экрану блокировки. Другие приложения могли бы хотеть загрузить содержание в фоновом режиме так, чтобы оно могло минимизировать задержку представления того содержания пользователю. При нахождении необходимым сохранить приложение, работающее в фоновом режиме iOS помогает Вам сделать так эффективно и не истощая системные ресурсы или батарею пользователя. Методы, предлагаемые iOS, попадают в три категории:

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

Выполнение задач Конечной Длины

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

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

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

Перечисление 3-1 показывает, как запустить продолжительную задачу когда Ваши переходы приложения к фону. В этом примере запрос для запуска фоновой задачи включает обработчик истечения срока на всякий случай, задача берет слишком долго. Сама задача тогда представлена очереди отгрузки для асинхронного выполнения так, чтобы applicationDidEnterBackground: метод может обычно возвращаться. Использование блоков упрощает код, должен был поддержать ссылки на любые важные переменные, такие как идентификатор фоновой задачи. bgTask переменная является задействованной переменной класса, хранящего указатель на текущий идентификатор фоновой задачи и инициализирующегося до его использования в этом методе.

Перечисление 3-1  , Начинающее фоновую задачу во время выхода

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        // Clean up any unfinished task business by marking where you
        // stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
 
    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 
        // Do the work associated with the task, preferably in chunks.
 
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

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

Загрузка содержания в фоновом режиме

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

Для поддержки фоновых передач необходимо сконфигурировать Ваш NSURLSession возразите соответственно. Для конфигурирования сеанса необходимо сначала создать a NSURLSessionConfiguration объект и набор несколько свойств к надлежащим значениям. Вы тогда передаете тот объект конфигурации надлежащему методу инициализации NSURLSession при создании сеанса.

Процесс для создания конфигурации возражает, что фоновые загрузки поддержек следующие:

  1. Создайте объект конфигурации использование backgroundSessionConfigurationWithIdentifier: метод NSURLSessionConfiguration.

  2. Установите значение объекта конфигурации sessionSendsLaunchEvents свойство к YES.

  3. если Ваше приложение запускает передачи, в то время как это находится на переднем плане, это, рекомендуют также установить discretionary свойство конфигурации возражает против YES.

  4. Сконфигурируйте любые другие свойства объекта конфигурации как надлежащие.

  5. Используйте объект конфигурации создать Ваш NSURLSession объект.

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

Когда все задачи, связанные с фоновым сеансом, завершены, система повторно запускает завершенное приложение (предполагающий, что sessionSendsLaunchEvents свойство было установлено в YES и что пользователь не вызывал, выходит из приложения), и вызывает делегата приложения application:handleEventsForBackgroundURLSession:completionHandler: метод. (Система может также повторно запустить приложение для обработки запросов аутентификации или других связанных с задачей событий, требующих внимания приложения.) В Вашей реализации того метода делегата, используйте предоставленный идентификатор для создания нового NSURLSessionConfiguration и NSURLSession объект с той же конфигурацией как прежде. Система повторно подключает Ваш новый объект сеанса к предыдущим задачам и сообщает об их состоянии делегату объекта сеанса.

Реализация продолжительных задач

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

Приложения, реализующие эти службы, должны объявить службы, они поддерживают и используют системные платформы для реализации соответствующих аспектов тех служб. Объявление служб позволяет системе знать, какие службы Вы используете, но в некоторых случаях это - системные платформы, фактически препятствующие тому, чтобы было приостановлено Ваше приложение.

Объявление поддерживаемых фоновых задач приложения

Поддержка некоторых типов фонового выполнения должна быть объявлена заранее приложением, использующим их. В Xcode 5 и позже, Вы объявляете фоновые режимы Ваши поддержки приложений от вкладки Capabilities Ваших настроек проекта. Включение опции Background Modes добавляет UIBackgroundModes ключ к Вашему приложению Info.plist файл. Выбор одного или более флажков добавляет, что соответствующий фоновый режим оценивает тому ключу. Таблица 3-1 перечисляет фоновые режимы, которые можно указать и значения, которые XCode присваивает UIBackgroundModes введите свое приложение Info.plist файл.

Табличные 3-1  Фоновые режимы для приложений

Фоновый режим XCode

Значение UIBackgroundModes

Описание

Аудио и AirPlay

audio

Приложение играет слышимое содержание пользователю или записывает аудио в то время как в фоновом режиме. (Это содержание включает потоковое аудио или использование видеоконтента AirPlay.)

Пользователь должен дать разрешение для приложений использовать микрофон до первого использования; для получения дополнительной информации посмотрите Пользовательскую Конфиденциальность Поддержки.

Обновления информации о местоположении

location

Приложение информирует пользователей их расположения, даже в то время как это работает в фоновом режиме.

Речь по IP

voip

Приложение предоставляет возможность для пользователя для создания телефонных вызовов с помощью Интернет-соединения.

Загрузки киоска

newsstand-content

Приложение является приложением Киоска, загружающим и обрабатывающим журнал или газетное содержание в фоновом режиме.

Внешний вспомогательный коммуникация

external-accessory

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

Использование Bluetooth аксессуары LE

bluetooth-central

Приложение работает с аксессуаром Bluetooth, который должен поставить обновления в регулярном расписании через Ядро платформа Bluetooth.

Акты как Bluetooth аксессуар LE

bluetooth-peripheral

Связь Bluetooth поддержек приложений в периферийном режиме через Ядро платформа Bluetooth.

Используя этот режим требует авторизации пользователя; для получения дополнительной информации посмотрите Пользовательскую Конфиденциальность Поддержки.

Фоновая выборка

fetch

Приложение регулярно загружает и обрабатывает мелкие суммы содержания от сети.

Удаленные уведомления

remote-notification

Когда уведомление нажатия поступает, приложение хочет начать загружать содержание. Используйте это уведомление для минимизации задержки показа содержания, связанного с уведомлением нажатия.

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

Отслеживание расположения пользователя

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

  • (Рекомендуемая) служба определения местоположения существенного изменения

  • Службы определения местоположения только для переднего плана

  • Фоновые службы определения местоположения

Служба определения местоположения существенного изменения настоятельно рекомендована для приложений, для которых не нужны данные расположения высокой точности. С этой службой обновления информации о местоположении сгенерированы только, когда расположение пользователя изменяется значительно; таким образом это идеально для социальных приложений или приложений, предоставляющих пользователю некритическую, информацию, важную для расположения. Если приложение приостановлено, когда обновление происходит, система будит его в фоновом режиме для обработки обновления. Если приложение запускает эту службу и тогда завершается, система повторно запускает приложение автоматически, когда новое расположение становится доступным. Эта служба доступна в iOS 4 и позже, и это доступно только на устройствах, содержащих сотовую радиосвязь.

И фоновые службы определения местоположения только для переднего плана оба используют стандартную Службу определения местоположения Ядра расположения для получения данных расположения. Единственная разница - то, что службы определения местоположения только для переднего плана прекращают поставлять обновления, если приложение когда-либо приостанавливается, который, вероятно, произойдет, если приложение не будет поддерживать другие фоновые службы или задачи. Службы определения местоположения только для переднего плана предназначаются для приложений, что только нуждаются в данных расположения, в то время как они находятся на переднем плане.

Вы включаете поддержку расположения со стороны раздела Фоновых режимов вкладки Capabilities в Вашем проекте XCode. (Можно также включить эту поддержку включением UIBackgroundModes ключ с location оцените в своем приложении Info.plist файл.) Разрешающий этот режим не препятствует тому, чтобы система приостановила приложение, но это действительно говорит системе, что должно разбудить приложение каждый раз, когда существуют новые данные расположения для поставки. Таким образом этот ключ эффективно позволяет выполнению приложения в фоновом режиме для обработки обновлений информации о местоположении каждый раз, когда они происходят.

Для получения информации о том, как использовать каждую из различных служб определения местоположения в Вашем приложении, см. Руководство по программированию Карт и Расположение.

Игра и запись фонового аудио

Приложение, играющее или записывающее аудио постоянно (даже, в то время как приложение работает в фоновом режиме) может зарегистрироваться для выполнения тех задач в фоновом режиме. Вы включаете аудио поддержку со стороны раздела Фоновых режимов вкладки Capabilities в Вашем проекте XCode. (Можно также включить эту поддержку включением UIBackgroundModes ключ с audio оцените в своем приложении Info.plist файл.) Приложения, играющие звуковое содержимое в фоновом режиме, должны играть слышимое содержание и не тишину.

Типичные примеры фоновых аудио приложений включают:

  • Приложения аудиоплеера

  • Приложения аудиозаписи

  • Приложения, поддерживающие воспроизведение аудио или воспроизведение видео по AirPlay

  • Приложения VoIP

Когда UIBackgroundModes ключ содержит audio значение, платформы носителей системы автоматически препятствуют тому, чтобы соответствующее приложение было приостановлено, когда это перемещается в фон. Пока это играет звуковое содержимое или видеоконтент или записывает звуковое содержимое, приложение продолжает работать в фоновом режиме. Однако при записи или остановки воспроизведения, система приостанавливает приложение.

Можно использовать любую из системных платформ аудио для работы с фоновым звуковым содержимым, и процесс для использования тех платформ неизменен. (Для воспроизведения видео по AirPlay можно использовать Медиапроигрыватель или платформу Основы AV для представления видео.), Поскольку Ваше приложение не приостановлено при игре медиа-файлов, обратные вызовы работают обычно, в то время как приложение в фоновом режиме. В Ваших обратных вызовах, тем не менее, необходимо выполнить только работу, необходимую для предоставления данных для воспроизведения. Например, приложение потокового аудио должно было бы загрузить музыкальные потоковые данные со своего сервера и выставить текущие аудиосэмплы для воспроизведения. Приложения не должны выполнять посторонние задачи, которые не связаны с воспроизведением.

Поскольку больше чем одно приложение может поддерживать аудио, система определяет, какому приложению позволяют играть или записать аудио в любой момент времени. Приоритетное приложение всегда имеет приоритет для операций передачи. Больше чем для одного фонового приложения возможно быть позволенным играть аудио, и такие определения основываются на конфигурации аудио объектов сеанса каждого приложения. Необходимо всегда конфигурировать аудио объект сеанса приложения соответственно и работать тщательно с системными платформами для обработки прерываний и других типов связанных с аудио уведомлений. Для получения информации о том, как сконфигурировать аудио объекты сеанса для фонового выполнения, см. Аудио Руководство по программированию Сеанса.

Реализация приложения VoIP

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

Для конфигурирования приложения VoIP необходимо сделать следующее:

  1. Включите поддержку Речи по IP от раздела Фоновых режимов вкладки Capabilities в Вашем проекте XCode. (Можно также включить эту поддержку включением UIBackgroundModes ключ с voip оцените в своем приложении Info.plist файл.)

  2. Сконфигурируйте один из сокетов приложения для использования VoIP.

  3. Прежде, чем переместиться в фон, вызовите setKeepAliveTimeout:handler: метод для установки обработчика, который будет периодически выполняться. Ваше приложение может использовать этот обработчик для поддержания его соединения услуг.

  4. Сконфигурируйте свой аудио сеанс для обработки переходов к и от активного использования.

Включая voip значение в UIBackgroundModes ключ позволяет системе знать, что это должно позволить приложению работать в фоновом режиме по мере необходимости для управления его сетевыми сокетами. Приложение с этим ключом также повторно запускается в фоновом режиме сразу после начальной загрузки системы, чтобы гарантировать, что службы VoIP всегда доступны.

Большинство приложений VoIP также должно быть сконфигурировано как фоновые аудио приложения для поставки аудио в то время как в фоновом режиме. Поэтому необходимо включать обоих audio и voip значения к UIBackgroundModes ключ. Если Вы не делаете этого, Ваше приложение не может играть или записать аудио, в то время как это в фоновом режиме. Для получения дополнительной информации о UIBackgroundModes ключ, посмотрите информационную Ключевую Ссылку Списка свойств.

Для определенной информации о шагах необходимо взять, чтобы реализовать приложение VoIP, видеть Подсказки для Разработки Приложения VoIP.

Выборка мелких сумм содержания воспользовавшись ситуацией

Приложения, которые должны проверить на новое содержание периодически, могут просить, чтобы система разбудила их так, чтобы они могли инициировать работу выборки для того содержания. Для поддержки этого режима включите Фоновую опцию выборки из раздела Фоновых режимов вкладки Capabilities в проекте XCode. (Можно также включить эту поддержку включением UIBackgroundModes ключ с fetch оцените в своем приложении Info.plist файл.) Разрешающий этот режим не гарантия, что система даст Вашему приложению любое время для выполнения фоновых выборок. Система должна сбалансировать потребность Вашего приложения выбрать содержание с потребностями других приложений и самой системы. Когда существуют хорошие возможности сделать так, после оценки той информации система дает время приложениям.

Когда хорошая возможность возникает, система будит или запускает Ваше приложение в фон и вызывает делегата приложения application:performFetchWithCompletionHandler: метод. Используйте тот метод, чтобы проверить на новое содержание и инициировать работу загрузки, если содержание доступно. Как только Вы заканчиваете загружать новое содержание, необходимо выполнить предоставленный блок обработчика завершения, передав результат, указывающий, было ли содержание доступно. Выполнение этого блока говорит системе, что может положить обратно Ваше приложение к состоянию ожидания и оценить его использование питания. Приложения, загружающие мелкие суммы содержания быстро, и точно отражающие, когда они имели содержание в наличии для загрузки, более вероятно, получат время выполнения в будущем, чем приложения, занимающие много времени для загрузки их содержания, или то содержание требования было доступно, но тогда ничего не загружайте.

При загрузке любого содержания рекомендуется использовать NSURLSession класс, чтобы инициировать и управлять Вашими загрузками. Для получения информации о том, как использовать этот класс, чтобы управлять загрузкой и задачами загрузки, видеть Руководство по программированию Загрузочной системы URL.

Используя уведомления нажатия для инициирования загрузки

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

Для поддержки этого фонового режима включите Удаленную опцию уведомлений из раздела Фоновых режимов вкладки Capabilities в проекте XCode. (Можно также включить эту поддержку включением UIBackgroundModes ключ с remote-notification оцените в своем приложении Info.plist файл.)

Для уведомления нажатия для инициирования работы загрузки полезная нагрузка уведомления должна включать content-available ключ с его набором значений к 1. Когда тот ключ присутствует, система будит приложение в фоновом режиме (или запускает его в фон), и вызывает делегата приложения application:didReceiveRemoteNotification:fetchCompletionHandler: метод. Ваша реализация того метода должна загрузить соответствующее содержание и интегрировать его в Ваше приложение.

При загрузке любого содержания рекомендуется использовать NSURLSession класс, чтобы инициировать и управлять Вашими загрузками. Для получения информации о том, как использовать этот класс, чтобы управлять загрузкой и задачами загрузки, видеть Руководство по программированию Загрузочной системы URL.

Загрузка содержания киоска в фоновом режиме

Приложение Киоска, загружающее новый журнал или газетные проблемы, может зарегистрироваться для выполнения тех загрузок в фоновом режиме. Вы включаете поддержку загрузок киоска с раздела Фоновых режимов вкладки Capabilities в Вашем проекте XCode. (Можно также включить эту поддержку включением UIBackgroundModes ключ с newsstand-content оцените в своем приложении Info.plist файл.), Когда этот ключ присутствует, система запускает Ваше приложение, если это уже не работает, так, чтобы это могло инициировать загрузку новой проблемы.

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

Для получения информации о том, как загрузить содержание с помощью платформы Ньюсстэнда Кита, посмотрите Ссылку Платформы NewsstandKit.

Связь с внешним аксессуаром

Приложения, работающие с внешними аксессуарами, могут попросить быть разбуженными, если аксессуар поставляет обновление, когда приостановлено приложение. Эта поддержка важна для некоторых типов аксессуаров, поставляющих данные равномерно, такие как мониторы сердечного ритма. Вы включаете поддержку внешнего, вспомогательного коммуникация от раздела Фоновых режимов вкладки Capabilities в Вашем проекте XCode. (Можно также включить эту поддержку включением UIBackgroundModes ключ с external-accessory оцените в своем приложении Info.plist файл.) При включении этого режима, внешнее вспомогательное платформа не закрывает активные сеансы с аксессуарами. (В iOS 4 и ранее, эти сеансы закрываются автоматически, когда приостановлено приложение.), Когда новые данные поступают от аксессуара, платформа будит Ваше приложение так, чтобы это могло обработать те данные. Система также будит приложение для обработки вспомогательный уведомления разъединения и соединение.

Любое приложение, поддерживающее фоновую обработку вспомогательных обновления, должно следовать нескольким основным инструкциям:

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

  • После того, чтобы быть разбуженным приложение имеет приблизительно 10 секунд для обработки данных. Идеально, это должно обработать данные максимально быстро и позволить себе быть приостановленным снова. Однако, если больше времени необходимо, приложение может использовать beginBackgroundTaskWithExpirationHandler: метод для запроса дополнительного времени; это должно сделать так только при необходимости, все же.

Связь с аксессуаром Bluetooth

Приложения, работающие с периферийными устройствами Bluetooth, могут попросить быть разбуженными, если периферийное устройство поставляет обновление, когда приостановлено приложение. Эта поддержка важна для аксессуаров Bluetooth-LE, поставляющих данные равномерно, такие как ремень сердечного ритма Bluetooth. Вы включаете поддержку использования аксессуаров Bluetooth от раздела Фоновых режимов вкладки Capabilities в Вашем проекте XCode. (Можно также включить эту поддержку включением UIBackgroundModes ключ с bluetooth-central оцените в своем приложении Info.plist файл.) При включении этого режима, Ядро платформа Bluetooth сохраняет открытым любые активные сеансы для соответствующего периферийного устройства. Кроме того, новые данные, поступающие от периферийного устройства, заставляют систему будить приложение так, чтобы это могло обработать данные. Система также будит приложение для обработки вспомогательный уведомления разъединения и соединение.

В iOS 6 приложение может также работать в периферийном режиме с аксессуарами Bluetooth. Для действия как аксессуар Bluetooth необходимо включить поддержку того режима от раздела Фоновых режимов вкладки Capabilities в проекте XCode. (Можно также включить эту поддержку включением UIBackgroundModes ключ с bluetooth-peripheral оцените в своем приложении Info.plist файл.) Разрешающий этот режим позволяет Ядру, платформа Bluetooth будит приложение кратко в фоновом режиме так, чтобы это могло обработать связанные с аксессуаром запросы. Приложения, разбуженные для этих событий, должны обработать их и возврат как можно быстрее так, чтобы приложение могло быть приостановлено снова.

Любое приложение, поддерживающее фоновую обработку данных Bluetooth, должно быть основано на сеансе и следовать нескольким основным инструкциям:

  • Приложения должны обеспечить интерфейс, позволяющий пользователю запускать и останавливать поставку событий Bluetooth. Тот интерфейс должен тогда открыть или закрыть сеанс как надлежащий.

  • После того, чтобы быть разбуженным приложение имеет приблизительно 10 секунд для обработки данных. Идеально, это должно обработать данные максимально быстро и позволить себе быть приостановленным снова. Однако, если больше времени необходимо, приложение может использовать beginBackgroundTaskWithExpirationHandler: метод для запроса дополнительного времени; это должно сделать так только при необходимости, все же.

Привлечение внимания пользователя, в то время как в фоновом режиме

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

Для планирования поставки локального уведомления создайте экземпляр UILocalNotification класс, сконфигурируйте параметры уведомления и запланируйте его с помощью методов UIApplication класс. Локальный объект уведомления содержит информацию о типе уведомления для поставки (звук, предупреждение или значок) и время (когда применимый), в котором можно поставить его. Методы UIApplication класс предоставляет возможности для поставки уведомлений сразу или в запланированное время.

Перечисление 3-2 показывает пример, планирующий отдельный аварийный сигнал с помощью даты и времени, установленной пользователем. Этот пример конфигурирует только одно предупреждение за один раз и отменяет предыдущее предупреждение прежде, чем запланировать новое. (Ваши собственные приложения могут иметь не больше, чем 128 локальных уведомлений, активных в любой момент времени, любой из которых может быть сконфигурирован для повторения в указанном интервале.) Само предупреждение состоит из окна предупреждений и звукового файла, играющегося, если приложение не работает или в фоновом режиме, когда стреляет предупреждение. Если приложение является активным и поэтому рабочим на переднем плане, делегат приложения application:didReceiveLocalNotification: метод вызывают вместо этого.

Перечисление 3-2  Планируя уведомление об аварии

- (void)scheduleAlarmForDate:(NSDate*)theDate
{
    UIApplication* app = [UIApplication sharedApplication];
    NSArray*    oldNotifications = [app scheduledLocalNotifications];
 
    // Clear out the old notification before scheduling a new one.
    if ([oldNotifications count] > 0)
        [app cancelAllLocalNotifications];
 
    // Create a new notification.
    UILocalNotification* alarm = [[UILocalNotification alloc] init];
    if (alarm)
    {
        alarm.fireDate = theDate;
        alarm.timeZone = [NSTimeZone defaultTimeZone];
        alarm.repeatInterval = 0;
        alarm.soundName = @"alarmsound.caf";
        alarm.alertBody = @"Time to wake up!";
 
        [app scheduleLocalNotification:alarm];
    }
}

Звуковые файлы, используемые с локальными уведомлениями, имеют те же требования как используемые для уведомлений нажатия. Пользовательские звуковые файлы должны быть расположены в основном пакете Вашего приложения и поддерживать один из следующих форматов: Линейный PCM, MA4, µ-Law, или закон. Можно также указать UILocalNotificationDefaultSoundName постоянный для игры предупредительного звука по умолчанию для устройства. Когда уведомление отправляется, и звук играется, система также инициировала вибрацию на устройствах, поддерживающих его.

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

Понимание, когда приложение начато фон

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

В большинстве случаев система не повторно запускает приложения после того, как они будут силой, завершенной пользователем. Одно исключение является приложениями расположения, которые в iOS 8 и позже повторно запускаются будучи силой, завершенной пользователем. В других случаях, тем не менее, пользователь должен запустить приложение явно или перезагрузить устройство, прежде чем приложение сможет быть запущено автоматически в фон системой.

Будучи ответственным фоновым приложением

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

Если Вы реализуете фоновое аудио приложение или какой-либо другой тип приложения, которому позволяют работать в фоновом режиме, Ваше приложение реагирует на входящие сообщения обычным способом. Другими словами, система может уведомить Ваше приложение предупреждений низкой памяти, когда они происходят. И в ситуациях, где система должна завершить приложения к свободному еще больше памяти, приложение вызывает своего делегата applicationWillTerminate: метод для выполнения любых заключительных задач перед выходом.

Выбор из фонового выполнения

Если Вы не хотите, чтобы Ваше приложение работало в фоновом режиме вообще, можно явно выбрать из фона путем добавления UIApplicationExitsOnSuspend ключ (со значением YES) к Вашему приложению Info.plist файл. Когда приложение отказывается, оно циклически повторяется между не выполненным, неактивными, и активными состояниями и никогда не вводит фоновые или состояния ожидания. Когда пользователь нажимает кнопку «Домой» для выхода из приложения, applicationWillTerminate: метод делегата приложения вызывают, и приложение имеет приблизительно 5 секунд, чтобы очистить и выйти, прежде чем это будет завершено и попятилось к не-состоянию-выполнения.

Выбору из фонового выполнения строго обескураживают, но может быть предпочтительным вариантом при определенных условиях. В частности, если кодирование для фонового выполнения добавляет, что значительная сложность к Вашему приложению, завершая приложение могла бы быть простым решением. Кроме того, если Ваше приложение использует большой объем памяти и не может легко выпустить ни один из него, система могла бы уничтожить Ваше приложение быстро так или иначе для создания места для других приложений. Таким образом выбор завершиться, вместо того, чтобы переключиться на фон, мог бы привести к тем же результатам и спасти Вас время разработки и усилие.

Для получения дополнительной информации о ключах можно включать в приложение Info.plist файл, посмотрите информационную Ключевую Ссылку Списка свойств.