Guía definitiva de Localización en iOs 9

La localización en iOs 9 es una característica fundamental para nuestras Apps. Aquí una guía de ayuda para desarrolladores.

Voy a intentar explicar paso a paso cómo utilizar los servicios de Localización y Ubicación que nos facilita el propio framework de iOs 9.0.

Esta guía supone que el desarrollador tiene conocimientos básicos de Objective C y programación orientada a objetos usando Xcode.

Así quedará la app de ejemplo que realizaremos. Puedes encontrar el código de ejemplo en mi cuenta de GitHub.

ios-location-demo-screen

Índice:

  1. Configuramos el Proyecto y Agregamos el Framework de Localización
  2. Configurar Info.plist
  3. Solicitar Permisos al Usuario
  4. Crear una clase Singleton para manejar Localización
  5. Obtener la posición Actual
  6. Agregar MapKit de Apple
  7. Localización en Background (segundo plano)
  8. Probamos en el dispositivo y simulador
  9. Ahorro de batería y Advertencia

Vamos a ello!

1-Configuramos el Proyecto y Agregamos el Framework de Localización

Creamos con XCode un Proyecto nuevo de tipo Single View Application

ios-location-create-xcode-project

y marcamos como Capabilities en Background Mode “ON” los servicios de localización: Location updates y Background Fetch.

ios-location-capabilities

Luego agregamos la librería de Localización CoreLocation.Framework. Para nuestro ejemplo agregaremos ademas MapKit para mostrar la ubicación en Mapa. Pero esto es opcional, ya que se podría prescindir del mapa o utilizar otras librerías como la de Google Maps.

ios-location-add-frameworks

2-Configurar Info.plist

A partir de iOS 8.0 es necesario solicitar 2 permisos a los usuarios. Debemos agregar al menos uno de ellos para poder utilizar correctamente la localización en nuestra app.

Los permisos son “In Use” para sólo utilizar localización por “ráfagas de tiempo”, es decir momentaneamente en nuestra app. Por ejemplo, podemos poner un botón “localizarme”, accedemos al gps, ubicamos la posición y desconectamos del servicio. El otro permiso es “Always” para mantener localizado en todo momento al usuario mediante nuestra app. Con los dos permisos podemos hacer localización en Background (segundo plano) pero si tenemos sólo permiso “In use” aparecerá una barra superior color verde avisando al usuario que nuestra app está utilizando el GPS.

Agregamos estas lineas en Info.plist para poder requerir los permisos en runtime. Es importante agregar un mensaje explicativo a los usuarios, justificando el uso de los servicios.

ios-location-inuse-always-plist

3-Solicitar Permisos al Usuario

Al momento de necesitar utilizar los servicios deberemos solicitar los permisos al usuario.

Recordar que el mensaje principal que aparece lo pone el propio sistema operativo de Apple. Y por debajo un poco más pequeño aparece el texto que nosotros agregamos en el Info.Plist.

[[LocationTracker sharedLocationManager] requestAlwaysAuthorization]; 
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) { 
[LocationTracker sharedLocationManager].allowsBackgroundLocationUpdates = YES;
}

Al Ejecutar estas lineas veremos el siguiente cuadro de diálogo que aparecerá al usuario:

ios-location-services-permission-dialog

4-Crear una clase para manejar Localización

Para el manejo de los servicios de localización, crearemos una clase desde la cual administrar las solicitudes. Se llama LocationTracker y utilizará a su vez a dos clases: LocationShareModel, un singleton para acceder a la posición que nos brinda el sistema operativo y BackgroundTaskManager que se encargará de mantener despierta la app mientras esté funcionando en segundo plano.

5-Obtener la posición actual

Para nuestro ejemplo solicitaremos la localización desde un botón. Nuestra clase solicitará los permisos e intentará obtener la posición del dispositivo. Necesitamos la interface CCLocationManagerDelegate y agregar el método didUpdateLocation a donde llegarán las respuestas con posiciones con mayor o menor precisión e información de la velocidad y tiempo.

Se solicita mediante [locationManager startUpdatingLocation]; 

6-Agregar MapKit de Apple

Para nuestro ejemplo, recibiremos la posición actual y centraremos el mapa de Apple en esa posición.

Para ello, una vez obtenida la posición y con el mapa inicializado hacemos

MKCoordinateRegion region = { { 0.0, 0.0 }, { 0.0, 0.0 } };
    region.center.latitude = location.coordinate.latitude;
    region.center.longitude = location.coordinate.longitude;
    region.span.longitudeDelta = 0.005f;
    region.span.longitudeDelta = 0.005f;
    [self.mapview setRegion:region animated:YES];    
    // Add an annotation
    MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
    point.coordinate = location.coordinate;
    point.title = @"Posicion";
    point.subtitle = @"detectada";    
    [self.mapview addAnnotation:point];

7-Localización en Background (segundo plano)

Según las funcionalidades que tenga nuestra app, la localización puede er algo secundario o muy importante. Si tenemos que alertar al usuario según su ubicación constantemente necesitaremos implementar las peticiones de localización en segundo plano, es decir, mientras el usuario esté en otras apps o con su dispositivo “apagado” (no realmente apagado, ya me entienden). Para ello marcamos en el paso 1 las Capabilities y al solicitar permisos también confirmamos el uso en background. En nuestra clase LocationTracker hacemos petición al Observer del estado de Background para que el sistema operativo nos avise que nuestra app está por pasar a segundo plano. Y a partir de eso seguiremos el protocolo de apps en 2do plano. Es decir, crear “background tasks” que mantienen despierta nuestra app. Entre tanto seguirán llegando las solicitudes de posición y podremos realizar tareas “breves” en segundo plano. Lo aconsejable es que si ocurre algún evento importante, avisemos a nuestro usuario mediante una Notificación Local (no cubierto en este tutorial).

8-Probamos en el dispositivo y simulador

Probar en el dispositivo es sencillo; conectamos y ejecutamos directamente en el teléfono. Obviamente deberemos tener los servicios de localización habilitados.

Para probar en el simulador debemos habilitar la “simulación de localización” en las preferencias. Ademas se nos permite agregar un archivo gpx con localizaciones de testing. Podemos crear este tipo de archivos desde este link. Aquí vemos un ejemplo simulando la ubicación de Londres.

ios-location-simulate-london

9-Ahorro de batería y Advertencia

Es muy importante utilizar los servicios de localización el menor tiempo posible ya que puede drenar la batería del móvil en unas horas. Si nuestra app requiere el uso constante podemos utilizar los servicios temporalmente y suspender brevemente las solicitudes para ahorrar energía. Además debemos saber que al momento de publicar la app y pasar por el proceso de revisión, estamos obligados a agregar una leyenda en la descripción de la app que advierta a los usuarios que nuestra app puede consumir mucha batería. De no hacerlo nuestra app será rechazada y deberemos volver a empezar el proceso de publicación otra vez.

En nuestro código de ejemplo de GitHub utilizaremos un uso de a ráfagas del GPS para no agotar la batería. La política de uso será de 10 segundos y frenar y esperar a que se complete un minuto (otros 50 segundos). Para ello combinamos el uso de 2 Timers que irán iniciando y apagando el localizador alternativamente. Estos valores se podrían ajustar de acuerdo a nuestras necesidades con la App.

Conclusión

ios-location-working-example

Espero que esta simple app y este humilde post sirva para que otros desarrolladores puedan implementar los servicios de ubicación sin muchos dolores de cabeza. Intenté cubrir todos los pasos que hacen falta para llevar a cabo la tarea. Personalmente tuve varias complicaciones para hacer funcionar localización en background y también por culpa de los dichosos permisos. Los invito a descargar y probar el ejemplo de Github y a que me dejen sus comentarios, sugerencias y opiniones al final del artículo.

NOTA: por momentos se utiliza el acrónimo “GPS”, pero para referirnos a los sitemas de Localización en general, ya que la respuesta podría llegar por antenas, wifi u otros sistemas satelitales, no necesariamente el sistema americano de posicionamiento global.

Leave a Reply

Your email address will not be published. Required fields are marked *