Ответ 1
После нескольких месяцев испытаний и ошибок, экспериментируя с платформой Core Location, я нашел решение получить обновление местоположения, даже когда приложение было убито/приостановлено. Он отлично работает для iOS 7 и 8.
Вот решение: -
Если ваше приложение - мобильное приложение на основе местоположения, которое должно отслеживать местоположение устройства, когда оно имеет значительные изменения, iOS вернет вам некоторые координаты местоположения, когда устройство переместилось более чем на 500 метров от последнего известного местоположения. Да, даже когда приложение будет убито/приостановлено либо пользователем, либо iOS, вы все равно сможете получить обновления местоположения.
Итак, чтобы locationManager
получить обновление местоположения, даже когда приложение было убито/приостановлено, вы должны использовать метод startMonitoringSignificantLocationChanges
, вы не можете использовать startUpdatingLocation
.
Когда iOS хочет вернуть обновление местоположения в приложение, оно поможет вам перезапустить приложение и вернуть ключ UIApplicationLaunchOptionsLocationKey
в метод делегирования приложения didFinishLaunchingWithOptions
.
Ключ UIApplicationLaunchOptionsLocationKey
очень важен, и вы должны знать, как его обрабатывать. Вы должны создать новый экземпляр locationManager, когда вы получите ключ, и вы получите обновление местоположения в методе делегирования locationManager didUpdateLocations
.
Вот пример кода: -
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
self.shareModel = [LocationShareModel sharedModel];
if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {
self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
self.shareModel.anotherLocationManager.delegate = self;
self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
if(IS_OS_8_OR_LATER) {
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
return YES;
}
В дополнение к методу didFinishLaunchingWithOptions
, я создал экземпляр locationManager
, когда приложение активно. Вот несколько примеров кода:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];
if(IS_OS_8_OR_LATER) {
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if(self.shareModel.anotherLocationManager)
[self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];
self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
self.shareModel.anotherLocationManager.delegate = self;
self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
if(IS_OS_8_OR_LATER) {
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
Я написал статью, объясняющую подробности о том, как получить обновление местоположения для iOS 7 и 8, даже когда приложение будет убито/приостановлено. Я также загрузил полный исходный код GitHub с инструкциями по тестированию этого решения.
Для получения дополнительной информации посетите следующие URL: -