Archive

Articles taggués ‘WindowsPhone’

WP7 Push Notifications

logo-windows-phoneWindows Phone 7 approche doucement mais surement et ces derniers jours nous avons eu le droit de toucher à la version beta du SDK.

Depuis l’annonce, je suis de plus ou moins près ce nouveau OS mobile et j’en suis plutôt content dans l’ensemble, certaines limitations techniques me laisse un peu perplexe en ma qualité de dev malheureusement…

Les vidéos des devices sont sympas et…la réalité l’est tout autant ;) donc je voulais m’y intéresser d’un peu plus près après les classiques petites applications de rss reader et autre meteo reader, j’ai voulu regarder le système de notifications.

Ces notifications permettent de s’abonner à un channel de diffusion et ensuite d’être informé par le biais d’event un peu près n’importe quand (et donc même quand l’application “dort” en background).

Bon le concept…rien de bien nouveau et de magique mais comme d’habitude, le SDK est vraiment bien fait et assez souple pour permettre une intégration rapide et surtout facile au sein de nos applications mais egalement de n’importe quelles applications client/desktop/serveur.

Je ne vais pas m’étendre sur la création d’appli simple sur WP7, il commence a y en avoir un peu partout sur le net mais plus vous montrer comment en quelques lignes, on peut recevoir des notifications sur son application.

Nous allons découper cela en deux étapes, la première sera bien entendu de préparer son application à recevoir des notifications et réagir en conséquence.

La seconde sera la mise en place d’une plateforme d’envois, cela peut-être un peu près n’importe quoi…ah non enfaite n’importe quoi capable d’envoyer une requête HTTP (oui autant faire simple).

Comme évoqué, nous devons passer par un channel, il suffit d’imaginer cela comme un tuyau ou des messages peuvent se mettre en attente d’être consommé par l’application.

public HttpNotificationChannel myChannel;

A savoir que le channel pour une application peut changer entre chaque lancement mais pas obligatoirement donc il faut prendre en compte ce cas:

myChannel = HttpNotificationChannel.Find("MyChan"); //ou MyChan est un nom permettant de le retrouver par la suite a coup de ce .Find

Les deux cas:

1. Le channel existe déjà, il nous suffit de nous y abonner (if myChannel != null)

2. Le channel n’existe pas et/ou plus, on va donc l’ouvrir puis s’y abonner

Pour ouvrir notre channel, deux instructions:

myChannel = new HttpNotificationChannel("MyChan");
myChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(myChannel_ChannelUriUpdated);
myChannel.Open();

Bon d’accord…trois instructions car l’event ChannelUriUpdated est là pour nous informer que l’adresse de notre channel, assez pratique pour la communiquer aux autres (les “senders”).

En version simple, voici la méthode en question:

void myChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
    Debug.WriteLine("Notification channel URI:" + e.ChannelUri.ToString());
}

La, bien sûr il faut imaginer implémenter l’envoi de cette uri vers un server ou un autre client pour qu’ils sachent par ou envoyer les notifications.

Je vous laisse mettre en place cette partie, en fonction de vos besoins.

Il existe trois types de notifications possibles, chacune ayant un rôle particulier et un “champs d’action”

1. Les Raw notifications, système le plus “ouvert” car permettant d’envoyer un peu près ce que l’on veut, c’est donc la façon pour communiquer avec son application tout ce qui concerne la logique de l’application.

2. Les Tile notifications, sont celle pour mettre à jour la tile de l’application si celle-ci est “pin to start” (comprendre par la, mise en avant sur la page d’accueil du téléphone), on peut faire varier l’image mais également un compteur (prenons exemple du nombre de mail non lu) et le titre de la tile

3. Les Toast notifications, elles permettent d’afficher un petit bandeau en haut de l’écran qui contient l’icône de l’application, un titre et un sous-titre. Utile pour par exemple informer qu’une chose est arrivée dans l’application et si on clique dessus, l’application s’ouvre.

Voici une illustrations pour les Tile et une pour les Toasts, les autres n’ayant pas de visuel ( sauf si choix du développeur)

Un exemple de tile:

wp7Tile3

Un exemple de Toast:

wp7Toast

Ensuite il suffit de brancher notre channel au shell du telephone, pour cela:

myChannel.BindToShellTile(); //pour s’abonner aux Tiles

Suffit pour cela.

Nous allons pour le reste ajouter le bind des toasts:

myChannel.BindToShellToast(); //pour s’abonner aux Toasts
/* pour recevoir les Raw */
myChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(myChannel_HttpNotificationReceived);
/* gestion des erreurs */
myChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(myChannel_ErrorOccurred);

Et un event nous permettant de gérer les erreurs.

Celui du milieu étant pour gérer les Raw :) .

Je ne vais pas m’étendre sur les raw, il faut savoir que l’on envoie un buffer dans ce type de notification donc ensuite le protocole de communication dépend entièrement de l’application cible, il faut mettre en place une API que l’envoyeur comme le destinataire connait.

Une fois l’event levé, il vous suffit de lire le contenu de e.Notification.Body pour y entrainer vos informations.

Rien de plus n’est nécessaire, nous somme déjà en mesure de recevoir tout ce qui nous intéresse!

Passons donc à l’envois de notification, on part du principe que vous avez communiqué l’adresse du channel a un serveur qui par exemple va de temps en temps envoyer une notification vers les clients abonnés.

Dans notre exemple nous simulerons cela par une adresse superbement gérer au sein d’un copier/coller car c’est bien plus classe au sein d’un tuto :) .

Etudions déjà la structure des messages à envoyer dans le cas d’un Toast ou d’un Tile, à savoir que c’est encore sujet a modification donc dans le cas d’une mise à jour, si cela ne marche plus, pas de panique, il suffit d’aller voir sur la page MSDN la nouvelle version: http://msdn.microsoft.com/en-us/library/ff402545%28v=VS.92%29.aspx

Dans le cas d’un Tile, on va donc envoyer:

string tileMessage = String.Format("Content-Type: text/xml\r\nX-WindowsPhone-Target: token\r\n\r\n" +
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
"<wp:Tile>" +
"<wp:BackgroundImage>{0}</wp:BackgroundImage>" +
"<wp:Count>{1}</wp:Count>" +
"<wp:Title>{2}</wp:Title>" +
"</wp:Tile> " +
"</wp:Notification>", this.Image.Text, this.Count.Text, this.Message.Text);

On voit donc trois paramètres servant à:

1. Indiquez l’image à mettre en background de Tile, doit être contenu dans l’application ou à télécharger sur un serveur “autorisé” (lors du BindToShellTile, une surcharge permet de lister les serveurs “autorisés”, image qui doit prendre moins d’une minute à se télécharger!)

2. Un compteur, par exemple le nombre de mail non lu

3. Un titre, je vous laisse deviner

Et dans le cas d’un Toast:

string toastMessage = String.Format("Content-Type: text/xml\r\nX-WindowsPhone-Target: toast\r\n\r\n" +
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
"<wp:Toast>" +
"<wp:Text1>{0}</wp:Text1>" +
"<wp:Text2>{1}</wp:Text2>" +
"</wp:Toast>" +
"</wp:Notification>", this.Message.Text, this.SubMessage.Text);

Cette fois ci, deux paramètres:

1. Un titre

2. Un sous-titre

Et là on se demande ou l’envoyer? Et bien tout simplement vers notre adresse de channel donne par l’application et que l’on va donc récupérer sur notre serveur ou…dans le buffer magique du copier/coller :D .

Pour cela, je ne vais pas m’étendre sur l’explication de ce code, rien de bien mystérieux:

HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(subscriptionUri);
sendNotificationRequest.Method = "POST";
sendNotificationRequest.Headers = new WebHeaderCollection();
sendNotificationRequest.Headers.Add("X-NotificationClass", codeHeader);
byte[] notificationMessage = Encoding.Default.GetBytes(msg);
sendNotificationRequest.ContentLength = notificationMessage.Length;
using (Stream requestStream = sendNotificationRequest.GetRequestStream())
{
    requestStream.Write(notificationMessage, 0, notificationMessage.Length);
}
response = (HttpWebResponse)sendNotificationRequest.GetResponse();
string notificationStatus = response.Headers["X-NotificationStatus"];
string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];

Il nous suffit donc d’appeler ce code avec subscriptionUri correspondant a notre adresse de channel et petite astuce, codeHeader doit prendre la valeur de “1” dans le cas d’un Tile et “2” pour un Toast.

msg etant bien sur le flux xml de la notification.

Je dois admettre que cette petite différence de code header est casse pied mais la doc est très clair la dessus :) .

Dans le cas d’un envoi d’information en Raw, une fois votre protocole défini, il vous suffit d’envoyer l’information sans mettre de code header particulier.

Si on prend l’exemple MSDN :

new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

Rien de nous empêche bien sûr d’envoyer des textes en clair ou autre information, quand que les deux parties savent le lire et l’écrire correctement :) .

L’idée est de permettre un transfert simple d’information même quand l’application n’est pas active (car si active, un simple webservice suffit amplement).

Pour les toast, je vous laisse vous reporter a l’image plus haut pour voir a quoi cela ressemble, concernant le changement de tile et l’ajout d’information, voici une illustration:

wp7Tile2

Je n’ai mis que de petit bout de code pour me concentrer sur l’essentiel mais pour ceux n’ayant pas réussi à remettre cela en ordre, voici une classe complète permettant de gérer les abonnements.

public class Notification
{
    public HttpNotificationChannel myChannel;
    public void CreatingANotificationChannel()
    {
        myChannel = HttpNotificationChannel.Find("MyChan");

        if (myChannel == null)
        {
            myChannel = new HttpNotificationChannel("MyChan");
            myChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(myChannel_ChannelUriUpdated);
            myChannel.Open();
        }
        else
        {
            Debug.WriteLine("Notification channel URI:" + myChannel.ChannelUri.ToString());
        }
        myChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(myChannel_HttpNotificationReceived);
        myChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(myChannel_ErrorOccurred);
        myChannel.BindToShellTile();
        myChannel.BindToShellToast();
    }

    void myChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
    {
        Debug.WriteLine("Notification channel URI:" + e.ChannelUri.ToString());
    }

    void myChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
    {
        switch (e.ErrorType)
        {
            case ChannelErrorType.ChannelOpenFailed:
                // ...
                break;
            case ChannelErrorType.MessageBadContent:
                // ...
                break;
            case ChannelErrorType.NotificationRateTooHigh:
                // ...
                break;
            case ChannelErrorType.PayloadFormatError:
                // ...
                break;
            case ChannelErrorType.PowerLevelChanged:
                // ...
                break;
        }
    }
    void myChannel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)
    {
        if (e.Notification.Body != null && e.Notification.Headers != null)
        {
            System.IO.StreamReader reader = new System.IO.StreamReader(e.Notification.Body);
        }
    }
}

J’ai également mis en place une page web vous permettant d’envoyer des notifications sur un channel que vous lui donnez en paramètre :) .

http://wp7.fr/push/

Categories: .Net, C#, WP7 Tags: , , ,

PrismEngine tourne maintenant avec XNA 4.0!

2010_logo_prismengine Depuis l’annonce de la version 4.0 du Framework XNA, l’équipe de PrismEngine avait une folle envie de regarder cela de plus près et rapidement faire évoluer notre moteur dessus pour pouvoir tirer parti de la nouvelle plateforme mobile de Microsoft.

Apres une semaine chargée en évènement, on notera par exemple le boot camp de Microsoft pour Imagine Cup ou j’étais en qualité de mentor pour un groupe d’étudiant de troisième année d’Epitech. Quelques tests sur les nouvelles capacités du Framework (voir les derniers articles sur le tactile par exemple).

Le groupe, disons plutôt notre lead technique Benjamin Baldacci c’était réservé une nuit avec comme objectif de mener à bien cette évolution.

Vers 5h du matin, j’ai reçu un mail m’annonçant que cela était fait et qu’il était maintenant temps pour lui d’aller jouer un peu à la xbox 360 ;) .

cco_resources_downloads_downloadItemImage_XNAGS4_CTPLe passage vers XNA 4.0 n’est pas final encore, nous attendront une version plus complète du  Framework qui n’est pour le moment qu’en CTP mais nous avons pu confirmer que même pour un projet de grande ampleur, la transition n’est pas bien lourde.

Il y a bien quelques petites choses qu’il faut modifier mais dans l’ensemble, aucun soucis.

En quelques heures, le moteur était opérationnel !

Je me permettrais de citer notre lead technique : « Foutu référence null que le débuguer était pas foutu de m’indiquer ! », bug qui a dû lui prendre environ la moitié du temps c’est pour dire…

Aucune demo n’a été faite spécifiquement pour la plateforme, nous avons tout simplement repris une petite demo faite il y a quelque temps qui était là pour démontrer l’ajout de fonctionnalité par le biais de module.

Cela marchait sur PC, sur Xbox360, sur Surface et sur Zune HD et bien maintenant on peut officiellement dire que cela marche également sur Windows Phone 7 Series :) .

(A noter que le Zune HD a disparu de la version 4.0 du Framework donc paix à son âme…)

PrismEngine, un des premiers moteurs XNA a tourner sur Windows Mobile? Dans les premiers en tous les cas ;) .

Merci à Benjamin pour son boulot!

WP1

WP2

WindowsPhone Series 7

image

image

Microsoft était vraiment attendu à la Mobile World Congress 2010 car nous savions maintenant un peu près tous que la nouvelle version de Windows Mobile allait etre présentée.

Je dis nouvelle car oui la 6.5 n’est qu’un petit patch pour éviter de trop couler sur le marché ;) .

Mais comme on pouvait l’espérer, Microsoft continue sur sa lancé de remise en question et adaptation au marché en repensant le produit.

Pour ceux qui ont la chance d’avoir un Zune HD comme moi ou qui ont déjà utiliser le Zune Software, on peut globalement dire que le WindowsPhone Series 7 est dans la continuité en terme d’interface. Et ce n’est pas moi qui vais m’en plaindre!

On peut lui reprocher peut-être les gros carres “moche” du panneau d’accueil mais j’ai envie de croire que ce n’est pas la version final ou sinon et bien on prendra le temps de custom un peut cela ;) .

Mais dans l’ensemble je pense que cette nouvelle monture a une chance de s’installer sur le marché qui est pourtant bien remplie par l’Iphone et Android qui monte doucement mais surement.

L’accent est vraiment mis sur le côté social mais également une utilisation moderne de son téléphone. On peut remarquer dans un spot la petite “attaque” au système de l’IPhone ou tout repose sur les apps mais au final aucune ne communique vraiment, chacune remplie un peu près son rôle mais cela manque d’unification pour permettre la meilleure utilisation de son téléphone.

Vous cherchez un restaurant japonais? Une petite recherche vous proposera les résultats les plus proche de votre position mais également et automatiquement toutes les informations sur les restaurants, pas besoin de copier-coller les noms, voir devoir les noter sur un bout de papier puis refaire une recherche sur chacun, non le téléphone fait le boulot a votre place.

Ce n’est qu’un exemple de scenario mais l’idée générale est d’unifié l’ensemble de l’utilisation de l’appareil pour offrir vraiment un produit complet et non seulement un agglomérat de petite application.

L’intégration de toute la “famille” Zune permettra d’avoir une offre multimédia vraiment sympa et quiconque ayant déjà eu un Zune HD entre les mains devrait pouvoir confirmer ;)

Mais même si on reprend les concepts, on les pousse encore un peu plus loin avec le système de “hub”, des sortes de lieux thématiques:

  • People (répertoire, réseaux sociaux unifies)
  • Images
  • Jeux
  • Musique et Vidéo (le Zune HD en gros)
  • Marketplace (appStore en version MS)
  • Office (on retrouve les logiciels de la gamme Office dans une version moderne et vraiment adapte aux mobiles)
  • image image image image image

On remarquera que la partie jeux sera directement votre compte Live (Xbox live) car l’offre sera totalement intégrée aux téléphones et donc on peut imaginer pouvoir rapidement avoir une offre de jeux sympathique.

Ils ont eu la “bonne” idée d’intégrer le système d »achievement” donc les gamers de la planète entière vont avoir un nouveau terrain de jeu.

Et nous les dev?! Et bien pas grand chose, ce n’était qu’une conférence de lancement mais lors de la MIX10 en mars, toutes les informations concernant les SDK et les technos seront dévoilées donc il reste plus qu’à espérer pouvoir avoir des “outils moderne” pour un téléphone qui se veut l’être…

Orange et AT&T sont les opérateurs retenue comme partenaires clefs mais les exclusivités ne sont plus vraiment les bienvenue en France donc il n’est pas certain que cela soit restreint a Orange pour nous :) .
Edit:
SFR sera de la partie également, on peut imaginer que tous le seront :) .

Bref, nous verrons bien cela dans quelques mois car les premières mobiles de téléphone équipé de cette “Series 7” seront dans le commerce à la fin de l’année 2010.

Plus d’information et des “demos” sur: http://www.windowsphone7series.com