Feb.22

Como arreglar las Apps con fallos de localización (CoreLocation) en IOS8

Como arreglar las Apps con fallos de localización (CoreLocation) en IOS8

La historia es la siguiente, tienes una App de IOS que usa los servicios y facilidades de CoreLocation y que funciona perfectamente. De repente los usuairos empiezan a reportarte errores, no funciona la localización,  no carga el mapa, etc. y el denominador común es que todos han actualizado sus sistemas a  a IOS 8. Repasas el código buscando errores propios y no encuentras nada…un consejo…no pierdas el tiempo porque el error no esta en tu código anterior.

Apple tiene la irritante costumbre de pasarse por el arco del triunfo con cierta frecuencia la retrocompatibilidad de las Apps ya publicadas y probadas ante actualizaciones importantes de IOS. Introducen cambios que obligan al desarrollador a cambiar el código de sus apps ya aprobadas y publicadas…y lo hacen bastante a menudo. Cada vez que llega una actualización realmente importante yo tiemblo…

En este caso le ha tocado a CoreLocation, las apps desarrolladas para IOS 7 y anteriores que utilizan esas librerías deben ser reescritas en parte ya que en iOS 8, este código no sólo falla, sino que falla en silencio. El usuario no recibirá ningún error o advertencia, no siempre obtendrá una actualización de posición y no se entiende por qué. La app ni siquiera le pedirá permiso para usar ubicación. Tengo experiencia con Core Location, bastante, y la verdad es que me llevo mas de un día averiguar el porque de este comportamiento y dar con la solución.

El CLLocationManager, introducido en IOS2, siempre ha trabajado de la misma manera: Crear, delegar, empezar, esperar. Hasta IOS7 esto ha seguido funcionando sin problemas.

// Import CoreLocation framework

// Crear
self.locationManager = [[CLLocationManager alloc] init];
// Delegar
self.locationManager.delegate = self;
// Empezar
[self.locationManager startUpdatingLocation];

// Esperar
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    NSLog(@"%@", [locations lastObject]);
}

Sin embargo, en iOS 8 hay ademas que hacer cosas adicionales para obtener la ubicación.Hay que agregar una clave para su autorización en el Info.plist de la APP. Realmente hay dos claves Info.plist para la nueva autorización ubicación, a partir de ahora es obligatorio al menos tener una de las dos definidas. Si ninguna están ahí, se puede llamar a startUpdatingLocation sin error alguno pero en realidad el LocationManager en no se iniciará, y no dará error…

Así que lo primero que tienes hay hacer es añadir una o ambas de las siguientes claves al Info.plist:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

NSLocationWhenInUseUsageDescription

Ambas claves reciben una cadena que es una descripción de por qué necesita los servicios de localización, o bien solo cuando se necesite (WhenInUse)  o bien siempre (Always). Puedes poner el motivo de porque esa app necesita localizar, algo como “Esta app solicita su ubicación para blablabla”

Una vez hecho esto, en el código se tiene que solicitar autorización para el método de localización correspondiente (WhenInUse o Always):

[self.locationManager requestWhenInUseAuthorization]
[self.locationManager requestAlwaysAuthorization]


		
Si tu aplicación funcionaba bien antes de la actualización y localizaba correctamente esto, en realidad, es lo único que tendrías que añadir a tu App para que esta vuelva a funcionar correctamente.
Share this Story:
  • facebook
  • twitter
  • gplus

About Roger

Leave a comment