344 lines
9.3 KiB
Markdown
344 lines
9.3 KiB
Markdown
# Guide PWA - ObsiGate
|
||
|
||
ObsiGate est maintenant une **Progressive Web App (PWA)** complète, offrant une expérience d'application native sur tous les appareils.
|
||
|
||
## 🎯 Qu'est-ce qu'une PWA ?
|
||
|
||
Une Progressive Web App combine le meilleur du web et des applications natives :
|
||
- **Installation** : Installez ObsiGate sur votre appareil comme une application native
|
||
- **Mode hors ligne** : Accédez à vos notes même sans connexion internet
|
||
- **Notifications** : Recevez des alertes de mise à jour
|
||
- **Performance** : Chargement rapide grâce au cache intelligent
|
||
- **Multi-plateforme** : Fonctionne sur desktop, mobile et tablette
|
||
|
||
## 📱 Installation
|
||
|
||
### Sur Desktop (Chrome, Edge, Brave)
|
||
|
||
1. Ouvrez ObsiGate dans votre navigateur
|
||
2. Cliquez sur l'icône d'installation dans la barre d'adresse (➕ ou ⬇️)
|
||
3. Cliquez sur "Installer" dans la popup
|
||
4. ObsiGate apparaît maintenant dans vos applications
|
||
|
||
**Alternative** : Menu ⋮ → "Installer ObsiGate..."
|
||
|
||
### Sur Android
|
||
|
||
1. Ouvrez ObsiGate dans Chrome
|
||
2. Appuyez sur le menu ⋮ (trois points)
|
||
3. Sélectionnez "Ajouter à l'écran d'accueil"
|
||
4. Confirmez l'installation
|
||
5. L'icône ObsiGate apparaît sur votre écran d'accueil
|
||
|
||
### Sur iOS/iPadOS (Safari)
|
||
|
||
1. Ouvrez ObsiGate dans Safari
|
||
2. Appuyez sur le bouton Partager 📤
|
||
3. Faites défiler et sélectionnez "Sur l'écran d'accueil"
|
||
4. Nommez l'application et appuyez sur "Ajouter"
|
||
5. ObsiGate apparaît sur votre écran d'accueil
|
||
|
||
## ⚡ Fonctionnalités PWA
|
||
|
||
### Mode Hors Ligne
|
||
|
||
Le service worker met en cache :
|
||
- **Interface utilisateur** : HTML, CSS, JavaScript
|
||
- **Ressources statiques** : Icônes, polices
|
||
- **Contenu API** : Dernières données consultées
|
||
|
||
**Stratégies de cache** :
|
||
- **Cache First** : Assets statiques (interface)
|
||
- **Network First** : API et données dynamiques
|
||
- **Fallback** : Affichage gracieux en cas d'erreur
|
||
|
||
### Mises à Jour Automatiques
|
||
|
||
- Vérification des mises à jour toutes les minutes
|
||
- Notification élégante quand une nouvelle version est disponible
|
||
- Mise à jour en un clic sans perte de données
|
||
|
||
### Raccourcis d'Application
|
||
|
||
Accès rapide aux fonctionnalités depuis l'icône :
|
||
- **Recherche** : Ouvre directement la recherche
|
||
|
||
## 🛠️ Configuration Technique
|
||
|
||
### Fichiers PWA
|
||
|
||
```
|
||
ObsiGate/
|
||
├── frontend/
|
||
│ ├── manifest.json # Manifeste PWA
|
||
│ ├── sw.js # Service Worker
|
||
│ ├── icons/ # Icônes PWA
|
||
│ │ ├── icon-72x72.svg
|
||
│ │ ├── icon-192x192.svg
|
||
│ │ ├── icon-512x512.svg
|
||
│ │ └── ...
|
||
│ ├── index.html # Meta tags PWA
|
||
│ ├── app.js # Enregistrement SW
|
||
│ └── style.css # Styles PWA
|
||
└── generate_pwa_icons.py # Générateur d'icônes
|
||
```
|
||
|
||
### Manifeste (manifest.json)
|
||
|
||
Définit les métadonnées de l'application :
|
||
- Nom et description
|
||
- Icônes (multiples tailles)
|
||
- Couleurs de thème
|
||
- Mode d'affichage (standalone)
|
||
- Raccourcis d'application
|
||
|
||
### Service Worker (sw.js)
|
||
|
||
Gère le cache et le mode hors ligne :
|
||
- **Cache statique** : Interface et assets
|
||
- **Cache dynamique** : Données API (max 50 entrées)
|
||
- **Stratégies** : Cache-first et Network-first
|
||
- **Nettoyage** : Suppression automatique des anciens caches
|
||
|
||
### Icônes PWA
|
||
|
||
Tailles supportées :
|
||
- **72x72** : Favicon, petites icônes
|
||
- **96x96** : Raccourcis
|
||
- **128x128, 144x144, 152x152** : Appareils mobiles
|
||
- **192x192** : Android home screen (standard)
|
||
- **384x384** : Haute résolution
|
||
- **512x512** : Splash screens, maskable icons
|
||
|
||
**Maskable icons** : Icônes adaptatives avec safe zone pour Android
|
||
|
||
## 🔧 Génération des Icônes
|
||
|
||
### Utilisation du Script
|
||
|
||
```bash
|
||
# Générer les icônes SVG
|
||
python generate_pwa_icons.py
|
||
```
|
||
|
||
Le script crée :
|
||
- Icônes régulières (toutes tailles)
|
||
- Icônes maskables (192x192, 512x512)
|
||
- Icône de recherche (96x96)
|
||
- README avec instructions de conversion
|
||
|
||
### Conversion SVG → PNG (Production)
|
||
|
||
**Option 1 : ImageMagick**
|
||
```bash
|
||
cd frontend/icons
|
||
for file in *.svg; do
|
||
size=$(echo $file | grep -oP '\d+x\d+' | head -1 | cut -d'x' -f1)
|
||
convert -background none -resize ${size}x${size} "$file" "${file%.svg}.png"
|
||
done
|
||
```
|
||
|
||
**Option 2 : Inkscape**
|
||
```bash
|
||
cd frontend/icons
|
||
for file in *.svg; do
|
||
size=$(echo $file | grep -oP '\d+x\d+' | head -1 | cut -d'x' -f1)
|
||
inkscape "$file" --export-filename="${file%.svg}.png" --export-width=$size
|
||
done
|
||
```
|
||
|
||
**Option 3 : Outils en ligne**
|
||
- https://cloudconvert.com/svg-to-png
|
||
- https://convertio.co/svg-png/
|
||
|
||
**Note** : Les navigateurs modernes supportent les SVG directement, la conversion PNG est optionnelle.
|
||
|
||
## 🎨 Personnalisation
|
||
|
||
### Modifier les Couleurs
|
||
|
||
Éditez `frontend/manifest.json` :
|
||
```json
|
||
{
|
||
"theme_color": "#2563eb", // Couleur de la barre d'état
|
||
"background_color": "#1a1a1a" // Couleur de fond au lancement
|
||
}
|
||
```
|
||
|
||
### Modifier les Icônes
|
||
|
||
1. Éditez `generate_pwa_icons.py`
|
||
2. Modifiez les fonctions `create_svg_icon()` et `create_maskable_svg_icon()`
|
||
3. Régénérez : `python generate_pwa_icons.py`
|
||
|
||
### Ajouter des Raccourcis
|
||
|
||
Éditez `frontend/manifest.json` :
|
||
```json
|
||
{
|
||
"shortcuts": [
|
||
{
|
||
"name": "Nouvelle Note",
|
||
"url": "/?action=new",
|
||
"icons": [{"src": "/static/icons/new-96x96.png", "sizes": "96x96"}]
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## 🔍 Débogage
|
||
|
||
### Vérifier l'Installation PWA
|
||
|
||
**Chrome DevTools** :
|
||
1. Ouvrez DevTools (F12)
|
||
2. Onglet "Application"
|
||
3. Section "Manifest" : Vérifiez les métadonnées
|
||
4. Section "Service Workers" : Vérifiez l'enregistrement
|
||
5. Section "Cache Storage" : Inspectez le cache
|
||
|
||
### Tester le Mode Hors Ligne
|
||
|
||
1. DevTools → Onglet "Network"
|
||
2. Cochez "Offline"
|
||
3. Rechargez la page
|
||
4. L'application doit fonctionner avec les données en cache
|
||
|
||
### Logs du Service Worker
|
||
|
||
```javascript
|
||
// Dans la console du navigateur
|
||
navigator.serviceWorker.getRegistration().then(reg => {
|
||
console.log('Service Worker:', reg);
|
||
console.log('Active:', reg.active);
|
||
console.log('Waiting:', reg.waiting);
|
||
});
|
||
```
|
||
|
||
### Forcer la Mise à Jour
|
||
|
||
```javascript
|
||
// Dans la console
|
||
navigator.serviceWorker.getRegistration().then(reg => {
|
||
reg.update();
|
||
});
|
||
```
|
||
|
||
### Désinstaller le Service Worker
|
||
|
||
```javascript
|
||
// Dans la console
|
||
navigator.serviceWorker.getRegistrations().then(registrations => {
|
||
registrations.forEach(reg => reg.unregister());
|
||
});
|
||
```
|
||
|
||
## 📊 Métriques PWA
|
||
|
||
### Lighthouse Audit
|
||
|
||
1. Chrome DevTools → Onglet "Lighthouse"
|
||
2. Sélectionnez "Progressive Web App"
|
||
3. Cliquez sur "Generate report"
|
||
|
||
**Critères évalués** :
|
||
- ✅ Manifeste valide
|
||
- ✅ Service Worker enregistré
|
||
- ✅ HTTPS (ou localhost)
|
||
- ✅ Icônes appropriées
|
||
- ✅ Responsive design
|
||
- ✅ Mode hors ligne
|
||
|
||
### Score Attendu
|
||
|
||
ObsiGate devrait obtenir **90-100/100** sur l'audit PWA.
|
||
|
||
## 🚀 Déploiement
|
||
|
||
### Prérequis
|
||
|
||
- **HTTPS obligatoire** en production (sauf localhost)
|
||
- Service Worker nécessite une connexion sécurisée
|
||
|
||
### Configuration Reverse Proxy
|
||
|
||
**Nginx** :
|
||
```nginx
|
||
location /sw.js {
|
||
add_header Cache-Control "no-cache, no-store, must-revalidate";
|
||
add_header Service-Worker-Allowed "/";
|
||
proxy_pass http://obsigate:8080;
|
||
}
|
||
|
||
location /manifest.json {
|
||
add_header Cache-Control "public, max-age=3600";
|
||
proxy_pass http://obsigate:8080;
|
||
}
|
||
```
|
||
|
||
**Traefik** :
|
||
```yaml
|
||
http:
|
||
middlewares:
|
||
sw-headers:
|
||
headers:
|
||
customResponseHeaders:
|
||
Cache-Control: "no-cache, no-store, must-revalidate"
|
||
Service-Worker-Allowed: "/"
|
||
```
|
||
|
||
## 🔒 Sécurité
|
||
|
||
### Content Security Policy
|
||
|
||
Le service worker respecte la CSP définie dans le backend :
|
||
- Scripts : `'self'` + CDN autorisés
|
||
- Styles : `'self'` + CDN autorisés
|
||
- Images : `'self'` + data URIs
|
||
|
||
### Permissions
|
||
|
||
PWA installée demande les mêmes permissions que le site web :
|
||
- Aucune permission supplémentaire requise
|
||
- Notifications : optionnelles (désactivées par défaut)
|
||
|
||
## 📱 Compatibilité
|
||
|
||
| Plateforme | Support | Notes |
|
||
|------------|---------|-------|
|
||
| Chrome Desktop | ✅ Complet | Installation native |
|
||
| Edge Desktop | ✅ Complet | Installation native |
|
||
| Firefox Desktop | ⚠️ Partiel | Pas d'installation, SW fonctionne |
|
||
| Safari Desktop | ⚠️ Partiel | Support limité |
|
||
| Chrome Android | ✅ Complet | Installation + notifications |
|
||
| Safari iOS | ✅ Complet | "Add to Home Screen" |
|
||
| Samsung Internet | ✅ Complet | Installation native |
|
||
|
||
## 🎓 Ressources
|
||
|
||
- [MDN - Progressive Web Apps](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps)
|
||
- [web.dev - PWA](https://web.dev/progressive-web-apps/)
|
||
- [PWA Builder](https://www.pwabuilder.com/)
|
||
- [Workbox (Google)](https://developers.google.com/web/tools/workbox)
|
||
|
||
## ❓ FAQ
|
||
|
||
**Q : Puis-je utiliser ObsiGate sans l'installer ?**
|
||
R : Oui, l'installation est optionnelle. Le site web fonctionne normalement.
|
||
|
||
**Q : Les données sont-elles synchronisées hors ligne ?**
|
||
R : Non, le mode hors ligne utilise le cache local. Les modifications nécessitent une connexion.
|
||
|
||
**Q : Comment désinstaller l'application ?**
|
||
R : Desktop : Clic droit sur l'icône → "Désinstaller". Mobile : Maintenez l'icône → "Supprimer".
|
||
|
||
**Q : Le cache prend-il beaucoup d'espace ?**
|
||
R : Non, le cache est limité à ~50 entrées dynamiques + assets statiques (~5-10 MB).
|
||
|
||
**Q : Puis-je désactiver le service worker ?**
|
||
R : Oui, supprimez l'enregistrement dans DevTools ou commentez `registerServiceWorker()` dans `app.js`.
|
||
|
||
---
|
||
|
||
**ObsiGate PWA** - Vos notes Obsidian, partout, tout le temps. 📖✨
|