Базовое Bluetooth и фон: обнаружение устройства и запуск действия, даже после нескольких дней в фоновом режиме?

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

Как отмечалось в видео по Bluetooth для WWDC 2012, есть две возможности для приложений работать в фоновом режиме при работе с Core Bluetooth:

Фоновое событие

Фоновая обработка событий - это, вероятно, то, что большинство приложений будет использовать при взаимодействии с устройствами с низким энергопотреблением Bluetooth. Этот режим не разрешает прямую связь с аксессуаром, когда приложение находится в фоновом режиме, но обеспечивает уведомление от аксессуара, когда он хочет связаться с приложением. iOS будет оставаться подключенной к аксессуару BTLE, когда ваше приложение находится в фоновом режиме, и будет продолжать отслеживать уведомления. Когда у подключенного аксессуара BTLE будет доступно уведомление, iOS уведомит пользователя о том, что аксессуар хотел бы поговорить с вашим приложением, позволяя пользователю загрузить ваше приложение и взаимодействовать с аксессуаром. Поскольку многие устройства нуждаются в энергосбережении, предоставление информации только в определенное время значительно увеличит время автономной работы аксессуара и iPhone 4S.

  • Нет записей info.plist для этого режима.

Фоновая сессия

В некоторых случаях приложение должно взаимодействовать с аксессуаром, даже если оно работает в фоновом режиме. Рассмотрим работающее приложение, которое должно отслеживать частоту сердечных сокращений в режиме реального времени. Существует четкий старт и стоп для этой модели. Пользователь начинает свой запуск в приложении. Пока прогон активен, приложение считывает информацию о частоте сердечных сокращений до тех пор, пока прогон не будет завершен или не ОСТАНОВЛЕН. Фоновая сессия также позволяет сканировать и подключаться к аксессуарам BTLE, пока приложение находится в фоновом режиме. Вызов scanForPeripheralsWithServices или connectPeripheral будет продолжен, даже если приложение находится в фоновом режиме. CoreBluetooth будет продолжать следить за определенными периферийными устройствами или периферийными устройствами, которые соответствуют службам, которые ищет ваше приложение, и вызывать делегата приложений, когда он найден или подключен. Помните, что каждый раз, когда периферийные устройства BTLE или iPhone 4S используют свое радио, они истощают доступную мощность соответствующих устройств. Разработчики приложений, использующие фоновую работу на основе сеансов, должны учитывать энергопотребление.

  • Фоновое изображение сеанса требует записи в режиме фонового режима для UIBackgroundModes, bluetooth-central, в вашем info.plist приложения.

До сих пор я Session Backgrounding (с соответствующей записью info.plist). Приложение просит iOS извлечь все известные устройства и затем дает команду подключения к устройству, которое я ищу. Обратный вызов соединения происходит даже через несколько минут после того, как мое приложение было фоновым.

Но: приложение приостанавливается, скажем, через час. Это означает, что в следующий раз, когда мое приложение будет запущено пользователем, оно не сможет определить, были ли какие-либо наблюдения интересующего вас устройства BLE.

Итак, мой вопрос: возможно ли, чтобы мое приложение получало уведомление без взаимодействия с пользователем даже через несколько дней после отправки в фоновый режим, когда определенное устройство BLE входит в диапазон, так что я могу сохранить свою метку времени?

3 ответа

Решение

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

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

(Документация приложения WillTerminate)

Начиная с iOS 7, ваш вариант использования теперь легко поддерживать. До iOS 7 ваше приложение могло регистрироваться для уведомлений об этом периферийном устройстве, и оно просыпалось в фоновом режиме, когда система получала уведомление о доставке. Однако, если система окажется под давлением памяти, когда ваше приложение будет фоновым или перезагружено, оно не будет перезапущено. iOS 7 добавил восстановление состояния в CBCentralManager а также CBPeripheralManagerТаким образом, теперь ОС будет перезапускать ваше приложение в ограниченной емкости, даже если оно не было запущено из-за одного из вышеупомянутых условий. См. Руководство CoreBluetooth для получения дополнительной информации.

Короче говоря, для вашего случая использования вы можете сделать следующее:

  • Продолжать поддерживать bluetooth-central в качестве фонового режима выполнения.
  • Включите сохранение и восстановление состояния, как описано здесь в разделе "Добавление поддержки сохранения и восстановления состояния".

Используйте IOS7 BLE State Сохранение и восстановление

Если ваше приложение прерывается IOS из-за нехватки памяти(именно поэтому ваше приложение не может работать через несколько дней), оно больше не может обрабатывать делегаты Bluetooth. В этом случае, если вы использовали State Preservation & Restoration, ваше приложение может быть перезапущено в фоновый режим для повторного запуска, также только на 10 секунд. Через 10 секунд он перейдет в приостановленное состояние.Только в этой ситуации будет активирован willRestoreState CBCentralManager.

Удачи.

Другие вопросы по тегам