Localización del Usuario con Core Location

Logotipo de iOS

Para el desarrollo de una aplicación resulta muy útil, por no decir indispensable, conocer la ubicación del usuario. Seguramente cuando se habla de la geolocalización pensamos en apps deportivas en las que se marca la ruta de nuestra carrera, o quizá alguna de transporte como Waze o Uber. Las posibilidades son infinitas. Y en el caso de iOS, todo empieza con Core Location.

Dentro de las características de esta clase, encontramos lo siguiente:

  • Puede traer los datos esenciales de geolocalización:  latitud, longitud, y altitud.
  • Se puede afinar la ubicación para que sea más precisa.
  • La información se puede solicitar constantemente.




Creación de un documento

Lo primero que debemos de hacer para probarlo es crear un nuevo proyecto. Ya sea desde File > New > Project… o desde la ventana de Bienvenida de Xcode (Window > Welcome to Xcode) realiza un proyecto de tipo Single View Application. Como nombre del proyecto llámalo Localizacion y guarda en el lugar que gustes dentro de tu computadora. Recuerda que el lenguaje debe de ser Swift.

Diseño de la Interfaz

Empezaremos poco a poco en este ejercicio. Lo primero que haremos será ver los datos que nos trae Core Location en unos campos de texto.

Desde Main.storyboard, coloca en el View Controller un botón y seis Labels organizados en dos columnas. Los de la izquierda solamente nos servirán de apoyo, mientras que los de la derecha mostraran la información, así que deberán llevar outlets.

Primeros Labels y botones del proyecto
Primeros Labels y botones del proyecto

Creación de Outlets

Utilizando el editor asistente, realiza las conexiones de los 3 labels de la derecha, apretando Ctr+ Click desde el objeto en el storyboard hasta el archivo ViewController.swift. Les pondremos como nombre la propiedad que van a mostrar: Latitud, Longitud y Altitud respectivamente.

Conexión de los primeros outlets
Conexión de los primeros outlets

Creación del Objeto de CoreLocation

Aunque la acción de utilizar la geolocalización es algo muy común, no es un elemento que se encuentra dentro del framework básico, UIKit, por lo que debemos importar otro: CoreLocation. Desde el Project Navigator, regresa al archivo de configuración y de ahí selecciona la pestaña Build Phases.

Menú de Build Phases
Menú de Build Phases

Selecciona la opción Link Binary With Libraries y dentro de esta, haz click en el botón de +. Este botón te mostrará todos los frameworks que se pueden añadir a un proyecto. Utilizando el campo de búsqueda, escribe CoreLocation. Esto te mostrará una caja de herramientas llamada CoreLocation.framework. Selecciónala y dale click al botón Add.

Seleccionando el framework de CoreLocation
Seleccionando el framework de CoreLocation

Con esto, el framework se añade al proyecto.

El framework de CoreLocation está agregado en el proyecto
El framework de CoreLocation está agregado en el proyecto

Además de tenerlo en el proyecto, es necesario importarlo en el código. Seleccionando el archivo ViewController.swift importa a CoreLocation debajo de UIKit.

import UIKit

import CoreLocation

Una vez teniendo esto, ya podemos crear a nuestro objeto. En la región de variables, debajo de los outlets, crea una variable de LocationManager, la cual llamaremos locationManager.

var locationManager:CLLocationManager = CLLocationManager()

Quien va a realizar la acción para traer la información va a ser el botón, así que primero debe crearse su acción. De la misma manera que con los labels, utiliza el editor asistente para hacer una conexión de tipo acción que llamaremos comenzar. La función puede ir en cualquier parte de la clase pero la pondremos debajo de las dos funciones que de manera predeterminada vienen creadas.

Ventana para determinar la acción del botón.
Ventana para determinar la acción del botón.

Él coding de inicio de la función sería:

@IBAction func comenzar(_ sender: Any) {

    }

Dentro de esta función definiremos algunos de los valores del objeto locationManager.

@IBAction func comenzar(_ sender: Any) {

locationManager.desiredAccuracy = kCLLocationAccuracyBest

locationManager.delegate = self

locationManager.requestWhenInUseAuthorization()

locationManager.startUpdatingLocation()

}

Lo primero que hacemos es definir que la precisión de la información sea la mejor posible. Esto es adecuado para aplicaciones de ejercicios donde queremos medir lo más real posible la distancia, pero a lo mejor no sería importante si la app es para algo como la ubicación de un cine. Da lo mismo si la info me marca a cinco metros de distancia de mi ubicación real. Recuerda que a mayor precisión se necesita más batería.




En segundo lugar, con el delegate estamos diciendo que la clase ViewController se encargará de ciertas funciones que utilizaremos un poco más adelante.

El método requestWhenInUseAuthorization es una medida de seguridad, casi obligatoria de utilizar hoy en día, por la cual el usuario se entera de que nuestra aplicación va a obtener los datos de geolocalización y nos debe de dar permiso. También un poco más adelante tendremos que definir el texto correspondiente en el que le explicamos al usuario para qué necesitamos esta información.

Ya teniendo esto, es finalmente la función de startUpdatingLocation() quien da comienzo a la petición. Para estar evaluando los datos, lo que necesitamos es implementar una función de la clase de CLLocationManagerDelegate, la cual actúa de manera automática, cada vez que recibe nuestra información. Pero, tal como dice su nombre, primero debemos indicar que nuestro ViewController se encargará de las labores de delegación. Debe ponerse en la declaración de nuestra clase, después de indicar que extiende de UIVIewController.

class ViewController: UIViewController, CLLocationManagerDelegate {

Ahora es posible empezar a escribir el inicio de la función y notaremos que Xcode nos ayuda a auto completar. La función se llama didUpdateLocations. Escríbela debajo de las otras funciones de ViewController.

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    }

Esta función tiene como último parámetro, el llamado locations, un array con todas las ubicaciones que vaya detectando. Con el fin de ir mostrando en los campos de texto la última información, vamos a crear un objeto que guarde al último elemento de este array.

let ultimaUbicacion:CLLocation = locations[locations.count - 1]

Ya teniendo esto, podemos reflejar los datos en los labels que creamos al principio, recordando que esta información es numérica, por lo que tendrá que convertirse a texto.

latitud.text = String(format:"%.4f",ultimaUbicacion.coordinate.latitude)

longitud.text = String(format:"%.4f",ultimaUbicacion.coordinate.longitude)

altitud.text = String(format:"%.4f",ultimaUbicacion.altitude)




Describir el uso de la geolocalización

Compila la aplicación y una vez que esté lista en el simulador o en el dispositivo, dale click al botón. Lo que ocurrirá en este momento es que mandará un error que se mostrará en el área de depuración.

This app has attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSLocationWhenInUseUsageDescription key with a string value explaining to the user how the app uses this data.

Lo que nos dice este texto es que tenemos que indicarle al usuario para qué necesita nuestra aplicación saber su ubicación. Seguramente podríamos pensar que es algo obvio, pero no siempre es el caso. Mientras que en una app deportiva yo esperaría que usara mis datos, a lo mejor en una de cuidado para hámster no lo necesita, cuando en realidad me la pide para mostrar tiendas especializadas y veterinarios cercanos. Sin importar la razón, lo que debemos hacer es ir al archivo info.plist desde el navegador del proyecto. Al colocarnos en la última opción, aparecerá un botón con el signo “+” para añadir una nueva característica. Dentro del menú que aparece, debemos seleccionar: Privacy – Location When In Use Usage Description.

Propiedades del Plist para elegir opción de Ubicación
Propiedades del Plist para elegir opción de Ubicación

Una vez seleccionada, lo que requiere es una cadena de Texto para describir el uso de la ubicación del usuario. Escribe “Esta app necesita tu ubicación para darte recomendaciones” o algo parecido.

Texto de privacidad para Core Location
Texto de privacidad para Core Location

Vuelve a compilar la aplicación. Ya no debe marcar ningún error. Si estás probando la aplicación en el simulador, Xcode no puede tomar la ubicación donde estás, pero puede proporcionar a manera de prueba algunas direcciones. Estos se encuentran en el Simulador en el Menú Debug > Location y desde ahí puedes elegir alguna. Para este ejemplo yo seleccioné City Bicycle Ride. Aprieta el botón dentro de la aplicación. Siendo la primera vez que se muestra la aplicación, debe aparecer la ventana de alerta para avisar al usuario que se va a usar su ubicación.

Ventana de Alerta para confirma el uso de la geolocalización
Ventana de Alerta para confirma el uso de la geolocalización

Si se le da permiso a la aplicación, los campos de texto de altitud y latitud deben mostrar la información que recibe.

Se muestran los datos de geolocalización
Se muestran los datos de geolocalización

Dentro del simulador no se refleja la información de la altitud. Para verlos, se debe publicarse la app en un dispositivo real.

Incluso si fuera la información real de nuestra ubicación, hasta el momento son solamente números lo que se muestra. En un siguiente artículo utilizaremos este ejercicio de Core Location para dibujar un mapa.

Be the first to comment

Leave a Reply

Your email address will not be published.


*