Подтвердить что ты не робот

Мониторинг области iBeacon и близость для> 20 маяков?

Я работал над прототипом приложения iOS, использующим iBeacons, чтобы предоставлять информацию о местоположении для сотрудников офиса в зависимости от того, где они находятся в офисе. Идеальный вариант использования заключается в том, что всякий раз, когда сотрудник входит или выходит из своего офиса, происходит обратный вызов, который предоставляет им некоторую информацию в форме уведомления (это может сделать запрос сервера для получения информации в первую очередь и т.д.). Мы также хотим, чтобы это было возможно, когда приложение было основано или завершено; к счастью, мы уже знаем, что пересечения границ области маяка инициируют соответствующие обратные вызовы CoreLocation, даже если приложение зашифровано или приостановлено.

От взгляда вокруг, я понимаю, что в целом у меня есть два варианта подхода к мониторингу зоны маяка:

  • Предоставьте каждому iBeacon собственный CLBeaconRegion и независимо от монитора для каждой из этих областей.
  • Монитор для CLBeaconRegions, который соответствует нескольким iBeacons - например, каждый iBeacon имеет тот же UUID и только монитор для CLBeaconRegion, соответствующий этому UUID, - затем попытайтесь определить, какой маяк инициировал пересечение границы с использованием ранжирования.

До сих пор я выбрал вариант №1. Преимущество этого подхода в том, что я получаю didEnterRegion: и didExitRegion: вызывает для каждого отдельного маяка и сразу же узнает, какой маяк я ввел/выходил. Кроме того, я получаю только один входящий вызов и один вызов выхода, который именно то, что я хочу. К сожалению, я просто понял, что этот подход также ограничивает меня 20 маяками (поскольку каждый маяк получает свой собственный регион).

Я не так хорошо знаком с точными деталями реализации №2, поэтому исправьте меня, если я ошибаюсь. Но похоже, что этот подход имеет больше недостатков:

  • Apple обескураживает, когда приложение находится в фоновом режиме, потому что результаты могут быть не такими точными.
  • Ранжирование звонков запускается раз в секунду, в то время как я хочу только иметь "входящие/исходящие" обратные вызовы.
  • Если маяки имеют перекрытие области, вызовы ранжирования могут постоянно переворачиваться, что является "ближайшим", что еще больше усложнит ситуацию.

В принципе, мне интересно, есть ли способ использовать опцию № 2, но все еще имеют преимущества опции № 1 - быстрый и простой способ сразу определить, какой маяк вызвал изменение региона, только с одним входом или выходом Перезвони?

Надеюсь, этот вопрос достаточно ясен. Это не все полностью ясно в моей голове, особенно в том, как работает ранжирование.

4b9b3361

Ответ 1

Вариант № 2 является абсолютно более сложным, но вы должны принять эти осложнения, чтобы обойти ограничение на 20 регионов.

Несколько точек:

  • В фоновом режиме у вас есть только около 5 секунд времени ранжирования, что не дает вам столько времени, чтобы усреднить RSSI (уровень сигнала) от каждого маяка, чтобы получить хорошую оценку расстояния. Итак, да, оценки будут менее точными. Если вы понимаете это ограничение и можете жить с ним для вашего случая использования, нет ничего плохого в выборе диапазона в фоновом режиме.

  • Да, вы получите несколько звонков с диапазоном на маяк после входа в регион, и вы не получите никаких обратных вызовов при выходе из региона. Вы должны написать дополнительный код, чтобы позаботиться об этом. Я сделал это, сохранив NSMutableArray всех уникальных маяков (таких же uuid/major/minor) и обновил их в диапазоне обратного вызова. Затем вы можете получить доступ к этому массиву в обратном вызове exit, так что вы знаете, какие маяки исчезли. Конечно, возможно, что дополнительные маяки были видны после того, как истечет 5 секунд времени фонового времени, но ваше приложение никогда не узнает о них. С помощью этой опции вы должны принять это ограничение.

  • Хотя верно, что ошибки в оценке расстояния в ранжировании могут неправильно сообщать вам, какой маяк ближайший, у вас еще хуже проблема при мониторинге, потому что вы не получаете оценку расстояния вообще. Если несколько контрольных сигналов попадают в диапазон мониторинга примерно в одно и то же время, нет гарантии, что первый обратный вызов, который вы получили, будет для ближайшего маяка. Поэтому, если ваш случай использования требует принятия мер на основе ближайшего маяка, тогда вы должны делать ранжирование (зная, что может быть ошибка в оценке расстояния.)

Ответ 2

Недостатком второго подхода является обнаружение входа конкретного маяка будет чисто основано на ранжировании, которое не будет работать, если приложение будет убито. Причина в том, что мы получим didEnterRegion только один раз, потому что мы контролируем только один регион с определенным UID. Следующий маяк с тем же UID не будет обнаружен снова, если приложение будет завершено или если фоновая настройка остановлена.

Я рекомендую комбинацию упомянутых подходов,

  • Используйте тот же UID для всех маяков.

  • Маяк уникально идентифицируется с использованием основного/младшего значения, которое собирается при ранжировании.

  • Как упоминалось в apple doc, всегда держите количество областей мониторинга ниже 20, удаляя и добавляя маяки, когда пользователь переходит от маяка к маяку (лучше сохранить график отношений соседнего маяка на сервере).

  • Начать настройку при входе в регион... и определить основные/второстепенные и подсчитать близость.

  • Остановка диапазона при выходе из региона.
  • Найдите ближайший маяк от метода ранжирования (необходимо пропустить неизвестные диапазоны диапазона).
  • Следить за соседними соседями ближайшего маяка за определенное время.

При реализации обоих вариантов мы должны рассмотреть один факт: iBeacon будет обнаружен на расстоянии 200 футов. Может быть несколько маяков в диапазоне 200feet.

Ответ 3

Если вы используете один и тот же UUID для каждого маяка, вы можете просто установить основные/младшие числа, чтобы различать различные маяки. Таким образом, вы контролируете только 1 маяк вместо > 20. Затем просто выберите, какой из них - из других идентификаторов. Вот как это работает в настоящее время с Starbucks и другими приложениями для розничной торговли. 1, независимо от того, где вы находитесь в мире, и разных идентификаторов для сортировки на заднем конце.