{"id":10716,"date":"2016-06-23T16:14:36","date_gmt":"2016-06-23T14:14:36","guid":{"rendered":"http:\/\/flaven.fr\/?p=10716"},"modified":"2026-09-16T10:07:12","modified_gmt":"2026-09-16T08:07:12","slug":"bonnes-pratiques-ios-un-resume-des-bonnes-pratiques-pour-le-developpement-dapplication-mobile-sous-ios","status":"publish","type":"post","link":"https:\/\/flaven.fr\/2016\/06\/bonnes-pratiques-ios-un-resume-des-bonnes-pratiques-pour-le-developpement-dapplication-mobile-sous-ios\/","title":{"rendered":"Bonnes pratiques, iOS &#8211; Un r\u00e9sum\u00e9 des bonnes pratiques pour le d\u00e9veloppement d&#8217;application mobile sous iOS"},"content":{"rendered":"<p>\tIl est essentiel de th\u00e9sauriser l&#8217;exp\u00e9rience acquise lors d&#8217;un d\u00e9veloppement, de consigner l&#8217;exp\u00e9rience des essais-erreurs commises au cours du cycle de cr\u00e9ation d&#8217;une application par exemple. Evidemment, cet imp\u00e9ratif est int\u00e9gr\u00e9 dans la m\u00e9thode agile sous la forme d&#8217;un rituel nomm\u00e9 &#8220;R\u00e9trospective d&#8217;it\u00e9ration&#8221;. Ce dernier a pour fonction d&#8217;exprimer un retour sur l\u2019it\u00e9ration qui a eu lieu en pointant toutes les erreurs\/difficult\u00e9s auxquelles l&#8217;\u00e9quipe a pu \u00eatre confront\u00e9e.<br \/>\n\tPointer les erreurs est une chose, isoler les solutions en est une autre&#8230; Et que dire d&#8217;une synth\u00e8se digeste rapprochant les deux points de vue. A premi\u00e8re vue indispensable mais rarement produite. C&#8217;est pourtant l&#8217;objet m\u00eame ce billet : existe-t-il un corpus de bonnes pratiques sur le d\u00e9veloppement mobile tant sous iOS que sous Android pour les mois pr\u00e9sents et \u00e0 venir ?<\/p>\n<p>\tEh, bien disons qu&#8217;un tel document existe, c&#8217;est une chose assez rare mais pas introuvable. Une recherche rapide sur le web permet de d\u00e9couvrir un certain nombre de documents nous en avons s\u00e9lectionner deux qui donnent une liste de bonnes pratiques tant pour Android que pour iOS.<\/p>\n<p>\tEn voici les sources en anglais et ces recommandations sont prescrites par une entreprise qui fait disons plut\u00f4t autorit\u00e9 en mati\u00e8re de d\u00e9veloppement : Futurice  <a href=\"http:\/\/futurice.com\/\" target=\"_blank\">http:\/\/futurice.com\/<\/a>.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/futurice\/ios-good-practices\" target=\"_blank\">https:\/\/github.com\/futurice\/ios-good-practices<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/futurice\/android-best-practices\" target=\"_blank\">https:\/\/github.com\/futurice\/android-best-practices<\/a><\/li>\n<\/ul>\n<h4>Notre petite touche personnel pour iOS comme pour Android<\/h4>\n<p>\tGrosso modo, le seul \u00e9l\u00e9ment manquant dans la liste des bonnes pratiques est l&#8217;utilisation de cette outil indispensable pour la livraison en continu dans les deux environnements : iOS et Android.<br \/>\n\tL&#8217;outil se marrie en effet sans probl\u00e8me avec CocoaPods et Gradle.<\/p>\n<p>Source : <a href=\"https:\/\/fastlane.tools\/\" target=\"_blank\">https:\/\/fastlane.tools\/<\/a><\/p>\n<p><b>On se contentera dans un premier temps d&#8217;\u00e9num\u00e9rer les bonnes pratiques concernant iOS. Celles concernant Android feront l&#8217;objet d&#8217;un autre billet.<\/b><\/p>\n<h4>Les bonnes pratiques sous iOS selon futurice<\/h4>\n<p>\tLe texte est r\u00e9dig\u00e9 comme un quasi manifesto, pas de gras juste des injonctions courtes et justifi\u00e9es sur les meilleures choses \u00e0 faire pour assurer un peu de p\u00e9rennit\u00e9 au code d&#8217;un application iOS et de s\u00e9r\u00e9nit\u00e9 au PO comme au chef de projet ! Je vous invite \u00e0 lire le tout en d\u00e9tail et \u00e0 vous en impr\u00e9gner au point d&#8217;en faire un mantra. J&#8217;ai s\u00e9lectionn\u00e9 ici les meilleurs points ne privil\u00e9giant les aspects les moins techniques disons-le.<\/p>\n<p>\t<b>1. Utiliser git et le fichier <code>.gitignore<\/code><\/b><br \/>\n\tPour chaque projet iOS, d\u00e9pos\u00e9 sur git, qu&#8217;il soit Swift ou en Objective-C, le mieux est de placer en racine un fichier <code>.gitignore<\/code> afin d&#8217;\u00e9viter d&#8217;int\u00e9grer des donn\u00e9es inutiles ou sensibles (param\u00e8tres utilisateurs, fichiers temporaires etc.)<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/github\/gitignore\/blob\/master\/Swift.gitignore\" target=\"_blank\"><code>.gitignore<\/code> pour un  projet en Swift<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/github\/gitignore\/blob\/master\/Objective-C.gitignore\" target=\"_blank\"><code>.gitignore<\/code> pour un  projet en Objective-C<\/a><\/li>\n<\/ul>\n<p>\t<b>2. La gestion de d\u00e9pendances<\/b><br \/>\nLa gestion des libraires tierces peut vite tourner au casse-t\u00eate et cela peut potentiellement hypoth\u00e9quer vos chances de publication sur l&#8217;apple store. Il est donc imp\u00e9ratif de g\u00e9rer pr\u00e9cautionneusement ces d\u00e9pendances \u00e0 l&#8217;aide notamment de CocoaPods, facile \u00e0 int\u00e9grer et grandement utile.<\/p>\n<p>\t<b>3. Structure du Project<\/b><br \/>\nVu le nombre de fichiers qui ne manqueront d&#8217;\u00eatre cr\u00e9es, il est fortement conseill\u00e9 d&#8217;adopter une structure de projets en fonction de votre architecture.<\/p>\n<pre lang=\"bash\">\r\n\t\u251c\u2500 Models\r\n\t\u251c\u2500 Views\r\n\t\u251c\u2500 Controllers (or ViewModels, if your architecture is MVVM)\r\n\t\u251c\u2500 Stores\r\n\t\u251c\u2500 Helpers\r\n\t<\/pre>\n<p>\t<b>4. Localization ou traduction <\/b><br \/>\n\tLorsque vous concevez une application multilingue, il est imp\u00e9ratif de consigner toutes les chaines \u00e0 traduire dans un fichier de localisation. Il est alors facile de retrouver les chaines si elles doivent \u00eatre corrig\u00e9es et de compiler ensuite l&#8217;application dans une langue ou dans une autre en passant l&#8217;argument de la langue.<\/p>\n<pre lang=\"bash\">-AppleLanguages (Spanish)<\/pre>\n<p>Pour des traductions plus complexes notamment la gestion du pluriel, il vaut mieux utiliser le format <code>.stringsdict<\/code> que le fichier <code>localizable.strings<\/code><\/p>\n<p>\tSource : <a href=\"https:\/\/speakerdeck.com\/hasseg\/localization-practicum\" target=\"_blank\">https:\/\/speakerdeck.com\/hasseg\/localization-practicum<\/a> <\/p>\n<p>\t<b>5. Constants ou variables globales<\/b><br \/>\n\tIl est souhaitable de limiter au maximum la port\u00e9e des variables globales ou Constants de vos applications. Si certaines de ces constantes sont malgr\u00e9 tout utilis\u00e9es \u00e0 travers de toute l&#8217;application, il est l\u00e0 aussi pr\u00e9f\u00e9rable de les conserver au m\u00eame endroit dans le code. <\/p>\n<p>\t<b>6. Version en branche<\/b><br \/>\nBien s\u00fbr, on ne dira jamais assez l&#8217;importance de g\u00e9rer des versions de l&#8217;application via des branches sur Git afin d&#8217;isoler les \u00e9volutions dans des branches s\u00e9par\u00e9es.<\/p>\n<p>\t<b>7. Pr\u00e9requis sur la version minimale de iOS <\/b><br \/>\nIl est important de d\u00e9finir pr\u00e9alablement la version minimale sur laquelle votre application doit tourner. C&#8217;est un \u00e9l\u00e9ment essentiel pour estimer la charge de travail n\u00e9cessaire \u00e0 la conception de votre application et des fonctionnalit\u00e9s possibles ou non. <\/p>\n<p>Il existe un certain nombre de ressources pour s\u00e9lectionner la version minimale de iOS souhait\u00e9e en fonction des usages que vous allez cibler<br \/>\nUse these resources to gather the data necessary for making this choice:<\/p>\n<p><b>Une ressource officielle :<\/b><\/p>\n<ul>\n<li>Les statistiques de p\u00e9n\u00e9tration d&#8217;iOS \u00e0 travers le monde.<br \/><a href=\"https:\/\/developer.apple.com\/support\/app-store\/\" target=\"_blank\">https:\/\/developer.apple.com\/support\/app-store\/<\/a><\/li>\n<\/ul>\n<p><b>Des ressources tierces mais riches d&#8217;enseignements :<\/b><\/p>\n<ul>\n<li>La matrice iOS Support : Une source indispensable qui indique la version minimale de iOS requise par terminal.<br \/><a href=\"http:\/\/iossupportmatrix.com\" target=\"_blank\">http:\/\/iossupportmatrix.com<\/a><\/li>\n<li>Une source de donn\u00e9es fourni par David Smith sur son application Audiobooks.<br \/><a href=\"https:\/\/david-smith.org\/iosversionstats\/\" target=\"_blank\">https:\/\/david-smith.org\/iosversionstats\/<\/a><\/li>\n<li>Mixpanel Trends : iOS versions \u2014 Des donn\u00e9es fournies gracieusement par Mixpanel sur la ventilation des versions de iOS.<br \/><a href=\"https:\/\/mixpanel.com\/trends\/#report\/ios_frag\" target=\"_blank\">https:\/\/mixpanel.com\/trends\/#report\/ios_frag<\/a><\/li>\n<\/ul>\n<h4>8. Librairies usuelles<\/h4>\n<p>Utiliser une librairie en vue d&#8217;ajouter une fonction est \u00e0 double tranchant. En effet, m\u00eame si cette librairie r\u00e9sout le probl\u00e8me dans l&#8217;imm\u00e9diat, l&#8217;ajout d&#8217;une librairie additionnelle peut se r\u00e9v\u00e9ler probl\u00e9matique en terme de maintenance ou lors du passage \u00e0 une version sup\u00e9rieure de iOS. Il est aussi tout \u00e0 fait possible que la fonctionnalit\u00e9 souhait\u00e9e, rendue possible par la librairie, deviennent une fonctionnalit\u00e9 du code officiel d&#8217;Apple. <\/p>\n<p>Toujours penser \u00e0 r\u00e9soudre le probl\u00e8me en utilisant en priorit\u00e9 le framework natif d&#8217;Apple.<\/p>\n<p>Voici une liste des librairies dont l&#8217;objectif est de r\u00e9duire le code redondant ou de permettre la r\u00e9solution de probl\u00e8mes complexes et r\u00e9currents la calcul de la date par exemple. Bien sur plus la maitrise du code natif Apple est grande moins le recours \u00e0 des librairies additionnelles est sans doute n\u00e9cessaires.<\/p>\n<p>En tous les cas, voici la liste des librairies les plus usuelles.<\/p>\n<p><b>8.1. AFNetworking<\/b><br \/>\nLa gestion du &#8220;Multithreading and Queues&#8221; voil\u00e0 ce \u00e0 quoi sert cette librairie. A n&#8217;en pas douter, c&#8217;est la base de toutes les applications modernes et &#8220;api-centric&#8221;.<\/p>\n<p>Source : <a href=\"https:\/\/github.com\/AFNetworking\/AFNetworking\" target=\"_blank\">https:\/\/github.com\/AFNetworking\/AFNetworking<\/a><\/p>\n<p><b>8.2. La librairie DateTools<\/b><br \/>\nPas la peine de r\u00e9inventer la roue, il existe fort heureusement une librairie qui couvre tous les besoins de choix dans la date.<\/p>\n<p>Source : <a href=\"https:\/\/github.com\/MatthewYork\/DateTools\" target=\"_blank\">https:\/\/github.com\/MatthewYork\/DateTools<\/a><\/p>\n<p><b>8.3. Auto Layout Libraries<\/b><br \/>\nSi vous souhaitez coder vos vues directement, il y a de fortes probabilit\u00e9s que vous soyez confronter \u00e0 la syntaxe complexe propre \u00e0 Apple &#8211; le corpus traditionnel du <code>NSLayoutConstraint<\/code> ou tout ce que comprend le language &#8220;Visual Format&#8221; qui d\u00e9finit les contraintes, les dimensions et l&#8217;espacement standard&#8230; etc.<br \/>\nSource : <a href=\"https:\/\/developer.apple.com\/library\/ios\/documentation\/UserExperience\/Conceptual\/AutolayoutPG\/VisualFormatLanguage.html\" target=\"_blank\">Visual Format Language<\/a><\/p>\n<p>Fort heureusement, la version disponible pour iOS 9 donne des sp\u00e9cifications plus concises en mati\u00e8re de contraintes, la class <code>NSLayoutAnchor<\/code>.<br \/>\nSource : <a href=\"https:\/\/developer.apple.com\/library\/ios\/documentation\/AppKit\/Reference\/NSLayoutAnchor_ClassReference\/index.html\" target=\"_blank\">NSLayoutAnchor<\/a><\/p>\n<p>Si vous \u00eates bloqu\u00e9 sur une version d&#8217;iOS ancienne, ne disposant que du traditionnel <code>NSLayoutConstraint<\/code>, voici la librairie Masonry\/SnapKit peut-\u00eatre une solution pour parer aux principaux d\u00e9fauts de <code>NSLayoutConstraint<\/code>.<\/p>\n<p>Source: <a href=\"https:\/\/github.com\/SnapKit\/\" target=\"_blank\">Masonry\/SnapKit<\/a><\/p>\n<p>Pour le Swift, Il existe aussi Cartography, qui fournit un compl\u00e9ment puissant au langage natif. Pour les d\u00e9veloppeurs plus conservateurs, FLKAutoLayout offre un wrapper compl\u00e9mentaire \u00e0 l&#8217;API natif de Apple, sobre et efficace mais pas magique pour autant !<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/robb\/Cartography\" target=\"_blank\">Cartography<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/floriankugler\/FLKAutoLayout\" target=\"_blank\">FLKAutoLayout<\/a><\/li>\n<\/ul>\n<p><b>Voici les premiers points essentiels de ce recueil des bonnes pratiques gracieusement fournies par Futurice. On vous invite vivement \u00e0 prolonger la lecture de ce document sur si vous souhaitez acqu\u00e9rir une expertise de Lead Dev en iOS ! Les points sont nombreux et plut\u00f4t pr\u00e9cis : Architecture, gestion des Assets, des recommandations de de pr\u00e9sentation de code (Coding Style)&#8230; bref une vue d&#8217;ensemble.<\/b><\/p>\n<p><H4>Un dernier point : les Crash Logs<\/H4><br \/>\nC&#8217;est un \u00e9l\u00e9ment essentiel pour oeuvrer \u00e0 l&#8217;am\u00e9lioration de votre application, une sorte &#8220;feedback loop&#8221; automatis\u00e9e. Le principe en est simple, tous les crash de vos applications qui surviennent sont consign\u00e9s sur un serveur dans des fichiers de log auxquels vous avez bien \u00e9videmment acc\u00e8s. Il est possible d&#8217;impl\u00e9menter manuellement ce type de fonctionnalit\u00e9 en utilisant par exemple PLCrashReporter et de l&#8217;interfacer avec votre propre &#8220;backend&#8221; mais il existe des solutions cl\u00e9s-en-main type Crashlytics ou HockeyApp, payante certes mais bien plus confortables.<\/p>\n<p><b>Nous y ajoutons un sur la liste nomm\u00e9 KSCrash qui gagne \u00e0 \u00eatre connu. Il existe aussi des solutions pour analyser ces logs. A premi\u00e8re vue, un outil comme GoAccess <a href=\"https:\/\/goaccess.io\/\" target=\"_blank\">https:\/\/goaccess.io\/<\/a> ou comme The Log File Navigator <a href=\"https:\/\/goaccess.io\/\" target=\"_blank\">http:\/\/lnav.org\/features\/<\/a> pourrait faire l&#8217;affaire ou un outil comme le <a href=\"http:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=24659\" target=\"_blank\">Log Parser 2.2 de microsoft<\/a>.<\/b><\/p>\n<ul>\n<li>Crashlytics<br \/><a href=\"http:\/\/www.crashlytics.com\" target=\"_blank\">http:\/\/www.crashlytics.com<\/a><\/li>\n<li>HockeyApp<br \/><a href=\"http:\/\/hockeyapp.net\" target=\"_blank\">http:\/\/hockeyapp.net<\/a><\/li>\n<li>Crittercism<br \/><a href=\"https:\/\/www.crittercism.com\" target=\"_blank\">https:\/\/www.crittercism.com<\/a><\/li>\n<li>Splunk MINTexpress<br \/><a href=\"https:\/\/mint.splunk.com\" target=\"_blank\">https:\/\/mint.splunk.com<\/a><\/li>\n<li>Instabug<br \/><a href=\"https:\/\/instabug.com\/\" target=\"_blank\">https:\/\/instabug.com\/<\/a><\/li>\n<li>plcrashreporter<br \/><a href=\"https:\/\/www.plcrashreporter.org\" target=\"_blank\">https:\/\/www.plcrashreporter.org<\/a><\/li>\n<li>The Ultimate iOS Crash Reporter<br \/><a href=\"https:\/\/github.com\/kstenerud\/KSCrash\" target=\"_blank\">https:\/\/github.com\/kstenerud\/KSCrash<\/a><\/li>\n<\/ul>\n<p>Une fois que vous avez s\u00e9lectionn\u00e9 et impl\u00e9ment\u00e9 l&#8217;outil de crashlog, il y a s&#8217;assurer que vous faites une sauvegarde de l&#8217;archive Xcode <i>(.xcarchive)<\/i> de chaque build que vous publiez. L&#8217;archive contient le binaire de l&#8217;application et le symbole du d\u00e9bogage <i>(dSYM)<\/i> qui vous sera n\u00e9cessaire pour avoir les rapports de crash pour chaque version en particulier. <\/p>\n<p><b>En conclusion : les recommandations c&#8217;est bien ! Encore faut-il qu&#8217;elles soient partag\u00e9es par tous, \u00e9ventuellement discut\u00e9es mais jamais impos\u00e9es ! On a d\u00e9lib\u00e9r\u00e9ment pass\u00e9 sous silence les recommandations en mati\u00e8re d&#8217;\u00e9diteur ou de coding style, de nomenclature des variables&#8230; On esp\u00e8re souvent, parfois \u00e0 tort, que l&#8217;\u00e9quipe de d\u00e9veloppement est d\u00e9j\u00e0 d\u00e9positaire des bonnes pratiques. Sans \u00eatre chien avec les d\u00e9vs, c&#8217;est souvent l\u00e0 qu&#8217;est l&#8217;os, rat que je suis !<\/b><\/p>\n<h2>En savoir plus<\/h2>\n<ul>\n<li>Un index des bonnes pratiques pour le d\u00e9veloppement iOS document\u00e9 par futurice<br \/><a href=\"https:\/\/github.com\/futurice\/ios-good-practices\" target=\"_blank\">https:\/\/github.com\/futurice\/ios-good-practices<\/a><\/li>\n<li>Un index des bonnes pratiques pour le d\u00e9veloppement Android document\u00e9 par futurice<br \/><a href=\"https:\/\/github.com\/futurice\/android-best-practices\" target=\"_blank\">https:\/\/github.com\/futurice\/android-best-practices<\/a><\/li>\n<li>Une pr\u00e9sentation des bonnes pratiques pour le d\u00e9veloppement iOS<br \/><a href=\"http:\/\/fr.slideshare.net\/jldavid\/ios-coding-best-practices-12969046\" target=\"_blank\">http:\/\/fr.slideshare.net\/jldavid\/ios-coding-best-practices-12969046<\/a><\/li>\n<li>Une synth\u00e8se des bonnes pratiques d&#8217;Alex Rup\u00e9rez, Senior iOS Developer<br \/><a href=\"http:\/\/www.alexruperez.com\/ios-coding-best-practices\" target=\"_blank\">http:\/\/www.alexruperez.com\/ios-coding-best-practices<\/a><\/li>\n<li>Un article d&#8217;Octo pour mesurer l&#8217;agilit\u00e9 d&#8217;un projet. &#8220;Mon projet est-il Agile ?&#8221;<br \/><a href=\"http:\/\/blog.octo.com\/mon-projet-est-il-agile\/\" target=\"_blank\">http:\/\/blog.octo.com\/mon-projet-est-il-agile\/<\/a><\/li>\n<p>\t<b>Merci \u00e0 alaeddine ouertani pour ces ressources<\/b><\/p>\n<li>Un framework de d\u00e9veloppement pour les applications Android con\u00e7u par SmartnSoft<br \/><a href=\"https:\/\/github.com\/smartnsoft\/droid4me\" target=\"_blank\">https:\/\/github.com\/smartnsoft\/droid4me<\/a><\/li>\n<li>Un framework de d\u00e9veloppement pour les applications iOS con\u00e7u par SmartnSoft<br \/><a href=\"https:\/\/github.com\/smartnsoft\/ios4me\" target=\"_blank\">https:\/\/github.com\/smartnsoft\/ios4me<\/a><\/li>\n<li>Contient le code  source pour Azure Mobile Engagement pour Android<br \/><a href=\"https:\/\/github.com\/Azure\/azure-mobile-engagement-app-android\" target=\"_blank\">https:\/\/github.com\/Azure\/azure-mobile-engagement-app-android<\/a><\/li>\n<li>Contient le code  source pour Azure Mobile Engagement pour iOS<br \/><a href=\"https:\/\/github.com\/Azure\/azure-mobile-engagement-app-ios\" target=\"_blank\">https:\/\/github.com\/Azure\/azure-mobile-engagement-app-ios<\/a><\/li>\n<li>iOS Source Code Examples &#8211;  iOS Source Code Examples. iOS App Development Libraries, Controls and Examples &#8211; Open Source iPhone\/iPad Apps &#8211; Code4App.net<br \/><a href=\"http:\/\/code4app.net\/\" target=\"_blank\">http:\/\/code4app.net\/<\/a><\/li>\n<li>The greatest iOS development tools, including websites, desktop and mobile apps, and back-end services. Updated daily by Adam Swinden.<br \/><a href=\"https:\/\/iosdev.tools\/\" target=\"_blank\">https:\/\/iosdev.tools\/<\/a><\/li>\n<li>iOSDeveloperTips.com &#8211; Code, tips and tricks for iOS developers. iOS(developer: tips)<br \/><a href=\"http:\/\/iosdevelopertips.com\/\" target=\"_blank\">http:\/\/iosdevelopertips.com\/<\/a><\/li>\n<li>NSHipster<br \/><a href=\"http:\/\/nshipster.com\/\" target=\"_blank\">http:\/\/nshipster.com\/<\/a><\/li>\n<li>D&#8217;excellents tutoriaux pour iphone<br \/><a href=\"https:\/\/www.raywenderlich.com\/tutorials\" target=\"_blank\">https:\/\/www.raywenderlich.com\/tutorials<\/a><\/li>\n<li>The Ultimate iOS Crash Reporter<br \/><a href=\"https:\/\/github.com\/kstenerud\/KSCrash\" target=\"_blank\">https:\/\/github.com\/kstenerud\/KSCrash<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Il est essentiel de th\u00e9sauriser l&#8217;exp\u00e9rience acquise lors d&#8217;un d\u00e9veloppement, de consigner l&#8217;exp\u00e9rience des essais-erreurs commises au cours du cycle de cr\u00e9ation d&#8217;une application par&hellip; <\/p>\n<p class=\"text-center\"><a href=\"https:\/\/flaven.fr\/2016\/06\/bonnes-pratiques-ios-un-resume-des-bonnes-pratiques-pour-le-developpement-dapplication-mobile-sous-ios\/\" class=\"more-link\">Continue reading &rarr; <span class=\"screen-reader-text\">Bonnes pratiques, iOS &#8211; Un r\u00e9sum\u00e9 des bonnes pratiques pour le d\u00e9veloppement d&#8217;application mobile sous iOS<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":10717,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"bf_ai_meta_description":"Les bonnes pratiques iOS rassemblent les erreurs et solutions du d\u00e9veloppement mobile. Ce r\u00e9sum\u00e9 aide \u00e0 \u00e9viter les pi\u00e8ges et \u00e0 optimiser les outils.","bf_ai_og_title":"Bonnes pratiques iOS","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[3437,3454,3442,3444,3447,3448,3449,3450,3435,3452],"tags":[2238,163,2344,1910,518,3489,1871],"class_list":["post-10716","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-business-case-studies","category-journalism-writing","category-mobile-devices","category-programming-databases","category-technology-trends","category-tools-productivity","category-tutorials-how-to","category-ux-product-design","category-web-development","category-wordpress-cms","tag-android","tag-application","tag-best-practices","tag-bonnes-pratiques","tag-ios","tag-microsoft-azure","tag-smartphone"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3Vuhl-2MQ","jetpack_featured_media_url":"https:\/\/flaven.fr\/wp-content\/uploads\/2016\/06\/android_iOS_Good_Practices_b.jpg","_links":{"self":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/comments?post=10716"}],"version-history":[{"count":11,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10716\/revisions"}],"predecessor-version":[{"id":10747,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10716\/revisions\/10747"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media\/10717"}],"wp:attachment":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media?parent=10716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/categories?post=10716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/tags?post=10716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}