iBeacon мониторинг и ранжирование в фоновом режиме

Я потратил несколько месяцев на разработку приложения на основе iBeacons, и я очень расстроен.

Общая идея заключается в том, что при обнаружении маяка пользователь уведомляется с информацией, относящейся к этому iBeacon.

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

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

Я знаю, что приложение будет запускаться в фоновом режиме в течение примерно 5 секунд, когда вы входите или выходите из области маяка. Здесь вы можете выполнить ранжирование в фоновом режиме в течение этого пятисекундного периода, после которого iOS снова приостановит ваше приложение.

Мне удалось продлить диапазон до 3 минут в фоновом режиме с техникой, изученной здесь. Я также получаю дополнительный обратный вызов с notifyEntryStateOnDisplay = YES;

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

Нет ли реального решения в подобном сценарии? Я думаю, что это очень распространенный сценарий, и я удивлен, что никак не могу с ним справиться.

Отредактировано: я пытался найти решение проблемы путем мониторинга двух регионов, как рекомендовал Дэвид Янг в своем ответе. Для того, чтобы получить больше событий регионов входа / выхода.

Я добавил код, который реализовал, чтобы попытаться отслеживать два региона.

но что-то я сделал неправильно, а didRangeBeacons: InRegion: обратный вызов срабатывает каждые 10 мс, когда ожидаемое значение составляет каждую секунду.

НаAppDelegate.mЯ делаю следующее внутриdidFinishLaunchingWithOptions:

[self.locationManager startMonitoringForRegion:self.beaconRegion];
        [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
        [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
        [self.locationManager startMonitoringForRegion:self.beaconRegion2];
        [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion2];
        [self.locationManager startRangingBeaconsInRegion:self.beaconRegion2];

Затем наdidRangeBeacons:InRegion:

- (void) locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region{

     if(beacons.count > 0){
          [self.locationManager stopRangingBeaconsInRegion:region];
          for (CLBeacon *beacon in beacons){
             NSLog(@"beacon detected major: %@ minor: %@", beacon.major,beacon.minor);
          }
           [self.locationManager startRangingBeaconsInRegion:region];   
     }

}

Когда я запускаю приложение на симуляторе, и в каждом диапазоне есть маяк, сообщение появляется на консоли примерно каждые 10 мс.

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

Ответы на вопрос(2)

Ваш ответ на вопрос