Avec Windows 8, il est possible avec un compte Microsoft d'inscrire un ou plusieurs PC ou périphériques afin que ceux-ci puissent partager des préférences, des paramètres entre eux sans que l'on soit obligé de re-paramétrer chacun individuellement. Je ne reviens pas sur le sujet c'est longuement expliqué dans ce billet.

 

  • Lorsque vous utilisez pour la 1ere fois Windows 8 il est connecté à tous les services, et un second PC est déjà pret à l'emploi.
  • L'utilisateur à les mêmes préférences peut importe le matériel ou PC qu'il utilise. Lorsqu'il modifie un paramètre, il sera disponible sur les autres
  • Si l'utilisateur démarre une tâche sur un des PC, il pourra continuer cette tâche au même stade de progression qu'il l’a laissé sur un autre PC.

C'est cette dernière phase que nous allons détailler pour vous développeurs d'applications Windows 8, et vous verrez que c'est très simple à implémenter. Ainsi vous pourrez sans frais améliorer l'expérience utilisateur de votre application.

Pour ce faire, il suffit d'utiliser l'espace de nom ApplicationData du runtime Windows (WinRT) comme nous le verrons plus tard, et Windows 8 s'occupe de tout le reste. C'est à dire de la synchronisation des données dans le Cloud. Vous n'avez pas à vous occuper de l'identité de l'utilisateur, de la gestion du support Offline/Online, des conflits entre paramètres, etc...

Bien évidement, vous n'êtes pas obligé de l'utiliser et pouvez gérer votre propre système de synchronisation surtout lorsque vous êtes dans une configuration plus entreprise, ou la création de compte Microsoft est plus problématique. Mais le résultat reste le même, c'est une expérience accrue pour l'utilisateur de votre application.

 

Alors comment ça marche ?

Votre application accède aux données localement, ce qui veut dire qu’elle y a toujours accès et ceci peut importe que le matériel soit connecté ou pas. Une fois en ligne, le mécanisme de synchronisation, utilisera une gestion de conflits simple, du dernier qui écrit qui gagne. Comme ce mécanisme de synchronisation tourne au-dehors de l’application, celle-ci n’a pas besoin d’être active pour que la synchronisation ce fasse, mais il peut y avoir des délais d’attente, car la synchronisation ne se fait pas en temps réel et peut dépendre de plusieurs facteurs. Entre autre celui d’éviter de consommer de la batterie inutilement avec des accès répétés aux réseaux par exemple. Il est possible de forcer une synchronisation en activant les touches Windows+ L (Déconnection), mais il existe un certain nombre de seuils qui sont mis en place afin d’éviter une sur consommation, de réduire les performances et de protéger les serveurs. Je vous encourage d’ailleurs à suivre le guide de bonnes pratiques pour la mise en place de paramètres itinérant.

 

Pour écrire un paramètre :

 

 public static void SaveRoamingSkyDriveFolder(String folderId) 
 { 
 ApplicationData.Current.RoamingSettings.Values["folderId"] = folderId; 
 }
 
 

Pour lire un paramètre :

 public static String GetRoamingSkydriveFolder() 
 { 

 if (ApplicationData.Current.RoamingSettings.Values.ContainsKey("folderId")) 
 { 
 return (String)ApplicationData.Current.RoamingSettings.Values["folderId"]; 
 } 
 return String.Empty; 
 }
 
 

L’utilisation comme vous le voyez est réellement très simple, il est également possible de sauvegarder des données plus complexe, composite par exemple :

 
 ulong quota = ApplicationData.Current.RoamingStorageQuota; 
 ApplicationDataCompositeValue compositeValue = new ApplicationDataCompositeValue(); 
 compositeValue["Time"] = GetDateTime(); 
 compositeValue["Value"] = "MaValeur"; 
 ApplicationData.Current.RoamingSettings.Values["MaProprieteComposite"] = compositeValue;

 

Ou alors sous forme d’un fichier si vous avez des scénarios plus avancés, en utilisant directement le répertoire d’itinérance ApplicationData.Current.RoamingFolder qui s’utilise de la même manière que les répertoires courant.

Il est possible de lire directement les données, par exemple au chargement de l’application, mais également d’être notifié que les données ont changées pour le cas ou l’application serait  déjà chargée. Il suffit de s’abonner à l’évènement DataChanged de l’application.


 ApplicationData.Current.DataChanged += Current_DataChanged; 
void Current_DataChanged(ApplicationData sender, object args) 
 { 
 this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low,new Windows.UI.Core.DispatchedHandler(()=> 
 { 

 var compositeValue =(ApplicationDataCompositeValue)ApplicationData.Current.RoamingSettings.Values[txtProp.Text]; 
 txtDepartureTime.Text =(String)compositeValue["Time"]; 
 txtArrivalValue.Text= (String)compositeValue["Value"] ; 
                    
 })); 
 }
 

Lorsque votre application sera installé sur un second PC par exemple, le mécanisme de synchronisation récupère les paramètres qui aurait déjà été sauvegardé dans le Cloud. Mais tout ne peut pas ou ne doit pas être sauvegardé. Par exemple des données spécifiques au PC, des données sans limite de taille, ou des données que vous pourriez récupérer directement par d’autres flux comme, les flux RSS par exemple. En effet il existe un quota, que nous avons fixé à 100KO.

 ulong quota = ApplicationData.Current.RoamingStorageQuota;

 

Si vous excédez cette limite, l’application ne plantera pas, mais rien ne se passera, la synchronisation ne se déclenchera pas c’est tout. Si vous avez des scénarios à plus de 100KO, il est de bon ton de penser à d’autres mécanismes. Pour information la plupart des applications Microsoft sont largement en deçà de cette limite.

Le temps de synchronisation, est largement variable et peut se compter en Minutes et il y a des scénarios ou on a besoin de descendre en dessous de la minute. C’est pourquoi, Microsoft

a implémenté la propriété HighPriority pour une transition plus rapide entre les différents PC.

ApplicationData.Current.RoamingSettings.Values["HighPriority"] = "MaValeur";

 

En faite les PC seront synchronisés pratiquement immédiatement, lorsque la propriété est utilisée la 1ère fois, mais si vous l’utilisez trop souvent, elle ne sera synchronisé qu’une fois par minute. Vous ne devez donc l’utiliser que pour des actions bien particulières, lorsque l’utilisateur joue une vidéo, lit un article, ou met en pause, ou lorsque l’application est suspendue , et ne pas penser à mettre en place un pseudo système temps réel. Vous devez alors la lire lorsque l’application se charge, ou lorsque l’application reprend son exécution. Si dans l’application, l’utilisateur a commencé une nouvelle tâche, vous ne devez pas perturber ce qu’il est en train de faire avec un état qui pour le coup est devenu obsolète. Il est possible de l’utiliser avec des données composites, c’est à dire des données qui ont une signification lorsque utilisées ensemble, par exemple des coordonnées GPS, mais sa taille maximum est de 8KO il est donc important de ne pas faire n’importe quoi avec.

Exemples d’utilisation de l’itinérance

Guide de l’itinérance

Eric Vernié