didUpdateLocations продолжает вызывать каждую секунду с отложенными обновлениями

Я пытаюсь реализовать отложенные обновления местоположения, чтобы иметь лучшее потребление батареи. Я начинаю свой менеджер местоположения, как это:

- (void)initCoreLocation
{
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.pausesLocationUpdatesAutomatically = YES;
    self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;

    //Très important pour iOS9 !
    if ([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) {
        self.locationManager.allowsBackgroundLocationUpdates=YES;
    }

    if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [self.locationManager requestAlwaysAuthorization];
    }

    [self.locationManager startUpdatingLocation];
    [self.locationManager startMonitoringSignificantLocationChanges];
}

И запустить отложенное обновление следующим образом:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{

    if (!self.deferringUpdates) {
        [self.locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:30];
        self.deferringUpdates = YES;
    }
}

-(void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error { // Stop deferring updates
    if(error) {
        NSLog(@"error");
    }
    NSLog(@"didFinishDeferredUpdates");
    self.deferringUpdates = NO;
}

я имею didFinishDeferredUpdates Журнал каждые 30 секунд, однако didUpdateLocations продолжает звонить каждую секунду, убирая любые попытки оптимизировать расход батареи. Предполагается ли диспетчеру местоположения позвонить didUpdateLocations каждые 30 секунд?

3 ответа

Вы отлаживаете?

Как указано в ответе здесь: отложенные обновления местоположения ios не могут быть отложены

Отложенные обновления доставляются только тогда, когда система переходит в состояние низкого энергопотребления. Отложенные обновления не происходят во время отладки, потому что XCode препятствует тому, чтобы Ваше приложение спало и таким образом препятствует тому, чтобы система вошла в то состояние низкого энергопотребления.

Может быть, у вас нет правильного подхода, как allowDeferredLocationUpdatesUntilTraveled() приказывает оборудованию GPS хранить новые местоположения внутри до тех пор, пока не будут соблюдены указанное расстояние или время ожидания.

Из библиотеки разработчиков iOS:

Если ваше приложение находится на переднем плане, диспетчер местоположений не откладывает доставку событий, но отслеживает указанные критерии. Если ваше приложение переходит в фоновый режим до того, как критерии будут выполнены, менеджер местоположения может начать откладывать доставку событий. Ссылка на сайт

Я считаю, что вам нужен только один из них одновременно, измените вызов в applicationDidEnterBackground а также applicationWillEnterForeground

- (**void)applicationDidEnterBackground:(UIApplication *)application {

    // Need to stop regular updates first
    [self.locationManager stopUpdatingLocation];
    // Only monitor significant changes
    [self.locationManager startMonitoringSignificantLocationChanges];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    [self.locationManager stopMonitoringSignificantLocationChanges];
    [self.locationManager startUpdatingLocation];
}
Другие вопросы по тегам