Маячки Estimote не работают на Iphone должным образом

НАША ЦЕЛЬ С МАЯЧИКАМИ ESTIMOTE: Мы планируем установить маяки Estimote на поле для гольфа. наш сценарий - всякий раз, когда игрок достигает лунки и каков темп игры, он должен быть обнаружен маяком и ответить серверу через наше приложение для iPhone. В этом случае пользователю не нужно открывать приложение, потому что мобильный телефон у него в кармане, и он играет.

ЧТО МЫ ТАК СДЕЛАЛИ:

  1. Ранжирование работает только тогда, когда приложение находится только в активном состоянии. (ЦЕЛЬ НЕ ДОСТИЖЕНА).
  2. Для достижения этой цели мы используем мониторинг, но проблема заключается в мониторинге делегата (состояние didDetermineState: для региона :) иногда вызывается, иногда нет (вызывается: мгновенно, someDelay и никогда). Другими словами, маяки не всегда обнаруживаются iOS посредством мониторинга. (ЦЕЛЬ НЕ ДОСТИЖЕНА).
  3. Если мы тестируем два или более iPhone 6s с одной и той же версией iOS 10, каждый телефон дает разные результаты, одни обнаруживают, а другие нет. Для тестирования мы использовали переход в спящий режим и установку маяков в разных местах для срабатывания событий входа / выхода и минимального рекламного интервала.
  4. Реализован edystone на маяках estimote, они не работают, когда приложение находится в фоновом режиме. (ЦЕЛЬ НЕ ДОСТИЖЕНА).

Мы пробовали следующие решения, найденные в Интернете или на форумах estimote beacons.

  1. Его статья от ноября 2013 г. Ibeacon monitoring но в декабре 2016 года вроде бы никакой разницы.

  2. Мы также попытались установить фоновое ранжирование с помощью CoreLocationManager.startUpdatingLocation: Здесь и Здесь

  3. Мы пытались говорить с Estimote, но они ответили неоднозначно: «Мы до боли осознаем, что мониторинг iBeacon может быть немного привередливым. Мы ненавидим его так же, как и разработчики, пытающиеся создавать приложения на основе маяков, но когда дело доходит до iBeacon , мы совершенно беспомощны, потому что у Apple есть API для блокировки - нет другого способа обнаружить пакеты iBeacon на iOS, кроме как через встроенный API, который демонстрирует эти проблемы ». Вроде как-то это возможно.
  4. Вот как я регистрирую массив маяков, в настоящее время у нас от 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)
       }
      }
    
  5. Это следующие ответы, которые мы получаем, когда у нас одни и те же устройства IOS (OS 10), оба имеют несовместимое поведение.

Несогласованный ответ на двух разных устройствах

СВЯЗАННЫЕ ВОПРОСЫ:

  1. Достаточно ли высоки наши ожидания относительно точности радиомаяков?
  2. Если маяк передает данные на все телефоны, то каждое устройство должно вести себя одинаково, потому что у нас одинаковая версия IOS, тот же Iphone и тот же код. Как мы можем получить стабильные результаты Наш опыт показывает, что обнаружение варьируется «от нескольких секунд до 15 минут, а в некоторых случаях оно не обнаруживает вообще»

  3. Что мы можем сделать, чтобы получить стабильные и надежные результаты?


person Faraz Ahmed    schedule 08.12.2016    source источник


Ответы (1)


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

Теоретически вы должны иметь возможность получить обратный вызов мониторинга, который будит ваше приложение в фоновом режиме и позволяет ему работать в фоновом режиме в течение 10 секунд (с возможностью увеличения до 3 минут, если вы используете этот метод) каждый раз, когда маяк впервые обнаруживается в контролируемой области или каждый раз все маяки перестают обнаруживаться в зоне наблюдения. Это вызовет обратный вызов didEnterRegion или didExitRegion.

Как вы видели, иногда эти обратные вызовы не приходят, когда ожидалось. Для этого есть две основные причины:

  1. Вы не получаете обратный вызов при входе или выходе, потому что состояние региона не изменилось. Это часто случается, когда iOS считает, что он всегда находился внутри региона CLBeacon, в то время как тестировщик приложений ненадолго удалил устройство iOS из непосредственной близости от маяка (либо переместив телефон, либо выключив маяк), а затем вернул его в регион. Неспособность получить последовательность выхода / входа в этом случае часто возникает из-за того, что iOS не дается достаточно времени для обнаружения выхода из региона. В фоновом режиме это может занять до 15 минут. В большинстве случаев это чисто проблема тестирования, а не проблема, с которой столкнутся ваши настоящие пользователи - тестировщики не могут выполнить свои тесты, поэтому они часто просто не ждут достаточно долго. эти тестовые случаи. Добавление журналов, уведомлений или другой информации о том, когда происходит выход из региона, может помочь вашим тестерам убедиться, что они ждут достаточно долго.

  2. Вы не получите быстрый обратный вызов входа, потому что все слоты аппаратного ускорения заполнены. Чтобы обнаружить причины и отправить didEnterRegion обратные вызовы в течение секунды или двух, iOS использует аппаратные фильтры Bluetooth для пробуждения ОС при обнаружении интересующего маяка. Проблема в том, что эти аппаратные фильтры являются дефицитным ресурсом, и если они исчерпаны другими приложениями, которые были сначала установлены на телефоне, ваше приложение не получит к ним доступа, а это означает, что время обнаружения вернется к сканированию программного обеспечения, которое может занять до 15 минут. Невозможно узнать, был ли вашему приложению предоставлен доступ к этим аппаратным фильтрам, и даже удаление и повторная установка приложения на вашем телефоне может изменить, так ли это, что приведет к несогласованным результатам. Количество доступных фильтров недокументировано, но некоторые данные свидетельствуют о том, что число 30, то есть только первые 30 CLBeaconRegions отслеживаемых на телефоне получают приоритетный доступ.

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

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

person davidgyoung    schedule 08.12.2016