Notificaciones Push en Windows Phone 8

Las notificaciones Push son un método de comunicación iniciada en el servidor. Este modelo contrasta con el modelo Pull, donde la petición es originada en el cliente. En este artículo veremos qué supone el modelo Push para los desarrolladores, los tipos de notificaciones Push que soporta Windows Phone y los encabezados personalizados de respuesta.

Notificaciones Push y Live Tiles

Las notificaciones Push nos ofrecen a los desarrolladores una forma de enviar información concreta relacionada con nuestras aplicaciones, incluso cuando no se están ejecutando. Como dijimos al principio, la comunicación se inicia de lado de servidor, con las ventajas que esto supone: preservamos batería y mejoramos la experiencia del usuario ya que evitamos que éste tenga la necesidad de abrir la aplicación para recibir nueva información (modelo Pull).

Si a esto le sumamos las Live Tiles de Windows Phone, los usuarios finales tienen a su disposición la información que más les interesa a mano, de manera inmediata y con sólo echar un vistazo a su pantalla de inicio.

Tipos de notificaciones

Windows Phone soporta tres tipos de notificaciones Push:

  • Raw: El mensaje de la notificación es específico de la aplicación. Además, esta notificación se envía directamente a la aplicación sólo si se está ejecutando.
  • Toast: Esta notificación requiere de un esquema XML específico. El contenido se envía a la aplicación sólo si se está ejecutando. En el caso contrario, se muestra una notificación Toast con el contenido del mensaje.
  • Tile: Aquí también se requiere de un esquema XML específico. Esta notificación nunca se envía a la aplicación, sino que actualiza directamente la Tile con el mensaje de la notificación (siempre que tengamos anclada la Tile de dicha aplicación).

Flujo de datos en las notificaciones Push

Como desarrolladores, debemos entender cómo funcionan las notificaciones Push y el flujo de los datos desde el momento en el que se inicia la comunicación.

En un escenario típico, contaremos con el dispositivo, nuestro propio servidor y el servidor MPNS (Microsoft Push Notifications Server).

Cuando el usuario habilita las notificaciones Push en la aplicación, el servidor MPNS establece el endpoint para las notificaciones Push con nuestro dispositivo. Además, se crea una URI única para identificar ese endpoint.

Esa URI se envía a nuestro servidor propio, que necesita esta información a la hora de preparar el mensaje y enviarlo. Cuando nuestro servidor envía una notificación, lo hace a través de un HTTP Post hacia el servidor MPNS, que será el encargado final de enviar el mensaje a nuestra aplicación.

pushdataflow

Características de la notificaciones Push

Es importante que sepamos las características de las notificaciones Push, para así conocer sus limitaciones y hacer buen uso de ellas:

  • Las notificaiones Tile pueden actualizar cualquiera de los tres tipos de tiles disponibles.
  • Por cada dispositivo, se permiten 30 subscripciones.
  • El tamaño máximo de una notificación es de 1KB para el encabezado y 3KB para el payload.
  • Los servicios sin autenticar están limitados a 500 notificaciones Push por subscripción y día.
  • Se recomienda servicios autenticados ya que la comunicación se realiza por HTTPS, no tienen límites en el número de notificaciones y tienen la posibilidad de registrarse a una petición de callback.

El contenido de una notificación Toast

Las notificaciones Toast aparecen en la parte superior de la pantalla y se usan para informar al usuario cuando la aplicación no está en ejecución. Pulsando dicha notificación, podemos navegar a una página concreta de nuestra aplicación si así se ha especificado en <Param>. Si la aplicación se está ejecutando en el momento de recibir una notificación, el evento ShellToastNotificationReceived se lanza y en los argumentos tendremos acceso al contenido del mensaje.

IC619123

Para este tipo de notificaciones usaremos los siguientes encabezados HTTP desde servidor:

HttpWebRequest sendNotificationRequest = new HttpWebRequest();
sendNotificationRequest.ContentType = "text/xml";
sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast");
sendNotificationRequest.Headers.Add("X-NotificationClass", "<batching interval");

Nota: batching interval puede tener valores de 3 (entrega inmediata), 13 (entrega en 450 segundos) y 23 (entrega en 900 segundos).

Luego, crearemos el mensaje Toast:

string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
    "<wp:Toast>" +
        "<wp:Text1>" + TextBoxTitle.Text.ToString() + "</wp:Text1>" +
        "<wp:Text2>" + TextBoxSubTitle.Text.ToString() + "</wp:Text2>" +
        "<wp:Param>/Page2.xaml?NavigatedFrom=Toast Notification</wp:Param>" +
    "</wp:Toast> " +
"</wp:Notification>";

El contenido de una notificación Tile

Las notificaciones Tile son aquellas que envían información para que el sistema operativo actualice la Tile principal de la aplicación con nueva información. Estas notificaciones nunca son entregadas a la aplicación directamente.

Hay esquemas específicos para cada tipo de Tile en Windows Phone 8. Por ejemplo, las de tipo Flip e Iconic se pueden actualizar con imágenes remotas. Estas imágenes están limitadas en tamaño a 80KB y se deben descargar en 30 segundos o menos.

Para este tipo de notificación usaremos los siguientes encabezados HTTP:

HttpWebRequest sendNotificationRequest = new HttpWebRequest();
sendNotificationRequest.ContentType = "text/xml";
sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "token");
sendNotificationRequest.Headers.Add("X-NotificationClass", "<batching interval");

Como dijimos antes, cada tipo de Tile tiene su esquema de mensaje. El esquema para la FlipTile es el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification" Version="2.0">
  <wp:Tile Id="[Tile ID]" Template="FlipTile">
    <wp:SmallBackgroundImage [Action="Clear"]>[small Tile size URI]</wp:SmallBackgroundImage>
    <wp:WideBackgroundImage Action="Clear">[front of wide Tile size URI]</wp:WideBackgroundImage>
    <wp:WideBackBackgroundImage Action="Clear">[back of wide Tile size URI]</wp:WideBackBackgroundImage>
    <wp:WideBackContent Action="Clear">[back of wide Tile size content]</wp:WideBackContent>
    <wp:BackgroundImage Action="Clear">[front of medium Tile size URI]</wp:BackgroundImage>
    <wp:Count Action="Clear">[count]</wp:Count>
    <wp:Title Action="Clear">[title]</wp:Title>
    <wp:BackBackgroundImage Action="Clear">[back of medium Tile size URI]</wp:BackBackgroundImage>
    <wp:BackTitle Action="Clear">[back of Tile title]</wp:BackTitle>
    <wp:BackContent Action="Clear">[back of medium Tile size content]</wp:BackContent>
  </wp:Tile>
</wp:Notification>

El esquema de la CycleTile es el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification" Version="2.0">
  <wp:Tile Id="[Tile ID]" Template="CycleTile">
    <wp:SmallBackgroundImage [Action="Clear"]>[small Tile size URI]</wp:SmallBackgroundImage>
    <wp:CycleImage1 Action="Clear">[photo 1 URI]</wp:CycleImage1>
    <wp:CycleImage2 Action="Clear">[photo 2 URI]</wp:CycleImage2>
    <wp:CycleImage3 Action="Clear">[photo 3 URI]</wp:CycleImage3>
    <wp:CycleImage4 Action="Clear">[photo 4 URI]</wp:CycleImage4>
    <wp:CycleImage5 Action="Clear">[photo 5 URI]</wp:CycleImage5>
    <wp:CycleImage6 Action="Clear">[photo 6 URI]</wp:CycleImage6>
    <wp:CycleImage7 Action="Clear">[photo 7 URI]</wp:CycleImage7>
    <wp:CycleImage8 Action="Clear">[photo 8 URI]</wp:CycleImage8>
    <wp:CycleImage9 Action="Clear">[photo 9 URI]</wp:CycleImage9>
    <wp:Count Action="Clear">[count]</wp:Count>
    <wp:Title Action="Clear">[title]</wp:Title>
  </wp:Tile>
</wp:Notification>

El contenido de un mensaje sin formato

El mensaje sin formato o Raw lo enviamos directamente a la aplicación si se está ejecutando. Los encabezados HTTP que usaremos serán los siguientes:

HttpWebRequest sendNotificationRequest = new HttpWebRequest();
sendNotificationRequest.ContentType = "text/xml";
sendNotificationRequest.Headers.Add("X-NotificationClass", "<batching interval");

El mensaje es específico de la aplicación, pero siempre se recomienda formar este mensaje usando XML:

string rawMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
    "<root>" +
        "<Value1>" + TextBoxValue1.Text.ToString() + "<Value1>" +
        "<Value2>" + TextBoxValue2.Text.ToString() + "<Value2>" +
    "</root>";

Encabezados personalizados de respuesta

Tenemos a nuestra disposición encabezados de respuesta que nos serán útiles a la hora de conocer si nuestro servicio de notificaciones está funcionando correctamente o no. Hay multitud de ellos y entre los más importantes podemos encontrar el clásico código de estado HTTP 200 en el que todo ha ido bien, estado sobre las notificaciones, sobre la conexión con el dispositivo que recibe las notificaciones, sobre las subscripción, etc. Podemos encontrar más información sobre los estados de respuesta en este artículo de MSDN.

Recapitulando

En este artículo hemos visto cómo las notificaciones Push son una manera eficiente de enviar información actualizada y avisos a un dispositivo relacionados con nuestra aplicación. Al originarse en servidor, es la mejor forma de recibir información y avisos consumiendo muy poca batería. Hemos visto también los tipos de notificaciones: las notificaciones sin formato o Raw que irán sólo a la aplicación en ejecución, las notificaciones Toast que irán a la aplicación si se está ejecutando. En caso contrario mostrarán un mensaje en la parte superior del teléfono. Y por último, las notificaciones Tile que se usan sólo para actualizar la información de las tiles en la pantalla Inicio. Todas ellas con un esquema y encabezados concretos que también hemos podido ver aquí.

Referencias

Push Notifications for Windows Phone

Deja un comentario