Я сделал это в приложении, которое я разрабатываю. Таймеры не работают, когда приложение находится в фоновом режиме, но приложение постоянно получает обновления местоположения. Я где-то прочитал в документации (я не могу найти ее сейчас, я опубликую обновление, когда я это сделаю), что метод может вызываться только в активном цикле выполнения, когда приложение находится в фоновом режиме. У делегата приложения есть активный цикл выполнения даже в bg, поэтому вам не нужно создавать свой собственный, чтобы это работало. [Я не уверен, что это правильное объяснение, но вот как я понял из того, что я прочитал]
Прежде всего, добавьте location
объект для ключа UIBackgroundModes
в info.plist вашего приложения. Теперь вам нужно запустить обновление местоположения в любом месте вашего приложения:
CLLocationManager locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;//or whatever class you have for managing location
[locationManager startUpdatingLocation];
Затем напишите метод обработки обновлений местоположения, скажем -(void)didUpdateToLocation:(CLLocation*)location
, в делегате приложения. Затем реализовать метод locationManager:didUpdateLocation:fromLocation
в CLLocationManagerDelegate
в классе , в котором вы начали менеджер местоположения (поскольку мы установили местонахождение менеджер делегат «я»). Внутри этого метода вам нужно проверить, истек ли временной интервал, после которого вам придется обрабатывать обновления местоположения. Вы можете сделать это, сохраняя текущее время каждый раз. Если это время истекло, вызовите метод UpdateLocation из вашего делегата приложения:
NSDate *newLocationTimestamp = newLocation.timestamp;
NSDate *lastLocationUpdateTiemstamp;
int locationUpdateInterval = 300;//5 mins
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if (userDefaults) {
lastLocationUpdateTiemstamp = [userDefaults objectForKey:kLastLocationUpdateTimestamp];
if (!([newLocationTimestamp timeIntervalSinceDate:lastLocationUpdateTiemstamp] < locationUpdateInterval)) {
//NSLog(@"New Location: %@", newLocation);
[(AppDelegate*)[UIApplication sharedApplication].delegate didUpdateToLocation:newLocation];
[userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp];
}
}
}
Это будет вызывать ваш метод каждые 5 минут, даже если ваше приложение находится в фоновом режиме. Imp: эта реализация разряжает батарею, если точность данных о вашем местоположении не критична, вы должны использовать[locationManager startMonitoringSignificantLocationChanges]
Перед добавлением этого в ваше приложение, пожалуйста, прочитайте Руководство по программированию для определения местоположения