Получите обновления местоположения для приложения iOS, даже когда приостановлено

В начале 2014 года Apple обновила iOS 7.0 до 7.1, чтобы разрешить обновление местоположения даже тогда, когда приложение неактивно на переднем плане, а не в фоновом режиме. Как мы это делаем?

Я прочитал несколько статей, таких как Apple iOS 7.1 исправит ошибку геолокации. Но Apple не предоставляла много сообщений, связанных с этим, ни какой-либо пример кода о том, как получить обновление местоположения, даже когда приложение было убито/прекращено/приостановлено.

Я прочитал Примечания к выпуску для iOS 7.1. Я тоже не мог найти ничего связанного с этим.

Итак, как мы действительно получаем обновление местоположения для iOS 7 и 8, даже когда приложение приостановлено?

Ответ 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: -

Ответ 2

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];