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


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

например:

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

4 ответа:

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

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

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

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

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

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

В дополнение к ответу Алексея:

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

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

  • запустите цикл "подключение, отключение, повторное сканирование"
  • сделать периферийные отправить уведомления

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

Я проверил это на iPhone5, iOS6.1. 4


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

Основной Обработки Блютуз Фон для приложений для iOS

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

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

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

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

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

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

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

С

- (void)applicationDidEnterBackground:(UIApplication *)application

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

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