Windows Metro – Cycle de vie d’une application

Comme je l’avais dit en introduction, une application Windows 8 style Metro diffère de votre application web classique. Vous devrez notamment jouer avec les APIs offertes par le framework WinJS qui permet de communiquer entre le système est votre application.

Une application « vit » de son lancement à sa fermeture. Tout ce qui se passe entre représente le cycle de vie de l’application. Notez que comme sur les systèmes mobiles, les applications Metro peuvent être fermées à tout moment si le système à besoin de ressources. Il est donc important de bien gérer la vie et la mort de l’application.

Code commun à tous les templates applicatifs

Dans l’article précédent, on a vu les différents templates applicatifs proposés par Visual Studio:

Windows Metro – Les templates pour application JavaScript (Grid, Navigation, Split, …)

Tous ces templates contiennent une page (écran) par défaut, nommée « default.html »:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>BlankApp</title>

    <!-- WinJS references -->
    <link href="//Microsoft.WinJS.0.6/css/ui-dark.css" rel="stylesheet">
    <script src="//Microsoft.WinJS.0.6/js/base.js"></script>
    <script src="//Microsoft.WinJS.0.6/js/ui.js"></script>

    <!-- BlankApp references -->
    <link href="/css/default.css" rel="stylesheet">
    <script src="/js/default.js"></script>
</head>
<body>
    <p>Content goes here</p>
</body>
</html>

Celle-ci référence plusieurs fichiers JavaScript « default.js », notamment ceux du framework WinJS. Elle référence aussi un fichier JavaScript qui va contenir le comportement dynamique de la page. De base, voici ce que contient ce fichier:

(function () {
    "use strict";

    var app = WinJS.Application;

    app.onactivated = function (eventObject) {
        if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
            if (eventObject.detail.previousExecutionState !== Windows.ApplicationModel.Activation.ApplicationExecutionState.terminated) {
                // TODO: This application has been newly launched. Initialize
                // your application here.
            } else {
                // TODO: This application has been reactivated from suspension.
                // Restore application state here.
            }
            WinJS.UI.processAll();
        }
    };

    app.oncheckpoint = function (eventObject) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. You might use the
        // WinJS.Application.sessionState object, which is automatically
        // saved and restored across suspension. If you need to complete an
        // asynchronous operation before your application is suspended, call
        // eventObject.setPromise().
    };

    app.start();
})();

On a donc une fonction auto-exécutée, pour permettre de « fermer » le scope du bloc de code à l’intérieur. Grâce à cette fonction, les méthodes déclarées à l’intérieur ne sont pas visibles de l’extérieur, une sorte de « private » en JavaScript.

Petite remarque personnelle, je ne comprend pas vraiment pourquoi Microsoft isole son code comme cela dans tous les exemples. L’utilisation de leur namespace Windows / WinJS suffit à compartimenter le code pour éviter les collisions. Cela rend le code difficile à manipuler par la suite. Bref, j’aurai sûrement pas fait comme cela mais ce n’est pas grave.

La fonction WinJS.Application.start

La méthode WinJS.Application.start est appelée dans tous les templates. C’est elle qui va démarrer un processus important dans le cycle de vie (livecycle) de l’application, celui des évènements qui transitent par l’objet WinJS.Application. Parmi ces évènements, on a les évènements provenant du système comme les évènements de lancement nommés « checkpoint » dans le jargon Win Metro.

La fonction WinJS.Application.oncheckpoint

Dans le code de base, on définit la fonction WinJS.Application.oncheckpoint. Celle-ci sera appelée par le système quand l’application juste avant sa mise en arrière-plan, pendant la bascule vers une autre application par exemple.

C’est à ce moment que vous devrez sauvegarder l’état de l’application (navigation / choix utilisateur). En effet, une fois en arrière plan, votre application peut être « tuée » par le système à n’importe quel moment. Si l’utilisateur relance votre application, vous voudrez le renvoyer là où il était auparavant, vous devrez donc sauvegarder les informations importantes pour les recharger plus tard.

Si vous êtes développeur Flex /AIR, c’est l’équivalent d’un évènement Event.DEACTIVATE propagé sur l’application principale.

La fonction WinJS.Application.onactivated

La fonction onactivate est invoquée par le système au lancement de l’application. A celle-ci, l’application passe un objet qui contient des détails sur le contexte de ce lancement. Vous pourrez notamment savoir si c’est le premier lancement de l’application ou si l’utilisateur est simplement repassé sur votre application alors qu’elle était en arrière-plan.

Pour les devs AIR, c’est l’équivalent de l’évènement flash.events.InvokeEvent.

La fonction WinJS.UI.processAll

A la fin de l’appel à onactivated, vous pouvez remarquer que l’on fait appel à WinJS.UI.processAll. Cette méthode est une des pierres angulaires du framework WinJS. En effet, c’est elle qui indique au framework que tous les composants graphiques doivent être rendus / interprétés.

Comme vous le verrez pas la suite, tout l’interface graphique se fait de manière déclarative par des attributs « data-win-* » sur des éléments HTML. Ces éléments non-standards doivent être interprétés par WinJS qui va les transformer en composants « natifs ».

Quelques mots sur le fonctionnement de WinJS.UI.processAll

A l’appel de processAll, WinJS va donc parcourir tout le DOM à le recherche de ces attributs « data-win-* ». Le processus se fait en fait en 2 passes:

  1. WinJS recherche tous les tags ayant un attribut « data-win-control ». On le verra plus tard, dans ces attributs, on définit un « décorateur » au sens Design Pattern du terme. C’est-à-dire que l’on définit une classe qui va venir gérer notre composant, son comportement interne et ses interactions. A chaque attribut « data-win-control », WinJS va instancier ce décorateur et l’associer au composant.
  2. WinJS recherche tous les tags ayant un attribut « data-win-options ». Celui-ci contient les options passées au décorateur instancié en 1/. WinJS va ainsi évaluer toutes les propriétés dynamiques et les setter sur l’instance du décorateur.

Une fois instancié, le décorateur créé à l’étape 1 est accessible par la propriété « winControl » de l’élément HTML.

Mon avis personnel sur ce fonctionnement

Ce fonctionnement est assez atypique et on ne le retrouve pas ce système de décorateur dans le HTML « classique ». Ce système de décorateur est en fait mis en place pour contourner une grosse faiblesse du langage HTML. Le problème avec HTML est que l’on ne peut pas créer de composant ayant son propre contexte d’exécution. Vous ne pouvez pas créer un composant qui contient du JavaScript en interne, propre au composant et ayant pour scope le composant.

Si vous regardez du côté du framework Flex, vous verrez que l’on peut créer ce genre de composant indépendant, dans un fichier à part. Ayant mangé plusieurs années de développement Flex au quotidien, je peux vous assurer que cela vous facilite la tâche lorsque vous voulez créer des composants réutilisables, en encapsulant son aspect graphique et son comportement (code).

Si vous lisez ce draft W3C sur les « Web Components », vous verrez que c’est le genre de chose qu’ils essaient de reproduire avec ce qu’ils appelent les « Custom Elements« :

Introduction to Web Components

Cela permet aussi de s’échanger facilement des composants / librairies et de les intégrer à un projet. Bref, vous l’avez compris, j’ai adoré le système de composant lorsque je faisais du développement Flex et si ce système avait été adopté dans le monde HTML dès le départ, je pense que le développement web ressemblerait moins à un champ de bataille de librairies :).

Alors pourquoi Windows y est allé de ses propres attributs? Et bien en fait, ils n’avaient pas vraiment le choix, étant dans un contexte « web », il leur a fallu « broder » avec des propriétés dynamiques qui peuvent être résolues à la volée. Ça parait assez moche au départ mais c’est plutôt malin, car le contexte d’exécution du composant est cloisonné dans la propriété « winControl » de l’élément DOM.

Voilà, ça en est fini pour mon analyse personnelle, vous pouvez bien sûr utiliser les commentaires pour donner votre avis!

Posted in JavaScript, Windows Metro | 4 Comments

Windows Metro – Les templates pour application JavaScript (Grid, Navigation, Split, …)

Après une petite introduction au développement Windows Metro en HTML5, on commence à rentrer dans le vif du sujet. Cet article assume que vous avez installé Windows 8 dans une machine virtuelle avec Visual Studio 11 Express Beta:

http://html5-tutorial.fr/installation-de-windows-8-consumer-preview-sur-vmware-workstation-8/

A la création d’un nouveau projet de type « JavaScript > Windows Metro Style », Visual Studio vous propose plusieurs templates, installés par défaut:

Pour les développeurs Flex, cela devrait vous rappeler les templates disponibles pour AIR Mobile :). Ces templates sont ceux fournis par Microsoft, mais visiblement, il y aura la possibilité d’aller chercher les siens ou d’aller en cherche online.

Un template est une structure de fichiers pour vous aider à bien démarrer. Un template contient ce qu’il faut pour démarrer une application avec parfois de fausses données pour montrer l’interface résultante. Suivant le type d’application que vous allez préparer, vous allez gagner du temps en choisissant le bon template.

Fichiers communs à tous les templates

Peu importe le template que vous allez choisir, une application Windows Metro a une structure de base à respecter. Vous aurez notamment les fichiers:

  • default.html, la page d’accueil de l’applicaiton
  • default.js qui permet de scripter l’application au démarrage
  • default.css pour les styles de l’application.
  • package.appxmanifest qui décrit le package d’application pour Windows (un peu comme le fichier *-app.xml pour Adobe AIR).
  • Les logos / splashscreens nécessaires pour une application Metro
Le fichier default.html référence aussi la feuille de style de base (plusieurs styles sont disponibles).

Le template « Blank Application »

Le template le plus minimaliste. Celui-ci est une application qui pouvoir être exécutée mais sans aucun composant graphique et sans aucune donnée. Vous aurez simplement un texte sur fond noir.

Le template Blank contient uniquement les fichiers communs à tous les templates

Le template « Navigation Application »

Voilà un template plus intéressant. En effet, celui-ci intègre directement un mécanisme de navigation dans les « pages » de votre application. Une « page » est un écran dans le vocabulaire Metro. De base, il contient un « navigator », dans lequel les pages vont venir se placer.

Le template contient une page « homePage.html » qui sera votre premier écran. A vous de rajouter des pages par la suite et de gérer le lancement de chaque page suivant les actions utilisateur.

Le plus intéressant ici est le fichier navigator.js intégré à la page default.html. C’est lui qui contient la logique de navigation, à travers l’objet WinJS.Navigation.

D’autres templates comme Grid ou Split sont basés sur Navigation Application.

Le template « Grid Application »

Le template Grid est déjà plus complexe et contient déjà des composants graphiques ainsi que des données de test. Il présente une page d’accueil ressemblant au menu démarrer de l’interface Metro avec des éléments disposés en groupe. Chaque élément est représenté par une « tuile », c’est la philosophie de l’interface Metro. A la sélection d’un élément, une nouvelle page est ouverte avec le détail de l’élément.

Le template Grid est basé sur le template « Navigation Application » et ajoute simplement des pages d’exemple (groupedItemsPage.html, groupDetailPage, itemDetailPage).

Le template « Split Application »

Un autre template basé sur Navigation Application. Celui-ci présente en page d’accueil, la page « itemsPage.html », contenant une liste de groupe d’éléments rassemblés en grille.

Lors du choix d’un groupe d’éléments, l’utilisateur navigue vers la page « splitPage.html » contenant une interface en 2 parties, séparées verticalement. La partie de gauche contient le détail du groupe et la partie de droite contient le détail de l’élément sélectionné dans ce groupe.

Ce genre de template est adapté pour créer une application lecteur de flux RSS par exemple. Sur la page d’accueil, on aurait la liste des flux disponibles et en cliquant sur un flux, on aurait la liste des derniers articles sur la gauche et le détail de l’article sur la droite.

Le template « Fixed Layout Application »

Le template Fixed Layout est quasiment identique au template Blank. La seule différence est que le contenu est destiné à une fenêtre aux dimensions fixes. Ce template est recommandé pour les jeux créés en JavaScript.

La taille d’une application à disposition fixe est ajustée pour s’adapter à la zone d’affichage. Le modèle utilise un contrôle ViewBox pour l’ajustement. Par exemple, si vous choisissez une résolution de 768 x 1024 pour votre application, mais que le périphérique exécutant l’application ne dispose pas d’une zone d’affichage de 768 x 1024, l’affichage de l’application est agrandi ou rétréci pour garantir que sa fenêtre d’affichage à disposition fixe soit visible par l’utilisateur

Posted in Windows Metro | 1 Comment

Introduction au développement HTML / JavaScript / CSS pour Windows 8

Windows 8 commence à pointer le bout de son nez avec une Developer Preview et une version Consumer Preview avant la version finale prévue pour la fin d’année. Avec W8 arrive une nouvelle opportunité pour nous les développeurs qui est le Windows Store, une sorte d’App Store pour applications Windows. A l’intérieur de ce futur store, des applications et des jeux qu’il va falloir développer sur de nouvelles APIs Windows.

Windows 8 et Metro

Bien sûr, Windows 8 contient toujours une interface « à l’ancienne » similaire à Windows 7 qui pourra faire tourner les applications existantes. Pour le Windows Store, on parle des applications qui vont utiliser la nouvelle interface nommée « Metro ». Metro est une interface prévue pour être utilisée sur du matériel tactile (tablette & co).

Chaque « tuile » représente une application, un peu comme la home de votre iPhone et ses icônes. Cette interface à base de Tile est cohérente avec le reste des produits Microsoft (Windows Phone 7 et Xbox 360 par exemple). Cette interface est en fait le nouveau menu Démarrer de Windows 8, ce qui est un peu surprenant au départ mais on s’y habitue vite.

Installer Windows 8 sur une machine virtuelle

Microsoft fournit un ISO de sa Consumer Preview que vous pouvez installer sur votre machine. J’ai fait un petit article sur les erreurs à éviter lors de l’installation:

Installation de Windows 8 Consumer Preview sur VMware Workstation 8

Développer pour Windows 8 Metro

Si vous développez des applications Desktop (ex natif ou Adobe AIR) ou des web app (dans le navigateur), cela fonctionnera comme avant, mais seulement dans l’ancienne interface. Pour pouvoir réaliser une application Windows Metro, vous allez devoir utiliser les nouvelles APIs Microsoft à votre disposition.

Pour cela, vous avez 3 options selon vos compétences:

  • Si vous êtes développeur « web », vous allez utiliser HTML / JavaScript / CSS (alias HTML5) pour développer votre application Windows Metro
  • Si vous connaissez Windows Presentation Foundation ou Silverlight, vous pouvez utiliser XAML (langage déclaratif d’interface) et C++ / C# /  Visual Basic pour le code
  • Si vous connaissez DirectX, vous pouvez utiliser du C++ natif / HLSL

Vous pouvez aussi faire des mix entre des composants C++ appelés par du JavaScript mais là, ça devient assez avancé

Les APIs disponibles

Au délà des langages, Windows 8 propose surtout plusieurs ensembles d’API:

  • Windows Runtime : API Native du système d’exploitation. Essentielle pour les applications de style Metro. Implémentée en C++ et prise en charge en JavaScript, C#, Visual Basic et C++ d’une façon qui semble naturelle pour chaque langage.
  • HTML/CSS pour les applications de style Metro: Sous-ensemble de code HTML et CSS que vous pouvez utiliser dans une application de style Metro.
  • Bibliothèque Windows pour JavaScript (alias WinJS) : Contrôles, objets et styles que vous pouvez utiliser lors de la création d’une application de style Metro en JavaScript.
  • .NET pour les applications de style Metro : Sous-ensemble de l’API .NET que vous pouvez utiliser dans une application de style Metro en C++, C# ou Visual Basic.
  • Win32 et COM pour les applications de style Metro : Sous-ensemble des API Win32 et COM que vous pouvez utiliser dans une application de style Metro.

Les outils des développement

Pour l’instant, le seul outil pouvant créer des applications Windows 8 de style Metro est MS Visual Studio 11 Express. Cette version 11 est encore en beta mais vous pouvez déjà l’installer sur votre Consumer Preview. Cette version Express est gratuite.

Pour l’avoir essayé, Visual Studio 11 n’est pas génial pour le développement HTML / JS mais contient certains éléments essentiels pour le développement Metro (Réserver un nom d’application, lancement en mode Metro, debug / breakpoints,…) .

(Lire la suite…)

Posted in Windows Metro | 1 Comment

Installation de Windows 8 Consumer Preview sur VMware Workstation 8

Ça faisait longtemps que je n’avais pas écrit un billet alors en voici un petit sur l’installation de la version Consumer Preview de Windows 8. Pour pouvoir obtenir du feedback, Windows fournit une version « alpha » (susceptible de changer du tout au tout) sous la forme d’un .ISO à graver où à faire tourner sur sa machine.

Malgré l’aspect simple de la tâche, je suis tombé sur pas mal de galères donc si vous voulez vous aussi installer cette version Win8 Consumer Preview, suivez le guide :).

Attention, si vous essayez d’installer cet ISO directement sur votre machine, on vous proposera une mise à niveau de votre Windows. Cette version CP n’est pas stable, il est donc conseillé de l’installer dans une machine virtuelle (VM).

Installer VMWare Workstation 8 ou VirtualBox

Sur mon poste, j’avais un VMPlayer 4 et j’ai essayé de l’utiliser pour installer l’ISO. Après installation / boot, un bon vieux BSOD avec l’erreur « DPC_WATCHDOG_VIOLATION ». La solution est d’installer VMWare Workstation 8 (dernière version, la 7 ne va pas fonctionner).

http://www.vmware.com/go/downloadworkstation-fr

J’ai aussi vu que cela fonctionne très bien avec VirtualBox qui a même un preset Win8 dans la dernière version

Télécharger l’ISO 32-bit et pas le 64-bit

En essayant avec la version 64-bit, j’ai eu le BSOD « HAL_INITIALIZATION_FAILED ». Pour pouvoir virtualiser correctement ce Win8 avec VMWare, il faut utiliser les ISO 32-bit

http://windows.microsoft.com/en-US/windows-8/download

Choisir le modèle de machine virtuelle Windows 7

Quand vous allez créer une nouvelle VM à partir d’un ISO, VMWare vous demande le système d’exploitation qui sera utilisé. Bien sûr Windows 8 n’est pas dans la liste et plusieurs tutoriaux proposent de choisir « Other 32-bit ». L’installation a fonctionné comme cela mais impossible d’avoir la connexion réseau. Il faut en fait choisir « Windows 7″ comme type d’installation pour que le bridge / NAT fonctionne correctement

Configuration matérielle

16Go de disque, 1Go de RAM, Accélération 3D. Normalement, tout est ok avec le template Windows 7. Dans la catégorie « Floppy », décocher Connect on Startup pour ne pas utiliser de floppy drive, sinon vous aurez l’erreur suivante

Message d’erreur « Windows cannot read the <ProductKey> setting from the unattend answer file. »

Arrêtez la VM, dans ses propriétés matérielles, catégorie Floppy, décochez « Connect on startup »

Si vos VMWare Tools ne sont pas installés

Une fois Win8 installé, dans le menu de démarrage, choisissez « Desktop » pour revenir à l’interface type Win7. Depuis le menu « VM » de VMWare Workstation, choisissez « Install VMware Tools… », ce qui aura effet de monter un lecteur DVD virtuel. Lancez le setup de ce lecteur DVD pour installer les VMWare Tools

Télécharger le SDK Windows 8

Si vous installez Windows 8 pour développez dessus, vous pouvez installer directement le SDK en vous rendant à l’adresse suivante dans Internet Explorer (10 du coup):

http://msdn.microsoft.com/en-us/windows/apps/br229516

Si vous obtenez une erreur « Visual C++ 11 x86 Debug Runtime – 11.0.50214 Fatal error during installation », relancez l’installation et faîtes « réparer »

Lancer Visual Studio 2011 Preview

Retourner dans le menu Start (rollover bas gauche pour retourner à l’interface métro) puis à droite , vous trouverez Visual Studio 2011.

Au passage, je n’ai pas installé Windows 8 juste pour regarder mais pour développer ma première application à destination du futur Windows Store en HTML / JS / CSS. Pas mal de choses à apprendre, dès que je suis assez à l’aise, je ferai quelques tutoriaux sur ce blog :)

Posted in Uncategorized | 1 Comment