startMonitoringSignificantLocationChanges, но через некоторое время didUpdateLocations больше не вызывается

У меня очень странное поведение. Я пишу приложение, которое использует режим выборки и фоновый режим (не знаю, важно ли это для проблемы). Я правильно настроил CLLocationManager с делегатом и начинаю отслеживать значительные изменения местоположения (startMonitoringSignificantLocationChanges) в AppDelegate. Сразу же меня вызвали didUpdateLocations, что дает мне несколько мест. После этого события больше не запускаются, даже если я имитирую другое местоположение в XCode (также используя файл GPX), и даже я останавливаю и перезапускаю мониторинг. Я не получаю никакого местоположения как в фоновом режиме, так и на переднем плане.

Странно то, что, если я начинаю обновлять местоположения (используя GPS), он работает правильно (делает те же самые тесты... запуск и остановка точно так же, как при startMonitoringSignificantLocationChanges). Очевидно, у меня есть как didUpdateLocations, так и didFailWithError (я не получаю ошибок).

Это моя инициализация (вызывается инициализацией объекта в моем AppDelegate didFinishLaunchWithOptions):

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.pausesLocationUpdatesAutomatically = NO;

Я знаю, что distanceFilter и точность не важны для значительных изменений местоположения, и я уже установил pausesLocationUpdatesAutomatics как NO.

Я что-то пропустил? А также существует ли способ чтения, если сработало местоположение с Wi-Fi, сотовой связи или GPS?

Заранее спасибо.

2 ответа

Вы можете смоделировать местоположение для значительных изменений на симуляторе только с помощью опции "Автострада" из меню местоположения симулятора. Он будет запущен с интервалом в несколько минут.

Выделите менеджера в главном потоке и проверьте, могут ли менеджер или приложение всегда иметь разрешения. Примечание к документации Apple:

Примечание. Для обновлений местоположения с существенными изменениями требуется статус авторизации kCLAuthorizationStatusAuthorizedAlways.

Вы можете проверить статус, используя:

CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

И возможно

if (status != kCLAuthorizationStatusAuthorizedAlways)

Вы можете запросить разрешения еще раз.

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