locationManager:didEnterRegion и didExitRegion никогда не вызывают:iBeacon

Во время тестирования с маяками (устройства ios) я обнаружил, что маяк слушателя дает неожиданное поведение. locationManager: метод didEnterRegion не вызывается, даже если маяк входит в регион. Но locationManager: didRangeBeacons: inRegion: вызывается правильно, и обнаруженные маяки отображаются там.

- (void)startListening{

self.locationManager = [[CLLocationManager alloc] init];
[self.locationManager setDelegate:self];
NSUUID *myProximityUUID = [[NSUUID alloc]
                           initWithUUIDString:IDENTIFIER];
_beaconRegion = [[CLBeaconRegion alloc]
                 initWithProximityUUID:myProximityUUID
                 identifier:kPFTransmitterIdentifier];
_beaconRegion.notifyEntryStateOnDisplay = YES;
_beaconRegion.notifyOnEntry  =YES;
[self.locationManager startMonitoringForRegion:self.beaconRegion];

[self.locationManager requestStateForRegion:self.beaconRegion];
//[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];

}

это код, который я написал.

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

4 ответа

Возможно, с вашим кодом все в порядке. Я заметил, что если вы включите тестовый маяк, когда детектор уже находится в области маяка (рядом с ним), вы НЕ получите никакого уведомления о том, что вы вошли в область маяка. Скорее всего, потому что iOS не обнаружил пересечение границы. iOS, кажется, уведомляет, когда обнаруживает, что вы пересекли границу между "вне области" и "внутренней областью" (в любом направлении), и только тогда вызывает соответствующие методы делегата. Чтобы проверить это, просто включите маяк, но не включайте детектор. Затем, как указано выше на davidgyoung, отойдите на 200 футов от своего маяка. Затем включите детектор и идите к маяку. Вы должны получить уведомление "didEnterBeaconRegion" при входе в регион. Другая вещь, которую вы можете попробовать, - реализовать метод делегата locationManagerDidDetermineStateForRegion, который вызывается всякий раз, когда изменяется состояние определенной контролируемой области, что происходит всякий раз, когда вы включаете детектор. Если вы сделаете это, вы должны получить обратный вызов, даже если ваш детектор уже находится в области маяка при запуске. Но обратите внимание, что это не происходит в фоновом режиме, поэтому вам все еще нужны другие обратные вызовы.

Вот процедура устранения неполадок, которую я бы использовал:

  1. Сначала заставьте это работать на переднем плане. Запустите ваше приложение на переднем плане и выключите iBeacon (если у него нет переключателя, затем извлеките аккумулятор или отведите его на расстоянии 200 футов). Подождите 10 секунд (в это время вы должны получить уведомление о выходе из региона). затем снова включите iBeacon и убедитесь, что вы получили уведомление в регионе. Если вы не получили его, я подозреваю, что что-то не так с вашим определением обратного вызова. Если это так, пожалуйста, отправьте этот код.

  2. Как только у вас будет работать на переднем плане, попробуйте заставить его работать в фоновом режиме с помощью кнопки плеча. Всегда переводите телефон в известное состояние отсутствия в регионе, находясь на переднем плане (используя описанную выше процедуру), потому что это занимает много времени, чтобы это произошло в фоновом режиме. Как только вы узнаете, что находитесь за пределами региона, переведите свое приложение в фоновый режим, отключив экран. Затем включите свой iBeacon. Так как у вас _beaconRegion.notifyOnEntry =YES, вы должны получить обратный вызов в течение одной секунды после включения дисплея, нажав на плечо или кнопку домой.

  3. Как только у вас это заработает, вы можете позволить телефону обнаруживать присутствие на заднем плане, не нажимая кнопку плеча. Однако поймите, что это может занять больше времени, чем вы ожидаете. Смотрите это обсуждение для более подробной информации.

Вы зарегистрировали свое приложение для фоновых обновлений местоположения в файле info.plist? Вам нужно добавить строку с массивом UIBackgroundModes и добавить элемент location: См. Ссылку

Метод didEnterRegion не вызывается при использовании notifyEntryStateOnDisplay перед периодическим мониторингом. Я также проверил это условие на моем устройстве. Возможно, вы можете протестировать один раз без условия notifyEntryStateOnDisplay или notifyOnEntry. Это поможет.

Другие вопросы по тегам