Що саме можуть робити програми CoreBluetooth у фоновому режимі?


78

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

Наприклад:

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

Відповіді:


120

Здавалося, ніхто не знав, тому я купив обліковий запис розробника iOS і провів кілька експериментів. Ось що я знайшов:

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

Коли ви входите у фоновий режим, правила видаються такими:

  • Якщо у вас було необмежене сканування, воно буде тихо скасовано. Ви не отримаєте зворотних дзвінків didDiscover.
  • Якщо ваше сканування було обмежене (тобто ви вказали один або кілька службових UUID, які ви шукали), ваше сканування буде продовжувати працювати, але прапорець дозволити дублікати буде ігноруватися . Це означає, що тепер ви отримаєте лише зворотні дзвінки didDiscoverPeripheral для нових пристроїв. Якщо всі пристрої були помічені на передньому плані, ви взагалі не отримаєте зворотних дзвінків.
  • Запуск і зупинка сканування не скидає налаштування, які пристрої вважаються новими. Якщо присутній один пристрій, ви отримаєте лише один зворотний дзвінок, навіть під час кількох сканувань, якщо ...
  • Якщо ви підключитесь до пристрою, потім від’єднаєтесь , а потім знову скануєте , пристрій буде перераховано знову (тобто ви отримаєте ще один дзвінок на didDiscoverPeripheral). Я думаю, iOS розцінює це як "проявляючи інтерес" до пристрою.

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

Наведені вище результати були зібрані за допомогою iPhone 4S під управлінням iOS 5.0.1


2
Ей, Крісе. Цікаво! Однак я не розумію одного. Чи може процес продовжувати працювати у фоновому режимі, якщо він взаємодіє з дизайном Bluetooth? (Наприклад, чи можу я підключити монітор серцевого ритму, а потім перенести програму у фоновий режим і очікувати, що вона буде продовжувати працювати?)
Бен,

2
Привіт Бен. Він не буде продовжувати працювати так, як це робиться на передньому плані, але він буде продовжувати виконуватися, коли відбуватимуться події Bluetooth такого роду, як я описую вище. Проблема, з якою я зіткнувся, полягає в тому, що навіть у цій ситуації, коли деякий час немає взаємодії з користувачем, телефон переходить у режим сну, а додаток перестає запускатися. Я обійшов це, зареєструвавши (помилково) як аудіо-програму, яка запобігає призупиненню; однак це очевидно неприпустимо для магазину програм.
Кріс Смоутон,

Привіт Кріс. Чудовий пост. Ваш останній коментар заперечує твердження у цьому дописі: lists.apple.com/archives/bluetooth-dev/2011/Dec/msg00007.html Це не є гарною новиною. Чи вважаєте ви, що це фактична помилка у реалізації? Ви встановили підключення до пристрою? Чи можете ви підтвердити, що також припиняються сповіщення про оновлення цінностей? Дякую.
allprog

1
@ChrisSmowton Я знаю, що у вас більше немає пристрою iOS. Але чи маєте ви уявлення про те, як можна розрізнити iOS, ігноруючи дублікат, і iOS, який не знаходить периферійний пристрій?
shreyashirday

3
Якщо ви не бачили його з моменту останнього підключення до нього, його там немає. Якщо ви це бачили, єдиний спосіб, який я знаю, щоб виявити його знову у фоновому режимі - це спробувати встановити зв’язок.
Chris Smowton

9

На додаток до відповіді Кріса:

  • Якщо ваш додаток має фоновий режим «центральний Bluetooth» і підключений до периферійного пристрою, ви можете отримувати сповіщення ( peripheral:didUpdateValueForCharacteristic:error:) від периферійного пристрою у фоновому режимі, навіть через 10 хвилин.

Отже, коли ви хочете постійно запускати у фоновому режимі, у вас є 2 варіанти:

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

Пізніше має бути " Попередній перегляд подій" з основних відеороликів з Bluetooth WWDC 2012 https://developer.apple.com/videos/wwdc/2012/ Але перше виглядає як хак, я не хочу на нього покладатися.

Я тестував це на iPhone5, iOS6.1.4


Apple нарешті випустила Основний посібник з програмування Bluetooth, і ось офіційна примітка про

Основна фонова обробка Bluetooth для додатків iOS


7

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

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

  2. Не так очевидно: якщо ви використовуєте інтерфейс API iBeacon, тоді ваш додаток повинен бути на передньому плані. Це прямо не говорить про це в документації - насправді можна ввести в оману думати, що ранжування повинно працювати у фоновому режимі з документації. Однак інженер Apple пояснює це у дописі, захованому десь довгою ниткою на форумі розробників Apple, і я теж бачив, що це не вдалося. Діапазон буде працювати лише на передньому плані.

  3. Можна виявити інші послуги, що рекламуються периферійною рекламою iBeacons. Але це буде працювати лише на передньому плані. Отже, якщо ви хочете, щоб центральний центр отримував повідомлення про близькість за допомогою iBeacons, а потім виконував деякі інші транзакції, використовуючи інші служби на основі BLE, це буде працювати, але лише на передньому плані. Це не спрацює у фоновому режимі. Для транзакцій із послугами на базі BLE у фоновому режимі реклама повинна бути звичайною рекламою BLE, а не iBeacon. Ви не можете використовувати рекламу iBeacon, щоб допомогти процесу пошуку у фоновому режимі, а потім перейти на використання служб BLE у фоновому режимі. (Я б дуже хотів, щоб це працювало, але без кісток).


4

Я щойно вивчив фоновий режим для пристроїв 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 раз в сек.

1
Приємно знати, звучить так, ніби вони покращили стек з тих пір, як я використовував його в 2012 році :)
Кріс Смоутон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.