{"id":519,"date":"2019-01-28T10:55:34","date_gmt":"2019-01-28T09:55:34","guid":{"rendered":"http:\/\/lalloue.fr\/blog\/?p=519"},"modified":"2019-01-28T11:25:34","modified_gmt":"2019-01-28T10:25:34","slug":"pwa-quelques-astuces-pour-que-votre-application-pwa-ressemble-a-une-application-native","status":"publish","type":"post","link":"http:\/\/lalloue.fr\/blog\/pwa-quelques-astuces-pour-que-votre-application-pwa-ressemble-a-une-application-native\/","title":{"rendered":"PWA : Quelques astuces pour que votre application PWA ressemble \u00e0 une application native  ?"},"content":{"rendered":"\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/Progressive-WEb-Apps-and-Apple-1024x597.png\" alt=\"\" class=\"wp-image-487\" width=\"284\" height=\"166\" srcset=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/Progressive-WEb-Apps-and-Apple-1024x597.png 1024w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/Progressive-WEb-Apps-and-Apple-300x175.png 300w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/Progressive-WEb-Apps-and-Apple-768x448.png 768w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/Progressive-WEb-Apps-and-Apple-1568x914.png 1568w\" sizes=\"(max-width: 284px) 100vw, 284px\" \/><\/figure>\n\n\n\n<p>Le 30 mars 2018, apr\u00e8s une longue attente, la release d&#8217;iOS 11.3 sortait officiellement, avec le support des fonctionnalit\u00e9s PWA port\u00e9es sur les iphones et ipad.<br>M\u00eame si cette annonce tr\u00e8s attendue \u00e9tait une tr\u00e8s bonne nouvelle, en y regardant de plus pr\u00e8s on s&#8217;est vite rendu compte que le support PWA \u00e9tait encore tr\u00e8s loin d&#8217;\u00eatre parfait (voir article <a href=\"http:\/\/lalloue.fr\/blog\/pwa-quelles-contraintes-sur-ios\/\">Quelles&nbsp;contraintes&nbsp;sur&nbsp;iOS&nbsp;?<\/a> )<br>La liste de bugs et de fonctionnalit\u00e9s manquantes est longue comme le bras, mais ne perdez pas espoir !<br>Les d\u00e9veloppements sont en cours chez Apple et les correctifs devraient arriver un jour (mais quand?&#8230;).<br>En attendant cette mise \u00e0 jour, il existe quand m\u00eame quelques solutions afin d&#8217;optimiser les PWA sur la plateforme d&#8217;Apple, histoire de rendre un peu plus &#8220;Progressive&#8221; nos applications et les rendre plus &#8220;natives&#8221; pour nos les utilisateurs.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h4>Ic\u00f4ne de l&#8217;application<\/h4>\n\n\n\n<p class=\"has-text-color has-dark-gray-color\"><span style=\"color: #005075;\">Contrainte connue<\/span> : <a href=\"http:\/\/lalloue.fr\/blog\/pwa-quelles-contraintes-sur-ios\/#web-app-manifest\">http:\/\/lalloue.fr\/blog\/pwa-quelles-contraintes-sur-ios\/#web-app-manifest<\/a><br><span style=\"color: #005075;\">Contournement<\/span> : <br>Les ic\u00f4nes renseign\u00e9s dans le web app manifest en sont pas pris en charge sur iOS et cela donne un aspect vraiment pas terrible quand vous ajoutez votre application sur l&#8217;\u00e9cran d&#8217;acceuil de votre t\u00e9l\u00e9phone.<br>Une solution simple pour contourner ce point est de renseigner les ic\u00f4nes dans le meta tag <em>&#8220;apple-touch-icon&#8221;&nbsp;<\/em>.&nbsp;<br>Au&nbsp;passage,&nbsp;n&#8217;oubliez&nbsp;pas&nbsp;que&nbsp;la&nbsp;transparence&nbsp;n&#8217;est&nbsp;pas&nbsp;g\u00e9r\u00e9e&nbsp;non&nbsp;plus&nbsp;sur&nbsp;iOS.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- A placer dans la section 'head' -->\n&lt;link rel=\"apple-touch-icon\" href=\"touch-icon-iphone.png\">\n&lt;link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"touch-icon-ipad.png\">\n&lt;link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"touch-icon-iphone-retina.png\">\n&lt;link rel=\"apple-touch-icon\" sizes=\"167x167\" href=\"touch-icon-ipad-retina.png\"><\/code><\/pre>\n\n\n\n<h4>Splashscreen<\/h4>\n\n\n\n<p class=\"has-text-color has-dark-gray-color\"><span style=\"color: #005075;\">Contrainte connue<\/span> : <a href=\"http:\/\/lalloue.fr\/blog\/pwa-quelles-contraintes-sur-ios\/#splashscreen\">http:\/\/lalloue.fr\/blog\/pwa-quelles-contraintes-sur-ios\/#splashscreen<\/a><br><span style=\"color: #005075;\">Contournement<\/span> : <br>iOS ne supporte pas le splashscreen renseign\u00e9 dans le fichier manifest. R\u00e9sultat : au lancement l&#8217;utilisateur pourra admirer un magnifique \u00e9cran blanc \u00e0 la place de la page de chargement.<br>Heureusement, le site <a href=\"https:\/\/developer.apple.com\/library\/archive\/documentation\/AppleApplications\/Reference\/SafariWebContent\/ConfiguringWebApplications\/ConfiguringWebApplications.html\">apple developer<\/a> propose un moyen de contourner cette limitation.<br>Apple supporte un meta tag personnalis\u00e9 permettant de personnaliser le splashscreen de sa web app : <em>&#8220;apple-touch-startup-image&#8221;<\/em>. Vous n&#8217;avez donc qu&#8217;\u00e0 g\u00e9n\u00e9rer vos images dans les bonnes tailles list\u00e9es ci-dessous :<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/pasted-image-0.png\" alt=\"\" class=\"wp-image-531\" width=\"558\" height=\"341\" srcset=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/pasted-image-0.png 792w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/pasted-image-0-300x183.png 300w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/pasted-image-0-768x469.png 768w\" sizes=\"(max-width: 558px) 100vw, 558px\" \/><\/figure>\n\n\n\n<p>Et quand vos images sont pr\u00eates, vous n&#8217;avez plus qu&#8217;a ajouter les liens dans la section &#8220;head&#8221; de votre web app :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- A placer dans la section 'head' -->\n&lt;meta name=\"apple-mobile-web-app-capable\" content=\"yes\" \/>\n&lt;link href=\"\/apple_splash_2048.png\" sizes=\"2048x2732\" rel=\"apple-touch-startup-image\" \/>\n&lt;link href=\"\/apple_splash_1668.png\" sizes=\"1668x2224\" rel=\"apple-touch-startup-image\" \/>\n&lt;link href=\"\/apple_splash_1536.png\" sizes=\"1536x2048\" rel=\"apple-touch-startup-image\" \/>\n&lt;link href=\"\/apple_splash_1125.png\" sizes=\"1125x2436\" rel=\"apple-touch-startup-image\" \/>\n&lt;link href=\"\/apple_splash_1242.png\" sizes=\"1242x2208\" rel=\"apple-touch-startup-image\" \/>\n&lt;link href=\"\/apple_splash_750.png\" sizes=\"750x1334\" rel=\"apple-touch-startup-image\" \/>\n&lt;link href=\"\/apple_splash_640.png\" sizes=\"640x1136\" rel=\"apple-touch-startup-image\" \/><\/code><\/pre>\n\n\n\n<h4> Add to Home screen Prompt <\/h4>\n\n\n\n<p class=\"has-text-color has-dark-gray-color\"><span style=\"color:rgb(0, 80, 117)\">Contrainte connue<\/span> : <a href=\"http:\/\/lalloue.fr\/blog\/pwa-quelles-contraintes-sur-ios\/#home-screen-prompt\">http:\/\/lalloue.fr\/blog\/pwa-quelles-contraintes-sur-ios\/#home-screen-prompt<\/a><br><span style=\"color:rgb(0, 80, 117)\">Contournement<\/span> : <br>Sur Android, le syst\u00e8me propose une popup native proposant d&#8217;installer l&#8217;application sur la page d\u2019accueil si l&#8217;application est d\u00e9clar\u00e9e en tant que PWA.<br>Malheureusement, cette fonctionnalit\u00e9 n&#8217;est pas disponible sur iOS.<br>Il faut alors cliquer sur &#8220;partager&#8221;, puis, &#8220;add to home screen&#8221;, puis ajouter l&#8217;application &#8230; 3 clics pour ajouter son application sur son \u00e9cran d\u2019accueil !<br>Exemple avec l&#8217;application twitter :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"180\" height=\"320\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/twitter_add_pwa.gif\" alt=\"\" class=\"wp-image-532\"\/><\/figure>\n\n\n\n<p>Mais heureusement, il existe un moyen d&#8217;am\u00e9liorer l&#8217;exp\u00e9rience utilisateur dans le cas d&#8217;une PWA.<br>Le plus dur est d&#8217;afficher cette popup seulement sur Safari, et pas en standalone mode (quand l&#8217;application est d\u00e9j\u00e0 ajout\u00e9e \u00e0 l&#8217;\u00e9cran d\u2019accueil).<br>Voici le code \u00e0 impl\u00e9menter (en Javascript):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ D\u00e9tecter si l'appareil execute iOS\nconst isIos = () => {\n  const userAgent = window.navigator.userAgent.toLowerCase();\n  return \/iphone|ipad|ipod\/.test( userAgent );\n}\n\/\/ Detecter si l'application est en mode \"standalone\"\nconst isInStandaloneMode = () => ('standalone' in window.navigator) &amp;&amp; (window.navigator.standalone);\n\n\/\/ V\u00e9rifier si l'on affiche la popup de notification\nif (isIos() &amp;&amp; !isInStandaloneMode()) {\n  this.setState({ showInstallMessage: true });\n}<\/code><\/pre>\n\n\n\n<p>Et avec Ionic \/ Angular :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ home.page.ts\n\nimport { Component } from '@angular\/core';\nimport { Platform } from '@ionic\/angular';\n\n@Component({\n  selector: 'app-home',\n  templateUrl: 'home.page.html',\n  styleUrls: ['home.page.scss'],\n})\nexport class HomePage {\n\n  public isInstallMessageShown: boolean = false;\n\n  constructor(public platform: Platform) { \n    if (platform.is(\"ios\") &amp;&amp; !pwaHelper.isInStandaloneMode()) {\n      this.isInstallMessageShown = true;\n    }\n  }\n}\n\n\/\/ pwaHelper.ts\n\nexport default class pwaHelper {\n    static isInStandaloneMode = () => ('standalone' in window.navigator) &amp;&amp; ((window.navigator as any).standalone);\n}<\/code><\/pre>\n\n\n\n<p>Vous n&#8217;avez plus qu&#8217;a afficher votre popup et la personnaliser avec votre css.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/ios_bubble-1-590x1024.png\" alt=\"\" class=\"wp-image-541\" width=\"242\" height=\"420\" srcset=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/ios_bubble-1-590x1024.png 590w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/ios_bubble-1-173x300.png 173w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/ios_bubble-1-768x1334.png 768w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2019\/01\/ios_bubble-1.png 1125w\" sizes=\"(max-width: 242px) 100vw, 242px\" \/><\/figure>\n\n\n\n<p>A penser : sur iPad, le bouton partager est situ\u00e9 en haut de l&#8217;\u00e9cran, \u00e0 c\u00f4t\u00e9 de la barre d&#8217;adresse, donc il faut l\u00e9g\u00e8rement modifier le css dans ce cas-ci.<\/p>\n\n\n\n<h4> Conservation de l&#8217;\u00e9tat entre les sessions <\/h4>\n\n\n\n<p class=\"has-text-color has-dark-gray-color\"><span style=\"color:rgb(0, 80, 117)\">Contrainte connue<\/span> : <a href=\"http:\/\/lalloue.fr\/blog\/pwa-quelles-contraintes-sur-ios\/#state\">http:\/\/lalloue.fr\/blog\/pwa-quelles-contraintes-sur-ios\/#state<\/a><br><span style=\"color:rgb(0, 80, 117)\">Contournement<\/span> : Stocker l&#8217;\u00e9tat et les informations de session de votre application (current page, user filled data, scroll start if possible) dans une base de donn\u00e9es IndexDB ou directement dans le local storage, et quand l&#8217;application se lance, lire ces donn\u00e9es pour restaurer l&#8217;\u00e9tat manuellement. Cela devrait fonctionner dans la majorit\u00e9 des cas.<br>Si vous d\u00e9velopper en React avec Redux, les packages suivants peuvent vous aider :<br>&#8211; <a href=\"https:\/\/github.com\/rt2zz\/redux-persist\">redux-persist<\/a><br>&#8211; <a href=\"https:\/\/github.com\/reactjs\/react-router-redux\">react-router-redux<\/a><br>Pour vue.js, les packages similaires existent :  <br>&#8211; <a href=\"https:\/\/www.npmjs.com\/package\/vuex-persist\">vuex-persist<\/a><br>&#8211; <a href=\"https:\/\/github.com\/vuejs\/vuex-router-sync\">vuex-router-sync<\/a> <br><\/p>\n\n\n\n<h4><\/h4>\n","protected":false},"excerpt":{"rendered":"<p>Le 30 mars 2018, apr\u00e8s une longue attente, la release d&#8217;iOS 11.3 sortait officiellement, avec le support des fonctionnalit\u00e9s PWA port\u00e9es sur les iphones et ipad.M\u00eame si cette annonce tr\u00e8s attendue \u00e9tait une tr\u00e8s bonne nouvelle, en y regardant de plus pr\u00e8s on s&#8217;est vite rendu compte que le support PWA \u00e9tait encore tr\u00e8s loin &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/lalloue.fr\/blog\/pwa-quelques-astuces-pour-que-votre-application-pwa-ressemble-a-une-application-native\/\" class=\"more-link\">Continuer la lecture <span class=\"screen-reader-text\"> \u00ab\u00a0PWA : Quelques astuces pour que votre application PWA ressemble \u00e0 une application native  ?\u00a0\u00bb<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[51,48],"tags":[55,61,54,57,53],"_links":{"self":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts\/519"}],"collection":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/comments?post=519"}],"version-history":[{"count":14,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts\/519\/revisions"}],"predecessor-version":[{"id":569,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts\/519\/revisions\/569"}],"wp:attachment":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/media?parent=519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/categories?post=519"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/tags?post=519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}