Что именно могут делать приложения CoreBluetooth в фоновом режиме? - PullRequest
78 голосов
/ 27 марта 2012

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

Например:

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

Ответы [ 4 ]

119 голосов
/ 11 апреля 2012

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

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

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

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

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

Приведенные выше результаты были получены с помощью iPhone 4S под управлением iOS 5.0.1

9 голосов
/ 05 июля 2013

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

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

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

  • Запустите цикл «подключить, отключить, снова сканировать»
  • Сделайте, чтобы периферийное устройство отправляло уведомления

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

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


Apple наконец-то выпустила Базовое руководство по программированию Bluetooth , и вот официальная заметка о

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

7 голосов
/ 19 октября 2013

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

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

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

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

4 голосов
/ 13 июля 2015

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

  1. если я начну

    [centralManager scanForPeripheralsWithServices: @ [[CBUUID UUIDWithString: kServiceUUID]] параметры: @ {CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];

от

- (void)applicationDidEnterBackground:(UIApplication *)application

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

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