GeoLeaf prend en charge l'installation en tant qu'application web progressive (PWA) sur Android et iOS, sans développement spécifique. Cette page documente la configuration, les prérequis de déploiement, et les comportements par plateforme.
| Critère | Requis pour |
|---|---|
| HTTPS | Lighthouse PWA, Service Worker, beforeinstallprompt |
| Service Worker actif | Offline, Lighthouse PWA |
manifest.json valide |
Installabilité, Lighthouse PWA |
Icônes 192 et 512 px (dont maskable) |
Lighthouse PWA score 100 |
<link rel="manifest"> dans le HTML |
Détection par le navigateur |
theme-color meta tag |
Couleur du Chrome navigateur |
Le Service Worker (
sw-core.js) et le manifest (manifest.json) sont automatiquement inclus dans les variantes deployées parbuild-deploy.cjs.
Les icônes PWA doivent être générées à partir du logo source avant le premier déploiement :
node scripts/generate-pwa-icons.cjs
Produit 4 fichiers dans packages/core/src/assets/icons/ :
| Fichier | Taille | Usage |
|---|---|---|
icon-192.png |
192×192 | Standard — Android, Windows |
icon-512.png |
512×512 | Standard — splash screen |
icon-192-maskable.png |
192×192 | Maskable — Android adaptive icons |
icon-512-maskable.png |
512×512 | Maskable — splash screen maskable |
Prérequis :
sharpinstallé danspackages/core(npm install --prefix packages/core).
Le manifest est généré dynamiquement par build-deploy.cjs en fusionnant :
packages/core/manifest.jsonpwa de profiles/geoleaf.config.jsonLes champs pwa.* de la config écrasent les valeurs du template :
// profiles/geoleaf.config.json
{
"pwa": {
"name": "Mon Application",
"short_name": "MonApp",
"description": "Ma description",
"theme_color": "#2d6a4f",
"background_color": "#ffffff",
"installPrompt": {
"enabled": false
}
}
}
Le prompt est désactivé par défaut (enabled: false). Pour l'activer :
// profiles/geoleaf.config.json
{
"pwa": {
"installPrompt": {
"enabled": true
}
}
}
GeoLeaf.PWA.init() est appelé automatiquement après le chargement de la config (dans app/boot.ts).
| Plateforme | Comportement |
|---|---|
| Android / Chrome / Edge | Capture beforeinstallprompt → affiche une bannière custom avec bouton « Installer » |
| iOS Safari | beforeinstallprompt n'existe pas → affiche une bannière manuelle expliquant comment ajouter à l'écran d'accueil via le menu Partage |
| Autres navigateurs | beforeinstallprompt absent → aucune bannière |
localStorage['gl_pwa_install_dismissed']appinstalled event)/(iPhone|iPad|iPod)/i sur navigator.userAgentnavigator.standalone === true)localStorage['gl_pwa_ios_dismissed']import { PWA } from "@geoleaf/core";
// Initialisation manuelle (normalement appelé par boot.ts)
PWA.init({
installPrompt: { enabled: true },
});
Via le namespace global (CDN/ESM) :
GeoLeaf.PWA.init({ installPrompt: { enabled: true } });
Pour obtenir un score PWA ≥ 90 (idéalement 100) :
npx lighthouse https://your-domain.com --preset=pwa --output=html --output-path=./lighthouse-report.html
Checklist :
manifest.json présent à la racine, champs name, icons 192+512, start_url, display renseignéspurpose: maskable (générées par generate-pwa-icons.cjs)<link rel="manifest"> dans le HTMLtheme-color meta tag présentfetch event handler actifstart_url répond HTTP 200 (y compris offline)packages/core/
├── manifest.json ← Template source (mergé par build-deploy.cjs)
├── init.js ← Enregistrement SW (navigator.serviceWorker.register)
├── sw-core.js ← Service Worker lite (cache statique + profils)
└── src/
├── assets/icons/
│ ├── icon-192.png ← Généré par generate-pwa-icons.cjs
│ ├── icon-192-maskable.png
│ ├── icon-512.png
│ └── icon-512-maskable.png
└── modules/
├── geoleaf.pwa.ts ← Façade publique (GeoLeaf.PWA)
└── pwa/
├── pwa-manager.ts ← Orchestrateur + interface PWAConfig
├── install-prompt.ts ← Android banner
├── ios-banner.ts ← iOS instructions banner
└── index.ts ← Exports du module
scripts/
└── generate-pwa-icons.cjs ← Générateur d'icônes (sharp)
PWAConfigVoir PWAConfig pour la documentation complète des champs.