Что конкретно могут делать приложения CoreBluetooth в фоновом режиме?

На самом деле предмет говорит все. Документация, поскольку она вообще существует, предполагает, что приложения, написанные против платформы CoreBluetooth, работающие на устройствах iOS, могут добавить "bluetooth-central" в свой список привилегий фона и, таким образом, обрабатывать какие-то события Bluetooth в то время как неактивные, но какие именно события делают и не доставляются?

Например:

  • Могу ли я продолжить связь с устройством, на котором я уже установил соединение с?
  • Могу ли я выдавать периодические запросы на обнаружение, чтобы найти устройства, которые находятся за пределами допустимого диапазона/я никогда раньше не видел? (Например, если я хотел иметь возможность доставлять уведомление, когда встречается новое интересное устройство)
  • Что делать, если устройство выходит за пределы диапазона, а затем возвращается? Могу ли я отключить и подключить события без вмешательства пользователя, или мне нужно будет переопределить и пользователь явно запросит повторное подключение?

Ответ 1

Никто, казалось, не знал, поэтому я купил аккаунт разработчика iOS и провел несколько экспериментов. Вот что я нашел:

При запуске на переднем плане вы можете запустить сканирование с помощью CBCentralManager:: scanForPeripheralsWithServices. Сканирование может быть ограничено для устройств, рекламирующих конкретную услугу, или неограниченное (передайте нуль для этого параметра вызова). Он также может разрешать или запрещать дубликаты; в первом случае вы будете получать обратный вызов didDiscoverPeripheral каждый раз, когда iPhone получает пакеты рекламы; в последнем вы получите только один обратный вызов на обнаруженное устройство.

При вводе фона правила выглядят следующим образом:

  • Если вы выполняете сканирование неограниченное, оно будет тихо отменено. Вы не получите никаких ответных вызовов.
  • Если ваше сканирование было ограничено (т.е. вы указали один или несколько идентификаторов UUID службы, которые вы искали), ваше сканирование будет продолжать выполняться, но флаг allow duplicates будет игнорироваться. Это означает, что теперь вы получите только обработанные didDiscoverPeripheral обратные вызовы для новых устройств. Если все устройства были замечены, а на переднем плане вы не получите никаких обратных вызовов.
  • Запуск и остановка сканирования не reset, какие устройства считаются новыми. Если присутствует одно устройство, вы получите только один обратный вызов, даже при нескольких сканированиях, если...
  • Если вы подключаетесь к устройству, затем отключите, затем снова сканируйте, устройство будет перечислить снова (т.е. вы получите один больше звонков на didDiscoverPeripheral). Я полагаю, что iOS считает, что "проявил интерес" к устройству.

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

Вышеуказанные результаты были собраны с использованием iPhone 4S с iOS 5.0.1

Ответ 2

В дополнение к Крису:

  • Если ваше приложение имеет фоновый режим "bluetooth-central" и подключен к периферийному устройству, вы можете получать уведомления (peripheral:didUpdateValueForCharacteristic:error:) из периферийного устройства в фоновом режиме, даже после 10 минут.

Итак, если вы хотите постоянно работать в фоновом режиме, у вас есть 2 варианта:

  • Запустите цикл "connect, disconnect, scan again"
  • Сделать уведомления о доставке периферийных устройств

Позже должно быть "Event backgrounding" из видеороликов Bluetooth основного качества WWDC 2012 https://developer.apple.com/videos/wwdc/2012/ Но первый выглядит как хак, я не хочу полагаться на него.

Я тестировал это на iPhone5, iOS6.1.4


Apple наконец выпустила Core Bluetooth Programming Guide и здесь официальная заметка о

Основная фоновая обработка Bluetooth для приложений iOS

Ответ 3

Также полезно отметить поведение фона и CoreBluetooth, связанных с iBeacons, хотя Apple любит думать об этом как о функциональности CoreLocation:

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

  • Не так очевидно: если вы используете API-интерфейс iBeacon, то ваше приложение должно быть на переднем плане. Он явно не говорит об этом в документации - на самом деле, можно ввести в заблуждение, полагая, что ранжирование должно работать в фоновом режиме из документации. Тем не менее, инженер Apple разъясняет это в почтовом ящике, где-то в длинном потоке на форуме разработчиков Apple, и я тоже видел, что это не так. Ранжирование будет работать только на переднем плане.

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

Ответ 4

Я только что узнал фоновый режим для устройств BLE на iOS8.3 и 8.4 и нашел некоторые отличия от выше:

  • если я запустил

    [centralManager scanForPeripheralsWithServices: @[[CBUUID UUIDWithString: kServiceUUID]]: @{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];

от

- (void)applicationDidEnterBackground:(UIApplication *)application

Я обнаружил, что перечисление возвращает одно и то же устройство при каждом вызове с разными RSSI, поэтому CBCentralManagerScanOptionAllowDuplicatesKey не игнорируется.

  1. Если приложение находится на переднем плане, оно обнаружило устройство BLE 50 раз в секунду. Если приложение находится в фоновом режиме, но экран телефона активен, приложение обнаруживает устройства BLE 6 раз в секунду. Если экран телефона заблокирован, приложение обнаружило устройства BLE 1 раз в секунду.