[Windows Phone 8.1] Introducción al Geofencing

Introducción

En el paso de Windows Phone 7 a Windows Phone 8, los desarrolladores
conseguimos una serie de características nuevas muy interesantes que se
traducieron en nuevas aplicaciones que ofrecían nuevas experiencias para
los usuarios antes imposibles. Ahora con la llegada de Windows Phone
8.1 nos llegan las APIs de Geofencing pudiendo crear de nuevo, nuevas experiencias.

¿Qué es el Geofencing?

El Geofencing es una tecnología que permite definir límites virtuales
en el mundo real. De esta forma, se puede establecer un radio de
interés dentro del cual lanzar algun tipo de acción concreta.

El potencial es altamente elevado, desde recibir recordatorios del
interés del usuario segun zonas geográficas  a recibir ofertas o
descuentos segun tiendas en la zona.

Manos a la obra

Creamos una nueva aplicación Windows Phone 8.1 con el objetivo de analizar todas las capacidades del geofencing.

Para poder utilizar geofencing lo primero que debemos hacer es dirigirnos al archivo AppxManifiest y activar la capacidad de Localización.

Comenzamos a trabajar con la API de geofencing. Debemos crear al
menos una zona geográfica, un punto marcado por coordenadas, en el cual
establecer un radio para detectar cuando se entra o sale del mismo y
actuar en consecuencia.

Comenzamos creando un objeto de tipo GeofenceMonitor.
Sera el encargado de gestionar la información relacionada con las áreas
establecidas asi como notificar cuando el usuario entra o sale de las
mismas:

GeofenceMonitor _monitor = GeofenceMonitor.Current;

Creamos un método para crear geofence:

private void NewGeofence(string id, double latitude, double longitude, double radius)
{
     // Establecemos la posición del Geofence.
     var position = new BasicGeoposition
     {
          Latitude = latitude,
          Longitude = longitude
     };
 
     //
El Geofence es un círculo centrado en el punto dado por la latitud y la
longitud con el radio asignado en la propiedad radius.
     var geocircle = new Geocircle(position, radius);
 
     // Queremos gestionar los eventos al entrar en la zona.
     const MonitoredGeofenceStates state = MonitoredGeofenceStates.Entered;
 
     // Tiempo que el usuario debe estar en el área para recibir la notificación.
     var dwellTime = TimeSpan.FromSeconds(5);
 
     // Añadimos el Geofence al GeofenceMonitor.
     var geofence = new Geofence(id, geocircle, state, false, dwellTime);
 
     if (!GeofenceMonitor.Current.Geofences.Contains(geofence))
          GeofenceMonitor.Current.Geofences.Add(geofence);
}

Que llamaremos desde el constructor de nuestra viewmodel:

// Creamos un Geofence.
NewGeofence("Windows Phone Developer", 37.3823, -5.9702, 150);

¿Que hacemos exactamente en este método?

Vamos a desglosarlo paso a paso. Necesitamos crear un área circular
que se establece en el punto marcado por latitud y longitud, con un
radio establecido por la propiedad radius.  Este círculo lo establecemos
utilizando un objeto de tipo Geocircle definido por un objeto de tipo BasicGeoposition que cuenta con las coordenadas además del radio.

Tras definir el círculo, indicamos cuando se lanzaran los eventos
gracias a la enumeración del tipo MonitoredGeofenceStates. Podemos
establecerlo a:

  • None
  • Entered
  • Exited
  • Removed

Nos permite indicar si se lanza el evento GeofenceStateChanged al entrar, salir o eliminar la zona.

Por último, creamos un objeto de tipo Geofence pasandole
los parámetros anteriores, la enumeración MonitoredGeofenceStates, el
objeto Geocircle, un TimeSpan que indica el tiempo que debe estar el
usuario en la zona para saltar la notificación y además de todo lo
anterior, es necesario un identificador único de la zona. No podemos
establecer zonas duplicadas.

_monitor.GeofenceStateChanged += MonitorOnGeofenceStateChanged;

En el constructor de nuestra viewmodel nos suscribimos tambien al evento GeofenceStateChanged. Este evento se lanzará cada vez que algun objeto de la colección de zonas del GeofenceMonitor cambie:

private void MonitorOnGeofenceStateChanged(GeofenceMonitor sender, object args)
{
     var fences = sender.ReadReports();
 
     foreach (var report in fences)
     {
          if (report.Geofence.Id != "Windows Phone Developer")
               continue;
 
          switch (report.NewState)
          {
               case GeofenceState.Entered:
                     _dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
                     {
                          await _dialogService.Show("Hola!");
                     });
                     break;
          }
     }
}

Cuando recibimos una notificación, usamos el método ReadReports. Este método devuelve la colección de Geofences que han cambiado su estado.

En cada una de las Geofences con nuevo estado, podemos controlar cual
es, y que acción realizar en cada estado, si se esta entrando o
saliendo de la zona por ejemplo. En nuestro ejemplo, utilizamos el
servicio DialogService (inyectado en la viewmodel) para mostrar un
simple mensaje.

NOTA: Podéis utilizar el emulador de Windows Phone con la herramienta extra de localización para simular posiciones.

Podéis descargar el ejemplo realizado a continuación:

Conclusiones

Las opciones que nos brinda el Geofencing son muy elevadas pudiendo
contar con características muy interesantes además con una API muy
sencilla de utilizar.

En este artículo hemos hecho una introducción a las APIs de
Geofencing. En próximos artículos veremos como utilizar la API junto a
acciones en background lo que potencian aun mas las posibilidades.

Recordar que cualquier tipo de duda la podéis dejar en los comentarios.

Más información

2 thoughts on “[Windows Phone 8.1] Introducción al Geofencing

Deja un comentario

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