iOS исключает данные производителя из рекламы в фоновом режиме

Я работаю над приложением для iOS, которое использует BLE для связи с нашим индивидуальным модулем BLE. Мы хотим автоматически отправлять определенные команды через BLE на устройство.

Когда пользователь находится рядом с устройством и соблюдены определенные критерии, приложение должно подключиться к устройству, "войти в систему" ​​пользователя, отправить команду через BLE и сразу же отключиться.

Эти конкретные критерии основаны на данных производителя из рекламы (т.е. устройство находится в состоянии "доступно для входа в систему", когда данные производителя имеют последний байт 0x01, когда он "НЕ доступен для входа в систему", последний байт равен 0x00).

На переднем плане этот механизм работает безупречно. Мы хотим сделать это, даже когда приложение находится в фоновом режиме или завершено (смахните вверх на панели управления на iPhone).

Реализованный нами механизм:

  • устройство может действовать как iBeacon
  • когда устройство НЕ доступно для входа в систему, iBeacon ВЫКЛЮЧЕН
  • когда он доступен для входа в систему, iBeacon включается и пробуждает приложение, после чего сканирование BLE запускается в фоновом режиме
  • настройка фонового режима - bluetooth-central

Проблема здесь в том, что, что бы я ни пробовал, реклама:

  1. иногда это вообще не обнаруживается (похоже, проблема с синхронизацией?)
  2. при обнаружении НЕ содержит данных производителя

Кто нибудь сталкивался с чем-то подобным? Любая помощь приветствуется и хорошего дня!

1 ответ

Приложение просто не может прочитать необработанные рекламные данные производителя BLE в фоновом режиме на iOS - операционная система запрещает это.

Два исключения из этого правила:

  1. iBeacon, который сам по себе реализован как особый вид рекламы производителя. Приложение может обнаруживать iBeacon в фоновом режиме на iOS, хотя можно полностью использовать только четыре байта читаемых данных (закодированных в основных и второстепенных полях). Если вы можете модифицировать свое устройство для отправки информации таким образом, оно будет делать то, что вы хотите. Однако для обнаружения iBeacon необходимо использовать API CoreLocation, поскольку CoreBluetooth не позволяет считывать данные производителя из рекламных объявлений iBeacon. Если вы все-таки используете CoreLocation, вы не можете использовать обнаружение для установления соединения Bluetooth с CoreBluetooth, поскольку два API-интерфейса изолированы.

  2. Рекламные объявления области переполнения. Приложения iOS в фоновом режиме могут читать эти специальные типы рекламы производителей в фоновом режиме, но только если экран включен. (Часто можно принудительно включить экран в определенное время, отправив локальное уведомление.) См. Мое сообщение в блоге здесь для получения дополнительной информации: http://www.davidgyoungtech.com/2020/05/07/hacking-the-overflow-area

Альтернативой обнаружению рекламы производителя является использование рекламы службы BLE с прикрепленными данными. Чтобы это работало, вам нужно определить 16-битный или 128-битный UUID службы GATT и отправить объявление с прикрепленными байтами данных. Форматы маяков Eddystone работают таким образом и позволяют обнаруживать в фоновом режиме на iOS. Это, вероятно, лучший подход, если вы можете изменить оборудование BLE.

Другие вопросы по тегам