iBeacon отслеживает несколько маяков с одинаковым UUID и разными основными, второстепенными

У меня есть несколько iBeacon с одним и тем же UUID, но разными старшими и второстепенными номерами. Это могут быть разные комбинации для мажора и минора, но UUID остается прежним. Скажем, например,

  • устройство №1 — UUID xyz, старший 1, второстепенный 1
  • устройство №2 — UUID xyz, старший 1, второстепенный 2
  • устройство №3 — UUID xyz, старший 2, второстепенный 1
  • .....
  • устройство #n - UUID xyz, старший 10, младший 1

Кроме того, эти iBeacons расположены в непосредственной близости, в пределах от 1 до 50 футов. Следовательно, их области могут пересекаться друг с другом.

В моем приложении для iOS я хочу обнаружить все iBeacon с одним и тем же UUID в области, а затем выполнить итерацию по ним и прочитать основные и второстепенные значения каждого из них, чтобы определить, какой из них был обнаружен.

Могу ли я использовать init(proximityUUID: UUID, identifier: String) с моим UUID, а затем перебирать их?


person chathuram    schedule 19.02.2019    source источник


Ответы (2)


Существует два разных API iOS CoreLocation, и вам нужно будет использовать первый для этой цели:

<сильный>1. Диапазон маяка (что вы хотите)

Вы вызываете locationManager.startRangingBeacons(in: region) с определением региона, которое оставляет основной и дополнительный нуль. Конструктор, который вы показываете init(proximityUUID: UUID, identifier: String), делает именно это.

Это даст вам обратный вызов locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) один раз в секунду с массивом всех объектов CLBeacon, которые соответствуют определению вашего региона. Вы можете перебрать этот массив, чтобы увидеть их все.

<сильный>2. Мониторинг маяков (что вам не нужно)

Вы вызываете locationManager.startMonitoring(region: region) с определением региона, которое оставляет основной и второстепенный ноль.

Это даст вам обратный вызов locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) или эквивалентного метода didExitRegion каждый раз, когда появляется хотя бы один маяк, соответствующий определению региона, или все маяки, соответствующие региону, исчезают.

Это не позволит вам перебирать все совпадающие маяки, поскольку обратный вызов включает только определение региона, а не список совпадающих маяков.

person davidgyoung    schedule 19.02.2019
comment
Спасибо за подробный ответ. Если я хочу знать, находится ли один из iBeacons вне диапазона, поскольку я не слушаю обратный вызов didExitRegion, должен ли я периодически вызывать startMonitoring, чтобы вручную проверить, покинул ли я регион с определенным Major и Minor? - person chathuram; 19.02.2019
comment
Нет, API так не работает. Если вы хотите знать, исчез ли конкретный крупный второстепенный объект, вы должны настроить новый регион для отслеживания этого после того, как конкретный маяк будет выбран, но вы должны сделать это только один раз. Но имейте в виду, что вы ограничены максимум 20 регионами мониторинга, поэтому вы не должны превышать этот лимит и должны прекращать мониторинг после исчезновения каждого из них. запускайте свою логику вне диапазона, когда одна временная метка закончилась, скажем, 10 секунд назад. - person davidgyoung; 20.02.2019
comment
Кроме того, имейте в виду, что мониторинг маяков очень эффективен, особенно подходит для прослушивания маяков, когда приложение не активно. Хорошей практикой является отслеживание маяков и запуск дальности при обнаружении маяка. - person Devous; 20.02.2019

Да, вы определенно можете! Вы не будете получать уведомления о новых делегатах при обнаружении другого iBeacon, если только вы не создадите несколько прослушивателей с разными идентификаторами, но как только вы окажетесь в регионе данного UUID, вы можете перебрать все маяки в пределах диапазона и получить их основные и второстепенные

person Devous    schedule 19.02.2019