НАША ЦЕЛЬ С МАЯЧИКАМИ ESTIMOTE: Мы планируем установить маяки Estimote на поле для гольфа. наш сценарий - всякий раз, когда игрок достигает лунки и каков темп игры, он должен быть обнаружен маяком и ответить серверу через наше приложение для iPhone. В этом случае пользователю не нужно открывать приложение, потому что мобильный телефон у него в кармане, и он играет.
ЧТО МЫ ТАК СДЕЛАЛИ:
- Ранжирование работает только тогда, когда приложение находится только в активном состоянии. (ЦЕЛЬ НЕ ДОСТИЖЕНА).
- Для достижения этой цели мы используем мониторинг, но проблема заключается в мониторинге делегата (состояние didDetermineState: для региона :) иногда вызывается, иногда нет (вызывается: мгновенно, someDelay и никогда). Другими словами, маяки не всегда обнаруживаются iOS посредством мониторинга. (ЦЕЛЬ НЕ ДОСТИЖЕНА).
- Если мы тестируем два или более iPhone 6s с одной и той же версией iOS 10, каждый телефон дает разные результаты, одни обнаруживают, а другие нет. Для тестирования мы использовали переход в спящий режим и установку маяков в разных местах для срабатывания событий входа / выхода и минимального рекламного интервала.
- Реализован edystone на маяках estimote, они не работают, когда приложение находится в фоновом режиме. (ЦЕЛЬ НЕ ДОСТИЖЕНА).
Мы пробовали следующие решения, найденные в Интернете или на форумах estimote beacons.
Его статья от ноября 2013 г. Ibeacon monitoring но в декабре 2016 года вроде бы никакой разницы.
Мы также попытались установить фоновое ранжирование с помощью CoreLocationManager.startUpdatingLocation: Здесь и Здесь
- Мы пытались говорить с Estimote, но они ответили неоднозначно: «Мы до боли осознаем, что мониторинг iBeacon может быть немного привередливым. Мы ненавидим его так же, как и разработчики, пытающиеся создавать приложения на основе маяков, но когда дело доходит до iBeacon , мы совершенно беспомощны, потому что у Apple есть API для блокировки - нет другого способа обнаружить пакеты iBeacon на iOS, кроме как через встроенный API, который демонстрирует эти проблемы ». Вроде как-то это возможно.
Вот как я регистрирую массив маяков, в настоящее время у нас от 3 до 6 маяков.
func loadBeacons() { // Load beacons self.beacons = getAllbeacons() self.beaconManager = ESTBeaconManager() self.beaconManager.delegate = self self.beaconManager.requestAlwaysAuthorization() if self.beaconManager.isAuthorizedForMonitoring() == true { self.rangingBeaconsSetup() } else { self.beaconManager.requestAlwaysAuthorization() } } func rangingBeaconsSetup() { // SET UP Ranging beacons for beacon in self.beacons { if let beaconRegion = self.beaconRegionFromItem(beacon) { beaconRegion.notifyEntryStateOnDisplay = true self.beaconManager.startMonitoring(for: beaconRegion) self.beaconManager.startRangingBeacons(in: beaconRegion) } } } func beaconRegionFrom(_ beacon: Beacon) -> CLBeaconRegion? { // GET VALID REGION let val = 1 << 16 if let uuid = NSUUID(uuidString: beacon.uuid), beacon.major < val && beacon.minor < val { return CLBeaconRegion(proximityUUID: uuid as UUID, major: CLBeaconMajorValue(beacon.major), minor: CLBeaconMinorValue(beacon.minor), identifier: beacon.deviceName) } return nil } func beaconManager(_ manager: Any, didDetermineState state: CLRegionState, for region: CLBeaconRegion) { // Monitoring delegate. if state == .inside { let notification = UILocalNotification() notification.alertBody = "By tapping you will be able to check-in" notification.alertAction = "OK" notification.fireDate = Date() application.scheduleLocalNotification(notification) } }
Это следующие ответы, которые мы получаем, когда у нас одни и те же устройства IOS (OS 10), оба имеют несовместимое поведение.
СВЯЗАННЫЕ ВОПРОСЫ:
- Достаточно ли высоки наши ожидания относительно точности радиомаяков?
Если маяк передает данные на все телефоны, то каждое устройство должно вести себя одинаково, потому что у нас одинаковая версия IOS, тот же Iphone и тот же код. Как мы можем получить стабильные результаты Наш опыт показывает, что обнаружение варьируется «от нескольких секунд до 15 минут, а в некоторых случаях оно не обнаруживает вообще»
Что мы можем сделать, чтобы получить стабильные и надежные результаты?