Можно ли динамически устанавливать UUID в приложении iBeacon?

У меня есть устройство-маяк, которое транслирует разные значения UUID на основе пользовательской схемы вращения.

Обычно разработчик должен установить статический UUID, чтобы приложение распознавало его следующим образом (пример для iOS):

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:major minor:minor identifier:identifier];

Мне было интересно, есть ли способ динамически генерировать (или получать с сервера) UUID для распознавания.

Сказав, что у меня все еще есть трудности с пониманием внутренних механизмов того, как маяки понимаются iOS и Android. Насколько я понимаю, модуль BLE телефона перенаправляет все правильно отформатированные iBeacons в ОС, которая поддерживает список распознанных UUID. После простого поиска и при обнаружении совпадения ОС выведет соответствующее приложение на передний план.

Однако когда распознанные UUID приложения регистрируются в ОС? Как часто они перерегистрируются? Я был бы признателен, если бы кто-нибудь указал мне на любой соответствующий онлайн-материал или хотя бы упомянул механизмы, участвующие в этом процессе.


person dr.doom    schedule 20.04.2016    source источник


Ответы (1)


Как на Android, так и на iOS регистрация ProximityUUID маяка для обнаружения не что иное, как применение фильтра к пакетам Bluetooth, которые соответствуют шаблону байта маяка и ProximityUUID. Важным отличием является то, что в iOS инфраструктура операционной системы, выполняющая фильтрацию, CoreLocation, накладывает жесткие ограничения на фильтры, которые вы можете использовать. Ограничения iOS включают:

  • Вы можете отслеживать только 20 UUID для одного приложения в любой момент времени.
  • Ограничение на уровне устройства, составляющее первые 30 отслеживаемых UUID, обеспечивает быстрое обнаружение с аппаратной поддержкой. Более поздние UUID для регистрации обнаруживаются медленнее (несколько минут в фоновом режиме).
  • Вы не можете отслеживать или диапазон для любого UUID (глобальный подстановочный знак)

Однако вы можете изменить 20 UUID, которые отслеживает ваше приложение, в любое время — даже раз в несколько секунд. Хитрость заключается в том, что ваше приложение должно быть на переднем плане, чтобы сделать это, или иметь разрешенный способ запуска в фоновом режиме, чтобы выполнить эту ротацию UUID.

Чтобы зарегистрировать UUID для мониторинга на iOS, вы просто объявляете регион с этим UUID (обычно без указания основного и дополнительного значений), затем вызываете:

[locationManager startMonitoringForRegion:region];

Чтобы не превысить ограничение в 20 регионов, вам также необходимо позвонить:

[locationManager stopMonitoringForRegion:oldRegion];

На своих старых регионах вы больше не хотите мониторить. В противном случае, если вы превысите лимит в 20, вы не получите обнаружение новых зарегистрированных регионов.

Конечно, вы можете использовать веб-службу для предоставления UUID для отслеживания новых регионов.

В Android это намного проще — вы можете отслеживать все UUID, указав глобальный подстановочный знак, используя библиотеку Android Beacon и аналогичные SDK.

Полное раскрытие: я являюсь ведущим разработчиком Android Beacon Library, первой реализации маяка на этой платформе.

person davidgyoung    schedule 21.04.2016
comment
Я прочитал ваше замечание об ограничении 20 UUIDS на приложение также здесь: developer.apple.com/library/ios/documentation/UserExperience/, но я должен сказать, что только что реализовал приложение, которое выполняет ранжирование для более чем 40 различных регионов (каждый с другим UUID), и оно дает у меня нет ошибки. Я использовал macbeacon вместо настоящих маяков, поэтому я могу тестировать только один UUID в секунду (без одновременных UUID). Также я использовал устройство iPhone 6s plus, и приложение работает на переднем плане. Что-то изменилось? - person dr.doom; 26.04.2016
comment
представляет собой не что иное, как применение фильтра к пакетам Bluetooth в Android. Является ли этот процесс фильтрации частью Android Beacon Library? Если да, то, учитывая огромное количество разрешенных UUID (+основной, второстепенный) и потенциально большое количество захваченных маяков в области, как такое сопоставление может быть эффективным? Я предполагаю, что это должна быть прогрессивная побайтовая схема. - person dr.doom; 26.04.2016
comment
Да, если быть более точным, ограничение в 20 регионов на iOS применяется только к API-интерфейсам мониторинга, а не к API-интерфейсам ранжирования. Но поскольку дальность обычно ограничена передним планом, важно отметить ограничение для обнаружения фона. - person davidgyoung; 26.04.2016
comment
Да, библиотека Android Beacon выполняет фильтрацию. Хотя ничто не мешает вам настроить тысячи фильтров для разных UUID, очевидно, что это будет проблемой производительности. Более масштабируемое решение — использовать полную область с подстановочными знаками (без фильтрации), чтобы увидеть все маяки независимо от UUID. - person davidgyoung; 26.04.2016