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)
Вы можете запросить разрешения еще раз.