blog, Matt Gemmell est revenu sur un thème qui lui tient à cœur : le rythme soutenable. Ce n’est pas en demandant toujours plus à ses développeurs qu’on obtient des résultats sur la durée.
A retenir : Plutôt que de prendre un 5ème café pour arriver enfin à finir votre projet open source qui doit sortir bientôt en parallèle avec votre mission super importante, allez vous coucher, vous n’en serez que plus efficace.
Martin Legris nous a présenté une nouvelle façon de réaliser des applications mobiles. Un des exemples était une console de musicien permettant de réaliser de la musique : Sommes-nous capable de faire rentrer toutes les actions dans une application mobile ? La réponse est effectivement OUI et pour s’en rendre compte, il suffit de voir la vidéo de l’application Figure sur iPhone.
Il remonte le problème classique des sites de e-commerce, qui sont incapables de s’adapter à l’utilisateur et d’apprendre de son comportement lors de recherches de produits. Problème que l’on retrouve également dans les applications mobiles. Ainsi, il faut une application capable de remonter les produits les plus adaptés. Une application qui apprend des choix de l’utilisateur et qui est capable d'afficher le prochain résultat en fonction des rejets des précédents critères comme les couleurs, les prix ou encore les caractéristiques des produits. L'objectif de Martin Legris est de limiter les clics/touches dans les applications.
Avec la sortie de l’iPhone 5, le développement des interfaces sous iOS commence à se rapprocher du monde d’Android avec la gestion de différentes résolutions. Apple a ainsi sorti un nouveau système pour gérer les interfaces. Il s’agit d'Autolayout où le développeur est amené à définir des contraintes entre les éléments graphiques et ne plus utiliser la configuration d’une frame (coordonnées X/Y + dimensions width/height). Cesare Rocchi revient sur l’histoire d’iOS avec le premier iPhone (320*480), le premier iPad (1024*768), les écrans retina (iPhone : 640*960 / iPad : 2048*1536) et désormais l’iPhone 5 (640*1136). Au début les développeurs étaient amenés à utiliser 2 techniques pour configurer les interfaces :
Désormais, il ne faut plus configurer la frame d’un élément mais définir des contraintes entre les différents éléments. Autolayout n'est rien d'autre qu'une équation linéaire avec :
Ces différentes contraintes peuvent être configurées aussi bien depuis Interface Builder que depuis le code de l’application. La classe permettant de fixer ces contraintes est : NSLayoutConstraint. La méthode permettant de fixer une contrainte est assez complexe puisqu’elle nécessite de fournir les éléments, les attributs et des paramètres additionnels. Ainsi il existe une seconde méthode permettant de créer une contrainte à partir d’une chaine de caractère et d’avoir un format beaucoup plus visuel.
Ex : @″V:[btn1]-100-[btn2]″ ⇔ Je veux un espacement vertical de 100 entre le bouton 1 et le bouton 2.
Autolayout est disponible seulement pour iOS6. Il existe cependant des alternatives pour le gérer sur iOS5 comme RRAutoLayout.
Cesare Rocchi termine sa session en disant « Dois-je utiliser AutoLayout ? » avec comme réponse « Est-ce que les blocks ont remplacé les delegate ? ». Oui aujourd'hui tous le monde utilise les blocks mais non ils n'ont pas entièrement remplacés les delegates.
A retenir : Il ne faut plus configurer les éléments graphiques directement avec leur frame mais en passant par des contraintes entre eux.
@_funkyboy Les slides de la présentation
Ben Scheirman commence sa présentation en rappelant les différents problèmes que l’on rencontre lorsque l’on télécharge des données :
Sous iOS, nous n’avons plus à présenter AFNetworking, le framework pour traiter les requêtes HTTP. Ben Scheirman revient sur l’implémentation de ce framework reposant sur NSOperation (système de queue, priorité, concurrence, annulable, progression) dans un projet iOS. Une partie importante de la présentation repose sur le cache des données. Les différentes informations disponibles dans le header d’une requête HTTP permettent d’utiliser le cache de façon optimal :
L’utilisation de l’etag permet d’éviter au serveur de traiter le rendu des données à transmettre et ainsi de transférer un paquet allégé. Cependant le serveur a toujours besoin d’effectuer des requêtes internes pour remonter les informations. L’utilisation de cache-control permet à l’utilisateur de ne pas attendre pour une réponse et ainsi au serveur d’éviter d’utiliser ses ressources, malheureusement le client peut disposer de données dépassées.
Ben Scheirman termine sa session avec différents conseils sur la façon de designer ses APIs :
A retenir : Il y aura toujours un curseur à décaler en fonction de ce que l’on veut fournir à l’utilisateur final. C’est à dire à choisir entre une expérience utilisateur riche ou des données à jour.
@subdigital Les slides de la présentation
Nos applications regorgent de singletons qui mal utilisés risquent de saturer la mémoire de votre téléphone. Il est plus sain de faire dépendre notre dispatcher de webservices de l’ApplicationDelegate. Dans ce cas on se retrouve rapidement avec du code tel que :
[[(MyApplicationDelegate *)[UIApplication sharedApplication] delegate] myMethod]
Y a-t-on vraiment gagné quelque chose ?
Pour éviter cela Saul Mora se sert d’un mécanisme natif d’iOS : le système de responder. Il surchage simplement la méthode nextResponder de son ApplicationDelegate et enchaine ainsi ses différents services.
La salle était relativement partagée sur le sujet mais l’approche mérite d’ouvrir la réflexion sur nos mauvaises pratiques. Nous pensons que cette approche risque de rendre le code beaucoup moins testable.
Comment peupler une base CoreData à l’installation d’une application ? La solution naïve consistant à générer une base puis à l’ajouter dans les ressources ne résiste pas au refactor. Elle n’est donc pas satisfaisante. La meilleure solution est de créer un sous projet dédié au modèle de données puis de l’importer dans un projet MacOS X qui se chargera de peupler la base programmatiquement avant de l’exporter sous forme de ressource. Il suffira alors de créer une dépendance de target entre les différents projets et ainsi le code devient solide au refactoring.
A retenir : N’hésitez pas à instancier un NSManagedObjectContext à chaque opération. Cette allocation a un impact négligeable sur les performances.
@krmarkel Les slides de la présentation
Android propose un mécanisme efficace pour créer ses propres composants.
Les sous-classes de View sont utilisables directement dans le SDK android en spécifiant leur nom complet dans les XML de layout. Pour créer des attributs XML spécifiques à ces nouveaux composants il suffit d’ajouter un élément define-stylable dans le fichier res/values/attrs.xml. Pour aller plus loin on peut redéfinir la methode onDraw. Les composants ainsi créés sont même disponibles dans l’explorateur graphique de layout sous Eclipse. Pour aider un peu celui-ci on peut protéger le code le plus gourmant en vérifiant que la variable isInEditMode n’est pas à true. En effet elle indique que le layout est chargé depuis Eclipse.
A retenir : Si vous surchargez une méthode onDraw suivez les conseils de lint et n’instanciez pas d’objet Paint dans cette fonction. Placez les plutôt dans le constructeur de votre vue. Les performances seront bien meilleures.
Comment fait Facebook pour proposer une synchronisation des contacts et du calendrier directement dans le système ? Ils utilisent un SyncAdapter. Malgré le manque de documentation disponible sur ce composant il est possible d’intégrer à son application une synchronisation en arrière-plan de données utilisées par l’application Google ou même de nos propres données métiers.
Un SyncAdapter fonctionne grossièrement comme un ContentProvider mais indique à Android un moyen de mettre à jour les données régulièrement via un appel réseau par exemple.
@kiaaaana Les slides de la présentation
Une application Android accessible doit supporter à la fois la dictée vocale par le trackpad que le mode d’exploration au toucher. En effet cette dernière fonctionnalité n’est disponible que depuis Android 4. Plus d’information sur l’implémentation de ce système dans un précédent article.
A retenir : Ne pas hésiter à fixer une contentDescription d’une image à @null si elle n’a qu’un intérêt décoratif. En effet l’image sera alors ignorée par les différents dispositifs d’aide à la lecture.
Notre première participation à la mdevcon fut une réussite. Nous espérons que ce résumé vous donne l'envie d'aller en 2014 à Amsterdam afin de rencontrer les personnes les plus en vue de la scène mobile.