Obtenga actualizaciones de ubicación para la aplicación iOS incluso cuando esté suspendido

A principios de 2014, Apple actualizó iOS 7.0 a 7.1 para permitir actualizaciones de ubicación incluso cuando la aplicación no está activa en primer plano y no en segundo plano. ¿Como hacemos eso?

He leído algunos artículos, como iOS 7.1 de Apple, que solucionará un error de geolocalización . Pero Apple no proporcionó mucha comunicación relacionada con eso ni ningún código de muestra sobre cómo obtener la actualización de la ubicación incluso cuando la aplicación se mata / finaliza / suspende.

He leído las Notas de lanzamiento para iOS 7.1 . No pude encontrar nada relacionado con eso también.

Entonces, ¿cómo conseguimos la actualización de ubicación para iOS 7 y 8 incluso cuando la aplicación está suspendida?

Después de meses de pruebas y errores al experimentar el Core Location Framework, encontré la solución para obtener la actualización de la ubicación incluso cuando la aplicación se mata / suspende. Funciona bien para iOS 7 y 8.

Aquí está la solución:

Si su aplicación es una aplicación móvil basada en la ubicación que necesita monitorear la ubicación del dispositivo cuando tiene cambios significativos, el iOS le devolverá algunas coordenadas de ubicación cuando el dispositivo se haya movido a más de 500 metros de la última ubicación conocida. Sí, incluso cuando el usuario o iOS destruyen / suspenden la aplicación, aún puede obtener las actualizaciones de ubicación.

Por lo tanto, para que locationManager obtenga la actualización de la ubicación incluso cuando la aplicación se startMonitoringSignificantLocationChanges / suspenda, debe usar el método startMonitoringSignificantLocationChanges , no puede usar startUpdatingLocation .

Cuando iOS quiera devolver la actualización de ubicación a la aplicación, le ayudará a volver a UIApplicationLaunchOptionsLocationKey la aplicación y devolver una clave UIApplicationLaunchOptionsLocationKey al método delegado de la aplicación didFinishLaunchingWithOptions .

La clave UIApplicationLaunchOptionsLocationKey es muy importante y debe saber cómo manejarla. Debe crear una nueva instancia de locationManager cuando reciba la clave y obtendrá la actualización de la ubicación en el método de delegado de locationManager didUpdateLocations .

Aquí está el código de ejemplo:-

 - (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; } 

Además del método didFinishLaunchingWithOptions , he creado la instancia de locationManager cuando la aplicación está activa. Aquí hay algunos ejemplos de código:

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

He escrito un artículo explicando los detalles sobre cómo obtener la actualización de ubicación para iOS 7 y 8, incluso cuando la aplicación se mata / suspende. También cargué el código fuente completo en GitHub con los pasos para probar esta solución.

Visite las siguientes URL para obtener más información:

  1. Obtener actualizaciones de ubicación para iOS 7 y 8 cuando se mata / finaliza / suspende la aplicación
  2. Código fuente en GitHub: obtenga las actualizaciones de ubicación incluso cuando las aplicaciones móviles de iOS estén suspendidas / finalizadas / asesinadas
 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]; 

ese código de ubicación del usuario solo actualiza la aplicación forground que se ejecuta pero no ejecuta el fondo

 [locationManager requestWhenInUseAuthorization];