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

Core Bluetooth и backgrounding: обнаружение устройства и запуск действия, даже после того, как они были в фоновом режиме?

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

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

Фундаментация событий

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

  • Для этого режима не требуются записи info.plist.

Фундаментация сеанса

Иногда приложение должно взаимодействовать с аксессуар, даже если он работает в фоновом режиме. Рассмотрим которое требует мониторинга частоты сердечных сокращений в реальном времени. Eсть очистите START и STOP к этой модели. Пользователь ЗАПУСКАЕТ их запуск в Приложение. Пока запуск активен, приложение считывает информацию о частоте сердечных сокращений пока запуск не завершится или не будет остановлен. Подсчет сеансов также позволяет сканировать и подключаться к аксессуарам BTLE, в то время как приложение находится в фоновом режиме. Сканирование для периферийных устройствWithServices или connectPeripheral call будет продолжен, даже если приложение находится в задний план. CoreBluetooth продолжит мониторинг для конкретных периферийных устройств или периферийных устройств, которые соответствуют службам, которые ищет приложение для и вызывать делегат приложений при обнаружении или подключении. Будьте внимательны, что каждый раз, когда периферийное устройство BTLE или iPhone 4S использует свое радио истощая доступную мощность соответствующих устройств. Разработчики приложений использование фоновой сессии, основанной на сеансах, должно учитывать потребление энергии.

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

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

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

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

4b9b3361

Ответ 1

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

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

(Документация applicationWillTerminate)

Ответ 2

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

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

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

Ответ 3

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

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

Удачи.