Получать обновления местоположения для приложения iOS, даже когда приостановлено
В начале 2014 года Apple обновила iOS 7.0 до 7.1, чтобы разрешить обновления местоположения, даже когда приложение не активно на переднем плане и не в фоновом режиме. Как мы это делаем?
Я читал некоторые статьи, такие как Apple iOS 7.1, чтобы исправить ошибку геолокации. Но Apple не предоставила много информации, связанной с этим, ни пример кода о том, как получить обновление местоположения, даже когда приложение было убрано / завершено / приостановлено.
Я прочитал заметки о выпуске для iOS 7.1. Я не мог найти что-либо связанное с этим также.
Итак, как нам получить обновление местоположения для iOS 7 и 8, даже если приложение приостановлено?
2 ответа
После нескольких месяцев проб и ошибок в результате экспериментов с Core Location Framework я нашел решение для получения обновления местоположения, даже когда приложение было убито / приостановлено. Это хорошо работает для 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 для получения дополнительной информации:-
locationManager = [[CLLocationManager alloc] init];
#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
if(IS_OS_8_OR_LATER)
{
[locationManager requestWhenInUseAuthorization];
}
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; //whenever we move
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
[locationManager startUpdatingLocation];
этот код пользователя обновляет местоположение только для запущенного приложения, но не в фоновом режиме
[locationManager requestWhenInUseAuthorization];