Raw notifications

 

Les Raw notifications sont un type de notification push. C’est une push notification avec une charge arbitraire. Vous pouvez envoyer n’importe quelle donnée (Mais il y a une limitation de taille : charge de 4K maximum ). Cette notification ne peut pas être reçue directement par une application, mais uniquement via une background task.  Ce qui fait que les raw notification sont interceptées même si l’application ne tourne pas. Sympa !

Préparation de la partie cloud

Les principes sont les mêmes qu’avec les notifications push des tiles. Il faut s’enregistrer au WNS,etc…Tout est expliqué ici : Bard’s Tile 3.

La grande différence est que, lors de l’envoi, vous devez donner le type “wns/raw”. Exemple inspiré de l’application Bard’s Tile 3 :

protected void SendPushNotification(string uri, string rawdata, string type = "wns/raw")
{
    try
    {
        var contentInBytes = Encoding.UTF8.GetBytes(rawdata);

        var webRequest = HttpWebRequest.Create(uri);

        webRequest.Method = "POST";

        webRequest.Headers.Add("X-WNS-Type", type);
        webRequest.Headers.Add("Authorization", String.Format("Bearer {0}", _accessToken));

        var requestStream = webRequest.GetRequestStream();
        requestStream.Write(contentInBytes, 0, contentInBytes.Length);
        requestStream.Close();

        var webResponse = (HttpWebResponse)webRequest.GetResponse();
    }
    catch (WebException webException)
    {
        // Check here if response is OK (200) or not
    }
    catch (Exception ex)
    {
        // Log exception here
    }

}

 

Préparer l’application

La façon de recevoir une raw notification est très différence de celle pour recevoir une tile push notification. Ce n’est pas votre application qui va recevoir la notification, mais une backgroudtask que vous devez créer. Aussi, très important : votre application DOIT être mise sur le lock screen!

Pour plus d’infos sur les backgroundtasks, voir ici.

Les étapes sont :

1. Faire votre application “lock screen capable”

2. Créer une background task

3. Ajouter background task dans le manifeste

4. Registrer la background task

5. Registrer un channel WNS

Etape 1 : Rendre votre application « lock screen capable »

Voir Bard’s Tile 5 pour la procédure à suivre.

Etape 2 : Créer une background task.

Ajoutez une class library à votre solution. Après créer une classe sealed qui implémente IBackgroundTask :

namespace MyBackgroundTask
{
    public sealed class MyBackgroundTask : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            // Code here
        }
    }
}

 

Deux choses importantes : La classe doit être sealed, et le projet output doit être de type WinMD

Etape 3 : Ajouter background task dans le manifeste.

Vous devez ajouter background task capability dans le manifeste. Le type de background task doit supporter Push Notification:

Vous devez mettre comme entry point le namespace + le nom de la classe, et BackgroundTaskHost.exe (Ou votre exécutable, voir le document sur les background tasks pour la différence) comme launch.

Etape 4 : Registrer la task

Dans votre appli, vous devez maintenant créer une backgroud task et la registrer.

Le background task trigger doit être, bien évidemment, PushNotificationTrigger :

var builder = new BackgroundTaskBuilder();
builder.Name = "RawNotificationBT";
builder.TaskEntryPoint = "MyBackgroundTask.MyBackgroundTask";     
var trigger = new PushNotificationTrigger();
builder.SetTrigger(trigger);

var task = builder.Register();

 

Note : Vous pouvez voir toutes les backgroud task associées à votre appli, pour ne pas registrer deux fois la même :

foreach (var task in BackgroundTaskRegistration.AllTasks)
{
    if (task.Value.Name == "RawNotificationBT")
        continue;
}

 

Etape 5 : Registrer un channel WNS

Même chose qu’avec les tile push notification, voir Bard’s Tile 3.

Consommer Raw Notification

Maintenant, si votre application est sur le lock screen et que vous recevez une raw notification, la background task sera lancée et la méthode Run appelée.

Dans la méthode Run, vous pouvez avoir la Raw Notification :

var rawnotification = (RawNotification)taskInstance.TriggerDetails;

 

Après, pour avoir la charge :

var payload = rawnotification.Content;

 

Communiquer avec l’application

La task peut communiquer avec votre appli (Si elle est lancée…) en utilisant l’évènement Completed de la task et le local settings.

Vous pouvez souscrire à l’évènement après la création de la task :

task.Completed += task_Completed;

void task_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
{
    if (args.Status == null)
    {
        var settings = ApplicationData.Current.LocalSettings;

        if (settings.Values.Keys.Contains("RawNotificationBT"))
        {
            var payload = settings.Values["RawNotificationBT"];
        }
    }
    else
    {
        // Manage exception here
    }
}

 

Notez qu’il faut re-souscrire aux évènements lors de chaque lancement de l’application :

foreach (var task in BackgroundTaskRegistration.AllTasks)
{
    task.Value.Completed += task_Completed;
}

 

Dans la backgroundtask, vous pouvez sauver la charge dans les local settings :

public void Run(IBackgroundTaskInstance taskInstance)
{
    var rawnotification = (RawNotification)taskInstance.TriggerDetails;

    ApplicationData.Current.LocalSettings.Values["RawNotificationBT"] = rawnotification.Content;

}

 

Consumer Preview Bug

Il peut arriver que la backgroundtask ne démarre pas, alors qu’elle est bien reçue. Dans ce cas, vous pouvez :

1. Désinstaller l’application

2. Rebooter

3. Réinstaller l’application. (N’oubliez pas de l’ajouter de nouveau sur le lock screen)

Conclusion

Cette fois, les Raw Notifications sont quelque peu différentes de celles sur Phone 7. C’est sympa de pouvoir recevoir ces notifications vie une backgroud task, mais ça aurait été pas mal qu’on puisse les recevoir même si l’application n’est pas sur le lock screen.

Une application exemple (basée sur l’appli Bard’s Tile III app) est ici.

The following two tabs change content below.
Olivier

Olivier

Mobile Engineer chez Arcana Studio
Développeur Freelance. Passionné par le développement mobile et l'internet des objets. Expert en WinRT et Xamarin. MVP Windows Platform Development Nokia Developer Champion