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 мс.
Я подозреваю, что остановка и повторный запуск ранжирования нарушают ожидаемый поток обратного вызова, но когда в диапазоне находится только одна область, обратные вызовы происходят каждую секунду, как и ожидалось.