LocationManager: didEnterRegion не вызывается при обнаружении маяка
Во время тестирования с помощью маяков (устройств iOS) я обнаружил, что маяк-слушатель вызывает неожиданное поведение. locationManager: didEnterRegion метод не вызывается, даже если маяк входит в регион. Но locationManager: didRangeBeacons: inRegion: получает правильное имя, и там отображаются обнаруженные маяки. Кто-нибудь испытал что-то подобное.
Ответы
Ответ 1
Проверьте, реализованы ли ваши методы следующим образом.
В viewDidLoad
начните размножение в конце
self.beaconRegion.notifyOnEntry=YES;
self.beaconRegion.notifyOnExit=YES;
self.beaconRegion.notifyEntryStateOnDisplay=YES;
[self.locationManager startMonitoringForRegion:self.beaconRegion];
после запуска мониторинга, состояние запроса для определенной области
- (void) locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
[self.locationManager requestStateForRegion:self.beaconRegion];
}
после определения состояния, запуск маяков
-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
if (state == CLRegionStateInside)
{
//Start Ranging
[manager startRangingBeaconsInRegion:self.beaconRegion];
}
else
{
//Stop Ranging here
}
}
и реализуйте следующие методы в соответствии с вашими потребностями...
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
[email protected]"Entered region";
}
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
[email protected]"Exited region";
}
-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
if(beacons.count>0)
{}
}
Надеюсь, это решит вашу проблему.
Ответ 2
before starting coding in project , you must follow given setup guidlines -->
1. in project info or info.plist -->
Custom IOS Target Properties -->
. add "Required background modes"
. in this add two items -->
."App shares data using CoreBluetooth"
."App registers for location updates"
2. in project Capability -->
There is Background Modes
. check "Loaction update"
. check "Acts as a Bluetooth LE accessory"
. check "uses bluetooth LE accessories"
(и следуйте инструкциям, данным г-ном Дэвидмином. поверьте мне, это определенно сработает.)
Ответ 3
Трудно сказать, видел ли я ту же самую вещь без каких-либо особенностей относительно условий начала теста. Но, да, в некоторых конкретных случаях я видел locationManager: didRangeBeacons: inRegion вызывается даже без обращения к locationManager: didEnterRegion.
Если вы начинаете ранжирование и мониторинг одновременно с одним и тем же регионом, и iOS считает, что вы уже находитесь в контролируемом регионе, тогда вы не можете позвонить в locationManager: didEnterRegion.
Чтобы действительно проверить, если что-то не так, вам нужно настроить тестовый пример, где вы:
- Убедитесь, что вы не находитесь в регионе.
- Пусть iOS работает в течение нескольких минут
- Начать мониторинг этого региона
- Пусть iOS продолжит работать в течение нескольких минут
- Введите регион.
- Посмотрите, есть ли у вас вызов locationManager: didEnterRegion
Если вы все еще не получаете вызов после прохождения вышеуказанного, то что-то определенно неправильно.
Ответ 4
Вам также необходимо знать, что вы контролируете область - не отдельные маяки.
Итак, если у вас есть 3 маяка, которые имеют один и тот же proximityUUID
, и ваш регион определяется как только proximityUUID
(без основных и второстепенных значений), вы получите уведомление только в двух ситуациях:
-
Никакие маяки из региона не были в зоне действия, а первые маяки/маяки
обнаружено (didEnterRegion:
)
-
Один или несколько маяков из региона находились в радиусе действия, и все они скрылись из поля зрения
~ 30 секунд (didExitRegion:
)