отложенные обновления местоположения 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]);
}
}