Я сделал это в разрабатываемом приложении.Таймеры не работают, когда приложение находится в фоновом режиме, но приложение постоянно получает обновления местоположения.Я прочитал где-то в документации (я не могу найти его сейчас, я опубликую обновление, когда я это сделаю), что метод может быть вызван только в активном цикле выполнения, когда приложение находится в фоновом режиме.У делегата приложения есть активный цикл выполнения даже в bg, поэтому вам не нужно создавать свой собственный, чтобы это работало.[Я не уверен, что это правильное объяснение, но вот как я понял из того, что я прочитал]
Прежде всего, добавьте объект 'location' для ключа 'Background Modes' в 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 в классе, в котором вы запустили диспетчер расположений (поскольку мы установили делегат менеджера расположений в 'self').В этом методе вы должны проверить, истек ли временной интервал, после которого вы должны обрабатывать обновления местоположения.Вы можете сделать это, сохраняя текущее время каждый раз.Если это время истекло, вызовите метод 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]
Перед добавлением этого в ваше приложение, пожалуйста, прочитайте Руководство по программированию осведомленности о местоположении на http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html