Donnez une tuile 8.0 à votre application 7.5 !

Maintenir une application entre deux OS n’est pas chose aisée. Si vous souhaitez uniquement mettre à jour votre application pour Windows Phone 8 (et uniquement cela), sachez qu’il est possible pour une application 7.5 d’utiliser les nouvelles tuiles (cyclique, flip, iconic) si elle est exécuté depuis un téléphone Windows Phone 8.

Les avantages/inconvénients

Les avantages :

  • une seule application à maintenir entre windows phone 7 et windows phone 8
  • l’application tirera profit des nouvelles tuiles sous windows phone 8 (en attendant 7.8)

Les inconvénients :

  • Votre application ne tirera pas profit des nouvelles contrôles comme le panorama ou le pivot natif (plus performant)
  • Votre application sera affiché avec une bande noire avec les téléphones 720p (le HTC 8X notamment)
  • Vous ne pourrez utiliser les nouvelles fonctionnalités WP8 comme l’in-app purchase, WinPRT, etc…

Attention !

La tuile principale de votre application ne peut pas être cyclique ou iconique, seul flip est disponible. Pour vos tuiles additionnelles, vous avez accès aux trois types.

 

Comment faire ?

Maintenant que vous êtes prévenu, voyons comment profiter des nouvelles tuiles tout en gardant notre application compatible WP7.

Pour cela nous allons utiliser la reflection, en n’appelant pas directement les nouvelles méthodes, mais indirectement. Mais avant tout, testons la compatibilité avec le système.

Comment savoir si mon application tourne sous un windows phone 8 ?

Pour cela, il suffit de tester la version du système, cela se fait de la façon suivante :

public static bool IsWP8 {get{return Environment.OSVersion.Version >= new Version(8, 0);}}

Tout simplement ! Il suffira maintenant d’appeler cette fonction pour savoir si on est sur un windows phone 8.

Il reste maintenant à faire le gros du travail, en jouant avec la reflection :

Récupérons dans un premier temps le type qui nous intéresse : FlipTileData via la réflexion (cela fonctionne aussi avec IconicTileData et CyclicTileData) :

Type flipTileDataType = Type.GetType("Microsoft.Phone.Shell.FlipTileData, Microsoft.Phone");

Créons l’objet :

var mynewtile = flipTileDataType.GetConstructor(new Type[] { }).Invoke(null);

Affectons les propriétés :

SetProperty(mynewtile, "Title", title);
SetProperty(mynewtile, "Count", count);
SetProperty(mynewtile, "BackTitle", backTitle);
SetProperty(mynewtile, "BackContent", backContent);
SetProperty(mynewtile, "SmallBackgroundImage", smallBackgroundImage);
SetProperty(mynewtile, "BackgroundImage", backgroundImage);
SetProperty(mynewtile, "BackBackgroundImage", backBackgroundImage);
SetProperty(mynewtile, "WideBackgroundImage", wideBackgroundImage);
SetProperty(mynewtile, "WideBackBackgroundImage", wideBackBackgroundImage);
SetProperty(mynewtile, "WideBackContent", wideBackContent);

Enfin, mettons à jour notre tuile :

ShellTile.ActiveTiles.First().Update((ShellTileData)mynewtile);

Et c’est tout ! Le code compile sous Windows Phone 7, malgré l’absence du type FlipTileData et fonctionnera correctement sous Windows Phone 8.

Résumé

 


private static void SetProperty(object instance, string name, object value)
{
var setMethod = instance.GetType().GetProperty(name).GetSetMethod();
setMethod.Invoke(instance, new object[] { value });
}

private static Version TargetedVersion = new Version(8, 0);
public static bool IsWP8 { get { return Environment.OSVersion.Version >= TargetedVersion; } }

...

if (IsWP8)
{

Type flipTileDataType = Type.GetType("Microsoft.Phone.Shell.FlipTileData, Microsoft.Phone");
var mynewtile = flipTileDataType.GetConstructor(new Type[] { }).Invoke(null);
SetProperty(mynewtile, "Title", title);
SetProperty(mynewtile, "Count", count);
SetProperty(mynewtile, "BackTitle", backTitle);
SetProperty(mynewtile, "BackContent", backContent);
SetProperty(mynewtile, "SmallBackgroundImage", smallBackgroundImage);
SetProperty(mynewtile, "BackgroundImage", backgroundImage);
SetProperty(mynewtile, "BackBackgroundImage", backBackgroundImage);
SetProperty(mynewtile, "WideBackgroundImage", wideBackgroundImage);
SetProperty(mynewtile, "WideBackBackgroundImage", wideBackBackgroundImage);
SetProperty(mynewtile, "WideBackContent", wideBackContent);
ShellTile.ActiveTiles.First().Update((ShellTileData)mynewtile);

}

 

Dernier point, si vous souhaitez utiliser le push pour mettre à jour votre application, pensez à envoyer à votre serveur la version du système afin d’envoyer le bon XML au téléphone (7 ou 8).