En mi anterior artículo, hice una introducción de cómo construir una aplicación de LightSwitch para SharePoint en la que el escenario se centraba en poder enviar notificaciones push a usuarios de Windows Phone cada vez que se insertara un elemento en una lista de SharePoint. En este caso compartiré el código para realizar estos envíos.
Escenario
Teniendo una aplicación de LightSwitch en SharePoint que graba alertas en una lista, pretendemos que tras insertar el registro (o actualizarlo) se envíe una notificación push a los dispositivos Windows Phone registrados en una lista.
Solución
Si seguisteis el anterior artículo, veríais que en el código de la aplicación, concretamente en el Helper “AlertsHelper”, programé un método AddAlert que se encargaba de registrar la alerta en SharePoint y, además, tenía una llamada a la función SendPushNotification. Este es el momento de desvelar el código de dicho método por si algún día necesitáis hacer lo mismo.
1: public static void SendPushNotification(Alert alert, ClientContext siteContext)
2: {
3: var alertId = "ID";
4: List subscribersList = siteContext.Web.Lists.GetByTitle("SubscribersList");
5: siteContext.Load(subscribersList);
6: siteContext.ExecuteQuery();
7:
8: CamlQuery query = new CamlQuery();
9: query.ViewXml = "";
10: var subscriberCollection = subscribersList.GetItems(query);
11: siteContext.Load(subscriberCollection);
12: siteContext.ExecuteQuery();
13:
14: foreach (var subscriber in subscriberCollection)
15: {
16: try
17: {
18: var subscriptionUri = subscriber["ChannelUri"].ToString();
19:
20: // Create the toast message.
21: string toastMessage = "<?xml version="1.0" encoding="utf-8"?>" +
22: "<wp:Notification xmlns:wp="WPNotification">" +
23: "<wp:Toast>" +
24: "<wp:Text1>" + alert.Title + "</wp:Text1>" +
25: "<wp:Text2>" + alert.Body + "</wp:Text2>" +
26: "<wp:Param>/MainPage.xaml?AlertId=" + alertId + "</wp:Param>" +
27: "</wp:Toast> " +
28: "</wp:Notification>";
29:
30: SendMessage(toastMessage, new Uri(subscriptionUri), "toast", "2");
31:
32: string tileMessage = "<?xml version="1.0" encoding="utf-8"?>" +
33: "<wp:Notification xmlns:wp="WPNotification">" +
34: "<wp:Tile>" +
35: "<wp:Count>1</wp:Count>" +
36: "<wp:BackTitle >" + alert.Title + "</wp:BackTitle >" +
37: "<wp:BackContent>" + alert.Body + "</wp:BackContent>" +
38: "</wp:Tile> " +
39: "</wp:Notification>";
40:
41:
42: SendMessage(tileMessage, new Uri(subscriptionUri), "token", "1");
43:
44: }
45: catch (Exception)
46: {
47: }
48: }
49: }
50:
51: private static void SendMessage(string message, Uri subscriptionUri, string target, string notificationClass)
52: {
53: HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(subscriptionUri);
54: sendNotificationRequest.Method = "POST";
55:
56: // Set the notification payload to send.
57: byte[] notificationMessage = Encoding.Default.GetBytes(message);
58:
59: // Set the web request content length.
60: sendNotificationRequest.ContentLength = notificationMessage.Length;
61: sendNotificationRequest.ContentType = "text/xml";
62: sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", target);
63: sendNotificationRequest.Headers.Add("X-NotificationClass", notificationClass);
64:
65: using (Stream requestStream = sendNotificationRequest.GetRequestStream())
66: {
67: requestStream.Write(notificationMessage, 0, notificationMessage.Length);
68: }
69:
70: // Send the notification and get the response.
71: HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.GetResponse();
72: string notificationStatus = response.Headers["X-NotificationStatus"];
73: string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
74: string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];
75: }
Explicación
En primer lugar, tenemos el método SendPushNotification que recibe como parámetros la alerta que queremos enviar a los dispositivos con Windows Phone y el contexto del sitio de SharePoint que nos servirá para obtener los dispositivos a los que tenemos que hacer el envío de la alerta y que están almacenados en una lista de SharePoint.
- Como podéis observar, obtengo la lista de suscriptores por medio del contexto de sharepoint que le he pasado al método y, posteriormente ejecuto una consulta con CAML Query (sin filtro) para obtener todos los registros de la lista.
- Una vez obtengo todos los registros, he de recorrer la colección de suscriptores creando un Toast Notification y, además, he añadido también un Tile Notification para que se vea si la aplicación está anclada al inicio. Ambos tipos de notificación son creados por medio del XML que los genera.
- Haciendo uso de la URI correspondiente al canal del dispositivo y que obtengo del registro del suscriptor, hago una llamada al método SendMessage que es el encargado de abrir la petición y efectuar el envío. Esta llamada se realiza para cada uno de los tipos de notificación que he creado.
- El método SendMessage abre la petición HTTP con la URI del canal del dispositivo, codifica el XML de la alerta en un array de Bytes, establece la cabecera HTTP en la que se especifica el tipo de notificación y su nivel de prioridad y realiza el envío de la alerta.
- Por último, abro una conexión con la respuesta HTTP y, aunque no la estoy usando, podría comprobar el resultado del envío de la notificación. Lo he puesto para que comprobéis que se puede saber si la notificación ha sido enviada correctamente.
Te presentamos nuestra colección de Tips & Tricks de desarrollo de apps para Windows Phone