Titanium Mobile, développement multiplateformes (iPhone et Android)
Thursday, October 27th, 2011Alors que les applications mobiles sont devenues incontournables d’un point de vue marketing pour nos clients, elles sont aussi de plus en plus complexes.
Au temps passé à développer une application riche, il faut dorénavant ajouter le temps à la porter sur différents systèmes d’exploitation. En effet, si la plupart des applications concernaient les plateformes IOS, il y a aujourd’hui une forte demande pour des applications android; ce qui est cohérent avec la courte avance qu’a pris android sur IOS récemment.
C’est dans ce contexte que plusieurs solutions de développement multiplateforme ont émergé. Titanium est l’une d’elles et propose donc de développer dans le même langage (javascript) une application pour IOS, Android et Blackberry (béta).
L’installation
L’outil est gratuit avec un support payant. L’enregistrement ne prend que quelques minutes et l’IDE s’installe sans rien faire de particulier sur mac ou PC. Afin de tester l’application sur le simulateur IOS ou pour la lancer sur un iphone, il faudra disposer d’un mac comme plateforme de développement. Toujours pour IOS, il faudra un compte développeur si l’on veut déployer sur iPhone ou iPad.
Une documentation de base (vidéos, exemples d’applications) est disponible mais rapidement c’est dans le forum de l’éditeur que l’on trouvera les réponses à ses questions ou des exemples de code. Le forum est assez vivant et la plupart des problèmes y sont déjà adressés.
L’IDE
La prise en main de l’outil est immédiate lorsque l’on connaît eclipse; on retrouve les fonctionnalités les plus couramment utilisées comme la détection des erreurs de syntaxe, la complétion automatique, le lancement des applications ou encore le debugging.
Depuis l’IDE on peut donc lancer les émulateurs ou bien directement le code sur les appareils. Il subsiste quelques différences entre les deux mais c’est globalement très satisfaisant pour tester sereinement.
Les concepts de développement
L’outil ne propose pas de WYSIWYG pour faire ses interfaces graphiques. Il faut donc créer programatiquement tous les écrans en donnant les paramètres de chaque composant visuel. Les différents composants “s’emboîtent” les uns dans les autres afin de créer le rendu final.
Il n’existe que 2 layouts différents: vertical et horizontal. C’est un peu juste pour décrire tous les types d’écran. C’est bien sûr suffisant mais parfois cela rajoute de la complexité et du code pas très intéressant à écrire.
Le langage
Entre Objective C et Java il y a un pas que beaucoup de développeurs n’ont pas franchi. En revanche, pour un développeur java il est courant d’avoir déjà manipulé du javascript ou de se faire rapidement aux concepts de base.
Ainsi, il est tout à fait possible et même recommandé de reconstruire son modèle objet, tant pour les objets métiers que pour les composants graphiques customisés.
Le gros bémol est qu’il n’est pas possible d’hériter directement des composants natifs fournis par Titanium. Il faut donc passer par un mécanisme d’encapsulation.
En revanche c’est un véritable plaisir de pouvoir passer des fonctions en paramètre d’autres fonctions, ce qui rend beaucoup plus aisé l’écriture de code ‘technique’ générique.
L’API et les librairies tierces
L’API proposée est très riche. D’un point de vue IHM, pour répondre aux besoins exprimés par les designers, nous avons pour le moment trouvé tous les composants graphiques nécessaires ou au moins les briques élémentaires qui nous ont permis de créer ce qui n’existait pas.
Techniquement, rien à redire non plus. Des appels HTTP pour faire du REST à la lecture de médias (vidéos) en passant par la localisation sur une carte ou la persistance des données dans une base SQLite beaucoup de choses sont proposées. L’éditeur vend également des composants supplémentaires (paypal, QR codes, facebook, …).
Tout ou presque. Presque parceque cet algorithme de cryptage que vous venez de créer il n’est pas dans l’API Titanium. Vous vous en servez déjà sur votre serveur node.js ? Il suffira de l’intégrer aux sources de votre application mobile! C’est donc toutes les librairies javascript que vous pouvez intégrer !
Depuis les dernières versions du SDK, titanium supporte la norme commonJS ce qui permet encore une plus grande réutilisabilité du code.
A savoir (bonnes pratiques, recommandations, …)
Malheureusement, parfois l’API ne fonctionne pas comme cela devrait, du moins sur une des plateformes cibles (il est rare qu’une fonctionnalité ne passe ni sur android ni sur iphone). Il faut donc utiliser des solutions de contournement des problèmes et surtout être un peu inventif ! Pour contourner les problèmes, nous avons préféré faire des workarounds qui fonctionnent sur les 2 OS cibles plutôt que de faire du code spécifique pour chacune des 2 plateformes avec dans un cas le code ‘classique’ et dans l’autre le contournement. Les commentaires dans le code sont alors de rigueur pour expliquer pourquoi l’API n’a pas été utilisée comme attendue.
Par exemple le composant de barre de navigation pour l’iphone n’apparaît pas correctement lorsque l’on souhaite mettre une image en arrière plan (corrigé dans le sdk 1.7.3!) Ce composant étant en plus spécifique iPhone, nous avons choisi de le redévelopper.
C’était assez simple car ce n’est qu’une vue que l’on place en haut de l’écran, toujours de la même taille, sur laquelle on peut ajouter des boutons, des libellés et évidement une image de fond. Et nous voilà avec notre barre de navigation maison, dont on pourra en plus se servir pour notre version android.
Si l’on a choisi Titanium pour son aspect multiplateforme, il est primordial de développer et de tester en même temps sur les différents OS. En effet, avec les adaptations dues aux contraintes techniques (bugs), il y a sans cesse des allers-retours pour valider que la solution mise en place est bien fonctionnelle sur tous les environnements.
Si on s’attaque par exemple à la réalisation de la version Android après avoir fini l’application sous IOS (ou réciproquement), à moins d’avoir une très bonne expérience sur Titanium, c’est sans exagérer l’assurance de passer autant de temps à développer sur chacune des plateformes et parfois même encore plus de code spécifique pour chacun des OS. Le gain (en temps) par rapport à un développement avec les langages natifs serait donc nul.
Une question importante à se poser est la gestion de l’affichage sur les différents appareils android. Nous avons fait le choix de traiter les 2 résolutions les plus courament utilisées en laissant de coté les plus petits écrans (sur lesquels l’expérience utilisateur ne serait de toute façon pas satisfaisante) et les tablettes (pas la cible d’utilisateurs).
Chaque résolution à gérer signifie un jeu d’image en plus à adapter.
La gestion de la mémoire
Lorsque l’on parcourt les documents sur la gestion de la mémoire, on trouve rapidement 2 méthodes pour implémenter son application tout en s’assurant que les besoins de mémoire n’explosent pas et forcent la fermeture de l’application.
La gestion la plus simple et visiblement celle qui avait été pensée au départ est très bien démontrée dans l’application KitchenSink (l’application de démo).
Le concept de base est que chaque écran existe dans un contexte différent et que ce contexte est détruit lorsque l’on ferme son écran. Des mécanismes très simples aident à ouvrir et fermer les écrans et donc à bien gérer sa mémoire disponible.
On aboutit donc à une hiérarchisation d’écrans que l’on pourrait représenter avec un arbre.
Un écran est maintenu en mémoire tant qu’il est affiché ou qu’un de ses sous-écrans est lui-même actif. Le point d’entrée de l’application (racine) connaît ses écrans et c’est à elle que l’on donne l’ordre d’en ouvrir un ou d’en fermer.
C’est ce choix que nous avons retenu pour notre application et cela fonctionne pour le moment avec la vingtaine d’écrans que nous avons.
Une gestion plus complexe est souvent expliquée à l’aide de l’application tweetanium. L’idée est de se passer du mécanisme offert par l’API et de tout charger dans un seul et même contexte. Il faut donc écrire à la main le code qui permet d’instancier en mémoire ou bien de libérer les écrans chaque fois que l’on en a besoin.
Ce mécanisme sans doute plus fin car complètement géré par le développeur est sans doute meilleur mais nécessité un coût de mise en oeuvre non négligeable, surtout quand on est pas habitué au développement avec Titanium.
Les développements spécifiques
Ce serait mentir que de dire que les applications développées avec titanium ne contiennent pas de code spécifique. D’ailleurs, ce n’est pas du tout ce que vend l’éditeur.
Dans certaines partie du code technique (non UI), il faut gérer différemment les OS. Par exemple pour gérer les droits d’accès à la géolocalisation du téléphone, l’enregistrement pour les messages Push (notifications), la navigation d’une page à l’autre, …
Au banc d’essai
La première question à se poser, mais indépendante de titanium est de savoir si on a envie de développer la même application pour android et ios. En effet, les utilisateurs android ont ils envie de retrouver une barre de navigation propre à l’iphone ? Titanium permet de lever certains points en faisant par exemple un type de rendu différent pour le gestionnaire d’onglet android et IOS.
Pour aider à répondre à cette question, l’équipe de titanium propose de faire le choix entre une application que les utilisateurs sauront immédiatement prendre en main (car s’inscrivant complètement dans les codes de développement de chaque OS) et une application avec une identité visuelle et ergonomique forte mais communes aux différents appareils mobiles.
Pour des raisons de délais (et donc de coûts) , nous avons plutôt misé sur une identité typique à l’iphone et (très) légèrement déclinée pour android. Ceci dans le but de mutualiser le plus de code possible.
Si il reste un nombre non négligeable de bugs, on parvient dans la plupart des cas à trouver des contournements pour arriver à ses fins. C’est bien sur plus coûteux en temps, notamment quand une fonctionnalité est correctement implémentée sur un système mais qu’elle comporte des dysfonctionnements sur l’autre. C’est là que l’expérience des développeurs sur la façon de traiter telle ou telle problématique permet de gagner énormément de temps en étant efficace dès la première implémentation.
Utiliser Titanium pour créer par exemple une application uniquement pour iPhone alors qu’on ne connaît pas Objective C est aussi une utilisation possible, surtout pour une application simple.
La première semaine de développement laisse une impression incroyable de simplicité et de productivité. Les “ennuis” ne commencent réellement que lorsque l’on souhaite peaufiner son interface utilisateur.
Pour une application avec énormément d’écrans, de données manipulées et stockées, il sera plus judicieux de développer en natif sous peine de se confronter à des problèmes supplémentaires (gestion plus difficile de la mémoire, des bugs sur certains composants, les tests unitaires sur des calculs en local, … ).
Le point le plus décevant restera tout de même l’abscence d’un framework de tests (unitaires et intégration). Si la tache est théoriquement faisable, la complexité de mise en place est rédibitoire.
Ainsi titanium propose pour le moment de s’appuyer sur des frameworks comme QUnit en attendant que l’éditeur ne sorte l’outillage adéquat. Mais si le test du code javascript reste accessible, c’est le rendu visuel et la navigation qui couteront le plus cher à mettre en place dans une usine logicielle.
Nous avons constaté que l’exécution est parfois moins fluide sous Android. L’éditeur promet de régler ce problème en utilisant V8 plutôt que Rhino. Les performances seraient au minimum 2x meilleures avec dans la plupart des cas une amélioration de 10x à 15x. Ceci sera disponible “dans le SDK 1.8, avant la fin de l’année”…
Valtech a choisi Titanium pour développer la 2ème version d’une application iphone qui a été téléchargée plus de 120 000 fois et pour lancer en même temps la version android qui n’existait pas jusqu’alors.









French Scrum User Group
Agile Alliance
Valtech
planet Valtech
