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:)