отложенные обновления местоположения ios не могут отложить

Я изучаю использование отложенных обновлений местоположения для трекера активности iOS, который позволяет службам определения местоположения работать в фоновом режиме. Я реализовал предложенные фрагменты кода (см. Ниже). В отладке XCode отложенные местоположения пытаются начать несколько раз, пока данные местоположения не входят приблизительно в 1 в секунду. После этого он утверждает, что преуспел в запуске отсрочек, и обратный вызов для триггера финиша также завершается успешно после истечения указанного периода времени. Однако в течение этого времени обработчик местоположения все еще выполняется один раз в секунду. Я читал, что это потому, что телефон не считает себя готовым войти в фоновый режим, и что тестирование в XCode делает это. Обратите внимание, что обработчик события "didEnterBackground" в AppDelegate вызывается сразу при выключении экрана и возобновляется при повторном открытии приложения.

Я запустил тот же код с отключенным телефоном, как в другом тесте, рядом с окном с GPS, выключенным экраном или переключением на совершенно другие приложения, и он все еще фактически не откладывает обновления. Я могу сказать, потому что сетевое обновление по-прежнему происходит каждые 30 секунд вместо интервала в 120 секунд, который требуется в приведенном ниже примере кода.

Что еще нужно для того, чтобы на самом деле заставить работать отсрочку, поскольку при их запуске не происходит ошибок, и они действительно получают свой завершающий обратный вызов? Почему обновления местоположения продолжаются со скоростью 1 в секунду, даже если приложение переходит в фоновый режим?

Iphone 5s, IOS 7.1.1

// .h file (partial)
@interface MotionTracker : NSObject<CLLocationManagerDelegate, UIAccelerometerDelegate> 

@property (strong, nonatomic) CLLocationManager *locationManager;

@end

// .m file (parial)
- (id) init {
    if(self = [super init]){
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.distanceFilter = kCLDistanceFilterNone; 
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;

        // if set to YES (default), app stops logging location at some point and doesn't resume in any timely fashion, all data points lost in between
        _locationManager.pausesLocationUpdatesAutomatically = NO;

        _locationManager.activityType = CLActivityTypeFitness; 
    }
    return self;
}

// called early in program after login confirmed
- (void) startCollectingLocation {
    [_locationManager startUpdatingLocation];
}    

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

    // logs to file when device is not in debug
    // always returns 1
    NSLog(@"Location update count: %d",[locations count]);

    // some code here to handle location updates
    // - collect key location day in NSDictionary
    // - every N seconds send Network call to server to save (have tried 30 seconds, 15 minutes, 30 minute network intervals). Have also tried turning off network calls completely.


    // deferred updates starter
    if (!self.deferringUpdates) {
        if([CLLocationManager deferredLocationUpdatesAvailable]){
            [_locationManager allowDeferredLocationUpdatesUntilTraveled:500 timeout:(NSTimeInterval)120]; // (have also tried large numbers, and "Infinite"
            self.deferringUpdates = YES;
            NSLog(@"Deferred updates start");
        } else {
            NSLog(@"Deferred updates not available");
        }
    }
}

- (void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error {
    if(!error){
        _deferringUpdates = NO;
        NSLog(@"Deferred updates: finished");
    } else {
        _deferringUpdates = NO;
        NSLog(@"Deferred updates: %@", [error localizedDescription]);
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос