docs(adr): clarifier geofencing Phase 2 dans ADR-020

Modifications ADR-020 (Librairies Flutter):
- Séparer packages MVP (Phase 1) vs Phase 2
- Déplacer geofence_service en Phase 2 (mode offline)
- Ajouter firebase_messaging en Phase 1 (manquant)
- Mettre à jour diagramme mermaid avec phases
- Ajouter note explicite renvoyant vers ADR-017
- Corriger compteur librairies (7/8 → 7/9)

Résout incohérence: geofence_service n'est PAS utilisé
en MVP. Phase 1 utilise WebSocket + Firebase FCM pour
notifications de proximité (voir ADR-017).

Phase 2 introduira geofencing local pour mode offline.

Refs: ADR-017 (Notifications Géolocalisées)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
jpgiannetti
2026-02-01 15:15:44 +01:00
parent c3abdd74af
commit 69a7bd80cc

View File

@@ -14,9 +14,9 @@ L'application mobile RoadWave (iOS/Android) nécessite des librairies tierces po
## Décision ## Décision
Utilisation de **8 librairies open-source** Flutter avec licences permissives. Utilisation de **9 librairies open-source** Flutter avec licences permissives, déployées en 2 phases selon la stratégie définie dans [ADR-017 (Notifications Géolocalisées)](017-notifications-geolocalisees.md).
### Core Stack ### Phase 1 (MVP) : Core Stack
| Catégorie | Librairie | Licence | Justification | | Catégorie | Librairie | Licence | Justification |
|-----------|-----------|---------|---------------| |-----------|-----------|---------|---------------|
@@ -26,21 +26,29 @@ Utilisation de **8 librairies open-source** Flutter avec licences permissives.
| **Stockage sécurisé** | `flutter_secure_storage` | BSD-3 | Keychain iOS, KeyStore Android | | **Stockage sécurisé** | `flutter_secure_storage` | BSD-3 | Keychain iOS, KeyStore Android |
| **Cache images** | `cached_network_image` | MIT | LRU cache, placeholder support | | **Cache images** | `cached_network_image` | MIT | LRU cache, placeholder support |
### Géolocalisation & Permissions ### Phase 1 (MVP) : Géolocalisation & Notifications
| Catégorie | Librairie | Licence | Justification | | Catégorie | Librairie | Licence | Justification |
|-----------|-----------|---------|---------------| |-----------|-----------|---------|---------------|
| **GPS temps réel** | `geolocator` | MIT | Mode voiture, high accuracy, background modes | | **GPS temps réel** | `geolocator` | MIT | Mode voiture, WebSocket position updates, high accuracy |
| **Geofencing** | `geofence_service` | MIT | Détection rayon 200m, mode piéton, économie batterie | | **Push notifications** | `firebase_messaging` | BSD-3 | FCM tokens, notifications serveur (ADR-017) |
| **Notifications locales** | `flutter_local_notifications` | BSD-3 | Compteur dynamique, icônes custom, iOS/Android | | **Notifications locales** | `flutter_local_notifications` | BSD-3 | Compteur dynamique, icônes custom, iOS/Android |
| **Permissions** | `permission_handler` | MIT | Gestion unifiée permissions iOS/Android |
### Packages Additionnels (CarPlay/Android Auto) ### Phase 1 (MVP) : CarPlay/Android Auto (optionnel)
| Catégorie | Librairie | Licence | Justification | | Catégorie | Librairie | Licence | Justification |
|-----------|-----------|---------|---------------| |-----------|-----------|---------|---------------|
| **CarPlay** | `flutter_carplay` | MIT | Intégration CarPlay native (communautaire) | | **CarPlay** | `flutter_carplay` | MIT | Intégration CarPlay native (communautaire) |
| **Android Auto** | `android_auto_flutter` | Apache-2.0 | Support Android Auto (communautaire) | | **Android Auto** | `android_auto_flutter` | Apache-2.0 | Support Android Auto (communautaire) |
| **Permissions** | `permission_handler` | MIT | Gestion unifiée permissions iOS/Android |
### Phase 2 (Post-MVP) : Geofencing Local
| Catégorie | Librairie | Licence | Justification | Voir ADR |
|-----------|-----------|---------|---------------|----------|
| **Geofencing local** | `geofence_service` | MIT | Mode offline, détection rayon 200m, notifications app fermée | [ADR-017](017-notifications-geolocalisees.md) Phase 2 |
**Note importante** : Le geofencing local (`geofence_service`) n'est **PAS utilisé en MVP**. La Phase 1 utilise WebSocket + Firebase pour les notifications de proximité (voir [ADR-017](017-notifications-geolocalisees.md) pour l'architecture complète).
## Alternatives considérées ## Alternatives considérées
@@ -60,11 +68,21 @@ Utilisation de **8 librairies open-source** Flutter avec licences permissives.
- **location** : Moins maintenu - **location** : Moins maintenu
- **background_location** : Spécifique background uniquement - **background_location** : Spécifique background uniquement
### Notifications Push
- **firebase_messaging** (choisi) : Gratuit, 99.95% uptime, intégration native iOS/Android
- **OneSignal** : Plus cher (500€/mois @ 100K users)
- **Custom WebSocket** : Complex, toujours besoin APNS/FCM au final (voir ADR-017)
### Geofencing (Phase 2)
- **geofence_service** (choisi) : Natif iOS/Android, économie batterie optimale
- **background_geolocation** : Payant (149$/an par app)
- **flutter_background_location** : Moins mature
## Justification ## Justification
### Licences ### Licences
- **7/8 librairies** : MIT (permissive totale) - **7/9 librairies** : MIT (permissive totale)
- **1/8** : BSD-3 (permissive, compatible commercial) - **2/9** : BSD-3 (permissive, compatible commercial)
- **Compatibilité totale** : Aucun conflit de licence, aucune restriction commerciale - **Compatibilité totale** : Aucun conflit de licence, aucune restriction commerciale
### Maturité ### Maturité
@@ -77,12 +95,14 @@ Utilisation de **8 librairies open-source** Flutter avec licences permissives.
- **Compilation native** : Dart → ARM64 (pas de bridge JS comme React Native) - **Compilation native** : Dart → ARM64 (pas de bridge JS comme React Native)
- **just_audio** : Utilise AVPlayer (iOS) et ExoPlayer (Android) natifs - **just_audio** : Utilise AVPlayer (iOS) et ExoPlayer (Android) natifs
- **geolocator** : Accès direct CoreLocation (iOS) et FusedLocation (Android) - **geolocator** : Accès direct CoreLocation (iOS) et FusedLocation (Android)
- **geofence_service** : Geofencing natif, minimise consommation batterie - **firebase_messaging** : Utilise services systèmes (Google Play Services, APNS)
- **geofence_service** (Phase 2) : Geofencing natif, minimise consommation batterie
### Conformité Stores ### Conformité Stores
- **Permissions progressives** : `permission_handler` + stratégie ADR-010 - **Permissions progressives** : `permission_handler` + stratégie ADR-010
- **Background modes** : `geolocator` + `geofence_service` approuvés stores - **Background modes MVP** : `geolocator` (When In Use) + `firebase_messaging` approuvés stores
- **Notifications** : `flutter_local_notifications` conforme guidelines iOS/Android - **Background modes Phase 2** : `geofence_service` nécessite permission "Always" (taux acceptation ~30%)
- **Notifications** : `flutter_local_notifications` + `firebase_messaging` conformes guidelines iOS/Android
## Architecture ## Architecture
@@ -99,14 +119,18 @@ graph TB
Cache["cached_network_image<br/>(Image Cache)"] Cache["cached_network_image<br/>(Image Cache)"]
end end
subgraph Services["Services Layer"] subgraph Services["Services Layer - Phase 1 MVP"]
Audio["just_audio<br/>(HLS Streaming)"] Audio["just_audio<br/>(HLS Streaming)"]
GPS["geolocator<br/>(GPS Mode Voiture)"] GPS["geolocator<br/>(GPS + WebSocket)"]
Geofence["geofence_service<br/>(Mode Piéton)"] FCM["firebase_messaging<br/>(Push Serveur)"]
Notif["flutter_local_notifications<br/>(Alerts Locales)"] Notif["flutter_local_notifications<br/>(Notifications Locales)"]
Perms["permission_handler<br/>(Permissions iOS/Android)"] Perms["permission_handler<br/>(Permissions iOS/Android)"]
end end
subgraph Phase2["Services Layer - Phase 2"]
Geofence["geofence_service<br/>(Mode Offline)"]
end
subgraph Platform["Platform Integration"] subgraph Platform["Platform Integration"]
CarPlay["flutter_carplay<br/>(iOS)"] CarPlay["flutter_carplay<br/>(iOS)"]
AndroidAuto["android_auto_flutter<br/>(Android)"] AndroidAuto["android_auto_flutter<br/>(Android)"]
@@ -116,14 +140,17 @@ graph TB
Bloc --> API Bloc --> API
Bloc --> Audio Bloc --> Audio
Bloc --> GPS Bloc --> GPS
Bloc --> Geofence Bloc --> FCM
API --> Storage API --> Storage
Widgets --> Cache Widgets --> Cache
GPS --> Perms GPS --> Perms
Geofence --> Perms FCM --> Perms
Geofence --> Notif FCM --> Notif
Geofence -.->|Phase 2| Perms
Geofence -.->|Phase 2| Notif
Audio --> CarPlay Audio --> CarPlay
Audio --> AndroidAuto Audio --> AndroidAuto
@@ -135,7 +162,8 @@ graph TB
class UI,Widgets,Bloc uiStyle class UI,Widgets,Bloc uiStyle
class Data,API,Storage,Cache dataStyle class Data,API,Storage,Cache dataStyle
class Services,Audio,GPS,Geofence,Notif,Perms serviceStyle class Services,Audio,GPS,FCM,Notif,Perms serviceStyle
class Phase2,Geofence serviceStyle
class Platform,CarPlay,AndroidAuto platformStyle class Platform,CarPlay,AndroidAuto platformStyle
``` ```
@@ -151,7 +179,8 @@ graph TB
### Négatives ### Négatives
- ⚠️ **CarPlay/Android Auto** : Packages communautaires (pas officiels Flutter) - ⚠️ **CarPlay/Android Auto** : Packages communautaires (pas officiels Flutter)
- ⚠️ **Géolocalisation background** : Scrutée par App Store (stratégie progressive requise, ADR-010) - ⚠️ **Firebase dépendance** : Vendor lock-in Google (mitigé par abstraction layer, voir ADR-017)
- ⚠️ **Permission "Always" Phase 2** : Taux acceptation ~30% (geofencing local)
-**Courbe d'apprentissage** : Dart + pattern BLoC à maîtriser -**Courbe d'apprentissage** : Dart + pattern BLoC à maîtriser
-**Tests stores** : Validation TestFlight (iOS) et Internal Testing (Android) obligatoires -**Tests stores** : Validation TestFlight (iOS) et Internal Testing (Android) obligatoires
@@ -159,23 +188,26 @@ graph TB
> **Note** : Les versions exactes seront définies lors de l'implémentation. Cette section indique les packages requis, non les versions à utiliser (qui évoluent rapidement dans l'écosystème Flutter). > **Note** : Les versions exactes seront définies lors de l'implémentation. Cette section indique les packages requis, non les versions à utiliser (qui évoluent rapidement dans l'écosystème Flutter).
**Core** : **Core (Phase 1 MVP)** :
- `flutter_bloc` - State management - `flutter_bloc` - State management
- `just_audio` - Audio HLS streaming - `just_audio` - Audio HLS streaming
- `dio` - HTTP client - `dio` - HTTP client
- `flutter_secure_storage` - Stockage sécurisé JWT - `flutter_secure_storage` - Stockage sécurisé JWT
- `cached_network_image` - Cache images - `cached_network_image` - Cache images
**Géolocalisation & Notifications** : **Géolocalisation & Notifications (Phase 1 MVP)** :
- `geolocator` - GPS haute précision - `geolocator` - GPS haute précision, WebSocket position updates
- `geofence_service` - Geofencing arrière-plan - `firebase_messaging` - Push notifications serveur (ADR-017)
- `flutter_local_notifications` - Notifications locales - `flutter_local_notifications` - Notifications locales
- `permission_handler` - Gestion permissions - `permission_handler` - Gestion permissions
**CarPlay/Android Auto** (optionnels MVP) : **CarPlay/Android Auto (optionnels Phase 1)** :
- `flutter_carplay` - Intégration CarPlay - `flutter_carplay` - Intégration CarPlay
- `android_auto_flutter` - Support Android Auto - `android_auto_flutter` - Support Android Auto
**Geofencing (Phase 2 Post-MVP)** :
- `geofence_service` - Geofencing local pour mode offline (ADR-017 Phase 2)
### Migration depuis ADR-010 ### Migration depuis ADR-010
La section "Packages clés" de l'ADR-010 est désormais obsolète et doit référencer cet ADR : La section "Packages clés" de l'ADR-010 est désormais obsolète et doit référencer cet ADR :
@@ -190,7 +222,8 @@ La section "Packages clés" de l'ADR-010 est désormais obsolète et doit réfé
### Risque 2 : Validation App Store (permissions background) ### Risque 2 : Validation App Store (permissions background)
- **Impact** : Taux de rejet ~70% si mal justifié - **Impact** : Taux de rejet ~70% si mal justifié
- **Mitigation** : Stratégie progressive (ADR-010), écrans d'éducation, tests beta TestFlight - **Mitigation Phase 1** : Permission "When In Use" seulement (MVP), moins scrutée par Apple
- **Mitigation Phase 2** : Stratégie progressive (ADR-010), écrans d'éducation, tests beta TestFlight pour permission "Always"
### Risque 3 : Performance audio HLS en arrière-plan ### Risque 3 : Performance audio HLS en arrière-plan
- **Impact** : Interruptions si OS tue l'app - **Impact** : Interruptions si OS tue l'app
@@ -198,10 +231,13 @@ La section "Packages clés" de l'ADR-010 est désormais obsolète et doit réfé
## Références ## Références
- ADR-010 : Frontend Mobile (Flutter, architecture permissions) - [ADR-010 : Frontend Mobile](010-frontend-mobile.md) (Flutter, architecture permissions)
- ADR-018 : Librairies Go (même format de documentation) - [ADR-017 : Notifications Géolocalisées](017-notifications-geolocalisees.md) (Phase 1 WebSocket vs Phase 2 Geofencing)
- [ADR-018 : Librairies Go](018-librairies-go.md) (même format de documentation)
- [flutter_bloc documentation](https://bloclibrary.dev/) - [flutter_bloc documentation](https://bloclibrary.dev/)
- [just_audio repository](https://pub.dev/packages/just_audio) - [just_audio repository](https://pub.dev/packages/just_audio)
- [geolocator documentation](https://pub.dev/packages/geolocator) - [geolocator documentation](https://pub.dev/packages/geolocator)
- [firebase_messaging documentation](https://pub.dev/packages/firebase_messaging)
- [geofence_service documentation](https://pub.dev/packages/geofence_service)
- [Apple CarPlay Developer Guide](https://developer.apple.com/carplay/) - [Apple CarPlay Developer Guide](https://developer.apple.com/carplay/)
- [Android Auto Developer Guide](https://developer.android.com/training/cars) - [Android Auto Developer Guide](https://developer.android.com/training/cars)