Ubicación iOS en Xojo con iOSLocation

iOSLocation for iOS with XojoEn un tutorial anterior mostraba como crear y utilizar las celdas personalizadas en las tablas de las aplicaciones nativas iOS creadas con Xojo; una de las novedades introducidas en Xojo 2016r2. En esta ocasión veremos cuan sencillo nos resulta añadir capacidades de ubicación en tiempo real utilizando el control iOSLocation, otra de las novedades disponibles en esta misma release del producto.

Para ver como podemos aplicarlo crearemos una aplicación de ejemplo iOS tremendamente sencilla, para lo cual necesitarás crear un nuevo proyecto iOS —disponible en las licencia de Xojo para iOS, Xojo Pro y Xojo Enterprise—. De hecho, sólo utilizaremos una jerarquía de vista, la disponible de serie en la propia plantilla de proyecto por omisión.

Sobre dicha plantilla, y seleccionando la vista por omisión, añadiremos una serie de etiquetas: a la izquierda bastará con incluir el texto descriptivo del dato de localización que van a mostrar, y a su derecha las etiquetas sobre las que mostraremos los valores propiamente dichos. El resultado del diseño de este ejemplo es el siguiente, si bien puedes acomodarlo a tus necesidades:

Diseño de aplicación iOS de ejemplo con iOSLocation

Eso sí, utiliza el panel Inspector sobre cada una de las etiquetas que mostrarán los datos de localización para que tengan nombres descriptivos, de modo que posteriormente podamos referirnos a dichos controles desde código con mayor sencillez. Puedes usar por ejemplo una nomenclatura similar a esta:

Asignación de nombre en etiqueta para ejemplo iOSLocation.

Control iOSLocation

Evidentemente es más que probable que tus diseños sean más complejos, no importa. Viendo lo sencillo que resulta añadir y activar el componente de localización podrás adaptarlo sin ningún tipo de problema a cualquier clase de aplicación que necesites crear con Xojo para iOS.

Control iOSLocation en el Panel Librería del IDE de Xojo.

De hecho, tan fácil como arrastrar el control iOSLocation desde el panel Librería del IDE de Xojo hacia el Editor de Vista en el Editor. Este se añadirá sobre la bandeja (la franja en la parte inferior).

Instancia de iOSLocation añadida a la Bandeja del Editor de Vistas.

Una vez añadido al proyecto, selecciona la instancia en el Navegador de Proyecto y accede al menú contextual para seleccionar la opción ‘Add to “NombreControl” Event Handler…’, y en el panel resultante has de seleccionar los eventos correspondientes a LocationChanged y AuthorizationChanged, confirmando la acción.

Selección de Manejadores de Eventos para iOSLocation.

Como ya habrás supuesto, la ubicación del evento LocationChanged es bastante obvia; este es el que se dispara cada vez que el control ha de notificarnos de nuevos cambios en los valores de localización. De heho, al examinar la signatura del evento observamos que nos pasa como argumentos las variables que almacenan los valores correspondientes a latitud, longitud, precisión, altitud, precisión en la altitud, grados sobre el Norte real y también la velocidad como metros por segundo (la fórmula para pasar a Km/h es realmente sencilla). En definitiva, toda la información de utilidad que puedas necesitar para crear aplicaciones complejas basadas en la localización del dispositivo.

Selecciona el evento LocationChanged y añade el siguiente código, teniendo en cuenta que tendrás que cambiar el nombre de los controles de etiqueta que hayas utilizado en tu diseño para mostrar los valores:

lAltitud.Text = altitude.ToText
lLatitud.Text = latitude.ToText
lLongitud.Text = longitude.ToText
lGrados.Text = course.ToText

dim velocidad as double = (speed / 1000) * 3600

lVelocidad.Text = velocidad.ToText + " Km/h"

Activar iOSLocation

Ahora bien, si ejecutas la aplicación iOS en el simulador comprobarás que no se actualizan los valores incluso cuando eliges cualquiera de las opciones disponibles bajo el menú Debug > Location. Esto se debe a que todas las aplicaciones que utilicen los servicios de Ubicación en iOS han de solicitar previamente autorización al usuario. Y esto es de lo que nos vamos a encargar ahora.

Empezaremos por introducir el código en el segundo de los eventos que añadimos en el paso anterior: AuthorizationChanged. Este es el evento que se dispara en la instancia de iOSLocation cada vez que se produzca algún cambio en el estado de autorización asociado.

Selecciona por tanto el evento AuthorizationChanged para acceder al Editor de Código e introduce la siguiente línea:

if me.AuthorizationState = iOSLocation.AuthorizationStates.AuthorizedWhenInUse then me.Enabled = true

En la documentación de Xojo podrás comprobar que AuthorizationStates es un enumerador que incluye también Restricted, Denied o AuthorizedAlways, entre otras. Como puedes ver, si el valor disponible es AuthorizedWhenInUse, entonces se activa el control propiamente dicho para que comience a recibir e interceptar los cambios en los valores de ubicación.

Ahora nos hace falta el código que solicite la autorización propiamente dicha y que produzca la ejecución del anterior evento en base a la respuesta realizada por el usuario de la aplicación. Esto es lo que incluiremos en el evento Open que has de añadir a la vista por omisión del proyecto. Una vez añadido, selecciónalo e introduce el siguiente código:

Location1.Accuracy = iOSLocation.Accuracies.Best
if Location1.AuthorizationState = iOSLocation.AuthorizationStates.AuthorizedWhenInUse then
Location1.Enabled = True
else
location1.RequestInUseAuthorization
end if

En la primera línea simplemente nos limitamos a establecer la frecuencia con la que deseamos recibir los cambios de ubicación; nuevamente se trata de un enumerador cuyos valores puedes constatar en la documentación de Xojo. Simplemente indicar que la opción ‘Best’ suele ser la mejor relación entre frecuencia de actualizaciones, precisión y consumo de la batería en el dispositivo. De hecho esto es algo que has de tener en cuenta a la hora de diseñar aplicaciones iOS en las que se utilicen servicios de ubicación.

En el bloque de decisión “if” comprobamos en un primer lugar si nuestra aplicación ya cuenta con la autorización necesaria, en cuyo caso nos limitamos a activarla sin más para comenzar a recibir los datos periódicos correspondientes a los cambios en la ubicación.

Si nunca antes se ha solicitado autorización o si esta ha sido denegada en anteriores ejecuciones, entonces se ejecutará el segundo bloque, siendo el método RequestInUseAuthorization el encargado de mostrar el diálogo pertinente al usuario.

Archivo .plist para la autorización

¡Falta un último detalle! Un archivo Plist que contenga el texto (mensaje) a mostrar, bajo la clave NSLocationWhenInUseUsageDescription por el diálogo encargado de solicitar permiso para utilizar los servicios de ubicación en nuestra aplicación iOS. Para ello puedes utilizar la siguiente plantilla, guardándolo como archivo de texto con extensión “.plist” e importando el archivo resultante al proyecto de Xojo.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Esta app necesita acceso a los servicios de Ubicación para su funcionamiento.</string>
</dict>
</plist>

¡Listo! Ejecuta la aplicación (recuerda que has de tener instalado Xcode en tu equipo) en el simulador o bien sobre un dispositivo físico y comienza a ver como se actualizan los valores de localización. Por ejemplo, en el Simulador de iOS puedes seleccionar Debug > Location > City Bicycle Ride.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *