[2023r3] iOS: Llegan las Visitas y GeoFencing a MobileLocation

A partir de Xojo 2023r3 encontrarás dos nuevas características añadidas al control MobileLocation en iOS: Visits y GeoFencing. Estos son dos vías que puedes utilizar para que la app sea notificada por el sistema operativo cada vez que el usuario pase una determinada cantidad de tiempo en una ubicación (Visitas), o bien cuando el usuario entre o salga de cualquiera de las regiones previamente registradas.

Tal y como sucede con otras características relacionadas con el control MobileLocation en iOS, se aplican la mismas reglas sobre la activación de las capacidades/Entitlements requeridos (disponibles en la sección Atributos del Panel Inspector, con el item iOS seleccionado en el Navegador), y también cuando se trata de solicitar permiso al usuario para el uso de los servicios de Ubicación. De hecho, es aconsejable que actives Background Modes > Location de modo que tu app aun pueda continuar recibiendo las notificaciones tanto cuando utilices Visitas o GeoFencing y la app propiamente dicha esté en segundo plano.

De igual modo, y dado que queremos recibir estos eventos cuando la app no esté en uso, probablemente querrás utilizar el valor MobileLocationUsageTypes.Always a la hora de realizar la solicitud:

location1.RequestUsageAuthorization(MobileLocation.UsageTypes.Always)

¡Que tengas una buena Visita!

Desde el punto de vista del dispositivo (iPhone o iPad), la característica de Visitas resulta el modo más eficiente para registrar la ubicación del usuario desde el punto de vista del consumo de energía en el dispositivo, aparte de que prácticamente no requiere escribir mucho código. Probablemente el aspecto negativo sea que el sistema operativo no garantiza el envío inmediato a la app de los eventos generados.

Para utilizar la característica Visitas en tus apps iOS creadas con Xojo, todo lo que necesitas hacer es definir la propiedad VisitAwareness de la instancia MobileLocation en la app al valor True, de modo que comience a registrar la ubicación del dispositivo, o bien a False para detener la propagación de dichos eventos a la app.

Luego, sólo has de implementar el Manejador de Evento VisitChanged en la instancia MobileLocation de la app. Este recibirá los siguientes parámetros cuando se reciba un evento de Visita por parte del sistema operativo:

  • latitude As Double
  • longitude As Double
  • accuracy As Double
  • arrival As DateTime
  • departure As DateTime

Así que, por ejemplo, resultaría realmente sencillo añadir automáticamente nuevas instancias de MapLocation a un MobileMapViewer en la app basándose en la información recibida. El siguiente fragmento de código añadido al evento VisitChanged muestra cómo hacerlo sobre una instancia del control MobileMap cuyo nombre es “VisitsMap” y que se ha añadido a una Screen de la app iOS:

Var arrivalDate As String = If( arrival <> Nil, arrival.ToString, "")
Var departureDate As String = If( departure <> Nil, departure.ToString, "")

Var lc As New MapLocation(latitude, longitude, "Arrival: " + arrivalDate + EndOfLine + "Departure: " + departureDate)
visitsMap.AddLocation(lc)

Merece la pena mencionar las comprobaciones de los objetos DateTime “arrival” y “departure” contra Nil, dado que iOS no garantiza incluir siempre dicha información en los eventos de Visita generados; es decir, puedes recibir sólo la fecha y hora de llegada, la fecha y hora de salida, o bien ambos.

Por último, la característica Visits no funciona cuando se ejecuta la app en el Simulador, de modo que tendrás que compilar la app y copiarla directamente sobre el dispositivo (algo que puedes hacer usando Xcode, desde la ventana “Devices and Simulators”).

Puedes encontrar un proyecto de ejemplo para la característica Visits en la carpeta Examples, y este es el aspecto que tienes cuando se utiliza la app (en segundo plano) tras más o menos una hora de uso, en mi caso. Como puedes observar, se han añadido varios elementos MapLocation al mapa, registrando así las ubicaciones visitadas por el usuario.

GeoFencing en iOS

GeoFencing es la capacidad de que la app reciba notificaciones por parte del usuario cada vez que el dispositivo entra, abandona una Región previamente registrada (o en ambos casos). Dichas regiones se crean proporcionando una latitud, longitud y radio (en metros), junto con una String que identifique de forma única a dicha región. Estas regiones persisten incluso tras salir de la aplicación tras reiniciar el dispositivo. La principal limitación es que una app sólo puede registrar un máximo de 20 regiones.

La forma de crear dichas regiones en Xojo es mediante la nueva clase MobileCircularRegion. Por ejemplo:

Var EiffelTowerRegion As New MobileCircularRegion(48.858093, 2.294694, 20.0, "EiffelTowerIdentifier")

Por omisión se configura para emitir los eventos cuando el dispositivo entre o abandone la región; algo que puede cambiarse mediante las propiedades disponibles en la clase (entre otras opciones).

Una vez que se ha creado la instancia correspondiente a la región, hay que añadirla a la instancia de MobileLocation en la app, usando para ello el método AddRegion:

MyLocationInstance.AddRegion( EiffelTowerRegion )

Por último y para recibir los eventos de GeoFencing, añade el o los manejadores de eventos RegionEntered y RegionExited, a la instancia MobileLocation empleada en tu app. Ambos proporcionará como parámetro la instancia MobileCircularRegion asociada, de modo que la lógica de tu app pueda tomar la ruta requerida en función de ello.

Adicionalmente, si bien la característica Visitas sólo pueden probarse cuando se ejecuta la app sobre un dispositivo físico, la característica de GeoFencing puede probarse también en el Simulador.

Por supuesto, encontrarás otros nuevos métodos en MobileLocation que te permitirán eliminar una región previamente añadida, recuperar todas las regiones registadas, aparte de añadirlas tal y como hemos visto en la anterior línea de código.

Tal y como ocurre con las visitas, puedes encontrar un proyecto de ejemplo en la carpeta Examples, de modo que puedas probar dicha capacidad en iOS.

En conclusión

Tanto Visitas como GeoFencing te proporcionan nuevas formas de recuperar la ubicación del usuario de forma que pueden resultar más convenientes para los propósitos de las apps iOS que desarrolles con Xojo; y dado que ambas se basan en eventos gestionados por el sistema operativo propiamente dicho, también resultan más eficientes desde el punto de vista del uso de la batería de los iPhone / iPad.

Deja un comentario

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