Це я зробив у програмі, яку розробляю. Таймери не працюють, коли програма знаходиться у фоновому режимі, але програма постійно отримує оновлення місцеположення. Я читав десь у документації (я не можу знайти її зараз, я опублікую оновлення, коли я це роблю), що метод можна викликати лише в активному циклі запуску, коли програма знаходиться у фоновому режимі. У делегата програми є активний цикл запуску навіть у bg, тому вам не потрібно створювати власних, щоб зробити цю роботу. [Я не впевнений, чи це правильне пояснення, але ось як я зрозумів з того, що я читав]
Перш за все, додайте location
об'єкт для ключа UIBackgroundModes
в інформаційному списку програми. Тепер, що вам потрібно зробити, це запустити оновлення місця в будь-якій точці вашої програми:
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]
Перш ніж додати це у свій додаток, ознайомтеся з Посібником з програмування поінформованості про місцезнаходження