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

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

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

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

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

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

Я что-то упустил? А также существует ли способ читать, если увольнение локации происходит из Wi-Fi, сотового или gps?

Спасибо заранее.

Ответ 1

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

Ответ 2

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

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

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

CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

И, может быть,

if (status != kCLAuthorizationStatusAuthorizedAlways)

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