Сценарий универмага iBeacon — ранжирование и мониторинг

Итак, мы пытаемся составить сценарий с iBeacons, и я думаю, что мы застряли с различиями между ранжированием и мониторингом в фоновом режиме, и теперь я не уверен, что мы хотим сделать, это возможно.

У нас есть 500 магазинов, в которых мы хотим развернуть iBeacons. Цель маяка — поприветствовать клиента уведомлением и купоном (иногда). Что мы хотели бы сделать, так это использовать один UUID, где основной номер — это номер магазина, а второстепенный — тип магазина (обычный магазин против детского. Магазин для детей может быть подключен к обычному магазину). В идеале, как только iBeacon с нашим UUID будет найден, мы хотели бы, чтобы наше приложение извлекло XML-файл с нашего веб-сайта, относящийся к основному номеру (номеру магазина), отобразило приветственное сообщение с уведомлением (возможно, с указанием «у нас есть купон для вас» в зависимости от того, что говорит файл xml), и сохраните данные файла xml в приложении, чтобы пользователь мог получить купон, если он откроет приложение. Все это кажется возможным с приложением на переднем плане, но нам, похоже, трудно заставить его работать в фоновом режиме. Возможно ли то, что я описываю, и должен ли я думать о другом способе сделать это?

Спасибо


person causerie    schedule 08.12.2013    source источник


Ответы (1)


Да, ты можешь это сделать. Хитрость заключается в том, что вам нужно одновременно сочетать и ранжирование и мониторинг. Мониторинг необходим для запуска вашего приложения в фоновом режиме. Ранжирование необходимо для получения конкретных идентификаторов маяков, которые вы видите.

Настройте это так:

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"blah"];
region.notifyOnEntry = YES;
[self.locationManager startMonitoringForRegion:region]; 
[self.locationManager startRangingBeaconsInRegion:region]; 

Как только это произойдет, вы получите диапазонные обратные вызовы в течение примерно пяти секунд, прежде чем приложение снова перейдет в спящий режим, и этот метод будет вызываться один раз в секунду:

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    if (!_firstOneSeen) { 
      _firstOneSeen = true;
      // Do something with beacons array here.  read out the major/minor and get the 
      // notification message from your XML web service                   
   }
}

Два предостережения:

  1. Мониторинг регионов iBeacon в фоновом режиме может быть немного сложным, и получение обратных вызовов может занять больше времени, чем вы думаете. См. это подробное обсуждение.< /а>

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

Моя компания, Radius Networks, создает библиотеку и веб-службу под названием ProximityKit, которая выполняет предварительное кэширование маяков. определенные пары ключ/значение, которые вы можете настроить в своем веб-браузере. Таким образом, вам не нужно писать веб-службу самостоятельно.

person davidgyoung    schedule 08.12.2013
comment
Дэвид, меня интересует одна вещь: можно ли отслеживать маяки, а затем в вашем методе didEnterRegion начать ранжирование? Будете ли вы по-прежнему получать вызовы дальности, когда didEnterRegion срабатывает в фоновом режиме? Я не пробовал, и думаю, будет ли это работать. - person Duncan C; 09.12.2013
comment
Я не пробовал, но думаю, что это сработает. Недостатком этого подхода является то, что вы потеряете одну секунду времени фоновой обработки. Кроме того, это будет иметь эффект, аналогичный простому запуску ранжирования с самого начала, потому что через четыре секунды ваше приложение будет переведено в спящий режим в фоновом режиме. Ранжирование все равно включено! На самом деле нет причин не включать Ranging с самого начала — это не приводит к тому, что сканирование происходит чаще в фоновом режиме, поэтому это не влияет на батарею. - person davidgyoung; 09.12.2013
comment
Идеальный ответ!. Я хотел бы добавить дополнительную информацию о том, что приложение работает в фоновом режиме в течение 10 секунд (проверено в iOS9) при запуске с помощью события мониторинга. - person deepax11; 27.02.2017