Bard's Tile II : Notifications Scheduled et Periodic

Tags: Release Preview, .NET, Windows 8, WinRT, Live Tiles, Badges, Scheduled, Periodic

 

Voici la 2eme partie de la série Bard’s Tile, cette-fois ci à propos des mises à jour périodique et programmées (Periodic et Scheduled Tiles).

Bard’s Tile I : Introduction, local Tiles et Badges

Bard’s Tile II : Notifications Scheduled et Periodic

Bard’s Tile III : Push Notifications

Bard’s Tile IV : Secondary Tiles

Bard’s Tile V : Lock Screen Tiles et Badges

Scheduled Tile Notification

Comme le nom (anglais) l’indique bien, il s’agit de mises à jour programmées.

Imaginez que vous ayez une application avec un calendrier, et que vous vouliez envoyer un rappel une heure avant un rendez-vous, par exemple. Ou alors une heure avant la fin planifiée d’une tâche. Voilà des exemples ou les scheduled tile notification ont leur intérêt.

Le principe est le même qu’avec les Tiles locales, à trois détails près :

- Il faut utiliser la classe ScheduledTileNotification au lieu de la classe TileNotification.

- Il faut donner un DateTimeOffset représentant la date et l’heure ou le Tile doit être mis à jour.

- Il faut utiliser la méthode TileUpdater AddToSchedule pour envoyer la notification.

Un exemple :

var tileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareText04);

var duetime = new DateTimeOffset(DateTime.Now.AddMinutes(1));

var tileTextAttributes = tileXml.GetElementsByTagName("text");
tileTextAttributes[0].AppendChild(tileXml.CreateTextNode("This is a scheduled notification due : " + duetime.ToString("hh:mm:ss")));

// Create the notification object.
var scheduledTile = new ScheduledTileNotification(tileXml, duetime);
// Add to the schedule.
TileUpdateManager.CreateTileUpdaterForApplication().AddToSchedule(scheduledTile);

 

Note : Je n’ai rien trouvé dans la documentation, mais d’après mes observations le temps minimum programmable est de 1 minute après l’heure actuelle.

Le reste est le même que pour les Local Tiles. Vous pouvez utiliser la propriété Tag pour éviter des doublons, vous pouvez ajouter une date d’expiration avec ExpirationTime,etc…

Periodic Tile Notification

Comme le nom l’indique (encore) bien, les Periodic Notification sont mises à jour périodiquement. L’idée est de (périodiquement) appeler un URI qui renverra un XML Tile. Vous pouvez avoir, par exemple, une application météo qui interroge toutes les heures un Web Service pour avoir la mise à jour de la température. C’est l’exemple que je vais utiliser.

Créer une Periodic Tile Notification

J’ai créé un service REST WCF qui accepte un paramètre d’entrée (Dans mon cas, le nom de la ville) et renvoie un Tile XML:

 public interface IService1
{
        [WebGet(UriTemplate = "/Tile/{id}")]
        [OperationContract]
        XElement GetTile(string id);
}

L’implémentation:

public XElement GetTile(string city)
{
    var webConfigPath = Path.GetDirectoryName(
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/").FilePath);

    var xml = XElement.Load(webConfigPath + @"/TileXML1.xml");

    foreach(var binding in xml.Element("visual").Elements("binding"))
    {
        var textlist = binding.Elements("text").ToList();

        textlist[0].Value = city;

        var temperature = 0;

        switch (city.ToLower())
        {
            case "paris":
                temperature = new Random().Next(0, 25);
                break;
            case "los angeles":
                temperature = new Random().Next(15, 40);
                break;

        }
        textlist[1].Value = string.Format("Temperature {0}°", temperature);

    }
    return xml;
}

TileXML1.xml est juste un XML Tile blanc :

<?xml version="1.0" encoding="utf-8" ?>
<tile>
  <visual lang="en-US">
    <binding template="TileSquareText02">
      <text id="1"></text>
      <text id="2"></text>
    </binding>

    <binding template="TileWideText09">
      <text id="1"></text>
      <text id="2"></text>
    </binding>
  </visual>
</tile>

Les structures XML des Tiles sont donnés ici.

Si j’appelle mon service REST comme ceci : http://localhost:1033/Service1.svc/Tile/Paris je reçois:

<?xml version="1.0"?>
<tile>
  <visual lang="en-US">
    <binding template="TileSquareText02">
      <text id="1">Paris</text>
      <text id="2">Temperature 24°</text>
    </binding>
    <binding template="TileWideText09">
      <text id="1">Paris</text>
      <text id="2">Temperature 24°</text>
    </binding>
  </visual>
</tile>

 

C’est un XML pour des Tiles Square et Wide Tile. Maintenant, il suffit que connecter notre appli à cet URL. La façon de le faire est d’utiliser la méthode StartPeriodicUpdate de la classe TileUpdater, qui accepte un URI et un PeriodicUpdateRecurrence comme paramètres:

 var tileupdater = TileUpdateManager.CreateTileUpdaterForApplication();

tileupdater.StartPeriodicUpdate(new Uri("http://localhost:1033/Service1.svc/Tile/Paris"), PeriodicUpdateRecurrence.Hour);

 

C’est tout ! Notre tile ressemble à ça :

Arrêter les Periodic Notifications

Vous pouvez bien sûr arrêter d’interroger le service :

var tileupdater = TileUpdateManager.CreateTileUpdaterForApplication();

tileupdater.StopPeriodicUpdate();

Periodic Badge Notification

Vous pouvez faire la même chose avec les Badge Notification. Les principes sont les mêmes qu’avec les Tile Periodic Notifications.

Créer un Periodic Badge Notification

J’ai créé un autre service REST WCF qui renvoie un Badge XML. (Les détails du Badge XML sont  ici) :

    [ServiceContract]
    public interface IService1
    {
        [WebGet(UriTemplate = "/Badge/{city}")]
        [OperationContract]
        XElement GetBadge(string city);
    }

 

L’implémentation :

public XElement GetBadge(string city)
        {
            var webConfigPath = Path.GetDirectoryName(
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/").FilePath);

            var xml = XElement.Load(webConfigPath + @"/BadgeXML1.xml");

            var glyph = 0;

            switch (city.ToLower())
            {
                case "paris":
                    glyph = new Random().Next(1, 49);
                    break;
                case "los angeles":
                    glyph = new Random().Next(50, 99);
                    break;

            }

            xml.Attribute("value").Value = "" + glyph;

            return xml;
        }

 

Le Badge XML :

<?xml version="1.0" encoding="utf-8" ?>
<badge value ="" />

Calling http://localhost:1033/Service1.svc/Badge/Paris gives for instance :

<?xml version="1.0"?>
<badge value="6"/>

Maintenant, connectons tout ceci :

var badgeupdater = BadgeUpdateManager.CreateBadgeUpdaterForApplication();

badgeupdater.StartPeriodicUpdate(new Uri("http://localhost:1033/Service1.svc/Badge/Paris"), PeriodicUpdateRecurrence.HalfHour);

 

Notre tile ressemble maintenant à :

Arrêter les Periodic Notifications

Vous pouvez bien évidemment stopper l’interrogation :

var badgeupdater = BadgeUpdateManager.CreateBadgeUpdaterForApplication();

badgeupdater.StopPeriodicUpdate();

 

Conclusion

Comme vu, WinRT offre une façon simple de faire des mises à jour programmées ou périodique. De nouveau, ce n’est pas parce que l’on peut le faire qu’on doit le faire. Dans certains cas, c’est un plus pour l’expérience utilisateur. Dans d’autres, c’est juste de la pollution informationnelle (Pas sûr que ce soit français, mais je me comprends!). Il n’y a pas de réponse précise quand il faut le faire ou non, ça dépend réellement de l’application (et des informations proposées). Demandez-vous si ça rajoute réellement un plus, rendant votre application plus agréable. Cela devrait vous donner un début de réponse.

Le prochain post est le plat de résistance des notifications : Push Notifications, une manière plus complexe, mais puissant d mettre à jour vos tiles (ou badges).

Les sources de l’application exemple sont ici

Comments powered by Disqus