[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

Published 7/5/2014 20:54 por jsuarezruiz
Comparte este post:

Comentarios

# re: [Windows Phone 8.1] Introducción al Geofencing

Wednesday, August 13, 2014 11:42 AM por oscar.zarate

Hola Javier,

Muy buen post.

Parece que el link de "Descargar Ejemplo" no funciona. Podrías verificar por favor? Gracias.

SaludOZ,

# re: [Windows Phone 8.1] Introducción al Geofencing

Wednesday, August 13, 2014 6:29 PM por jsuarezruiz

Ejemplo disponible en el siguiente enlace: http://1drv.ms/1nPtngR

Muchas gracias por avisar!