🎯 Stratégie Offline Mobile
Contexte
L’application mobile CerOps est utilisée en plein champ, souvent sans connexion réseau. Le mode offline permet de consulter et modifier les données sans internet, puis de synchroniser au retour de la connectivité.
Objectif
Permettre à l’utilisateur de travailler hors ligne sur ses parcelles et actions, avec synchronisation automatique à la reconnexion.
Utilisateurs concernés
- Agriculteur
- Pilote de drone
Fonctionnalités (User Stories)
- En tant qu’agriculteur, je veux consulter mes parcelles et actions sans connexion.
- En tant qu’agriculteur, je veux créer et modifier des actions hors ligne, afin qu’elles soient synchronisées à la reconnexion.
- En tant qu’utilisateur, je veux télécharger une zone de carte à l’avance pour naviguer hors ligne.
- En tant qu’utilisateur, je veux savoir quelles données ne sont pas encore synchronisées.
Données manipulées
Ce qui est mis en cache offline
| Donnée | Faisabilité | Stratégie |
|---|---|---|
| Parcelles (métadonnées) | ✅ Oui | Cache complet |
| Actions / tâches | ✅ Oui | Cache complet + mise à jour optimiste |
| Missions de vol (métadonnées) | ✅ Oui | Cache métadonnées uniquement |
| Tuiles de carte | ✅ Oui (par zone) | Téléchargement à la demande (FMTC) |
| Imagerie NDVI | ⚠️ Sélectif | Miniatures uniquement, à la demande |
| Images brutes drone | ❌ Non | Serveur uniquement |
Champs offline ajoutés à chaque entité
needsSync(bool) : modification locale en attente de synchronisationlastModifiedAt(DateTime) : horodatage pour la résolution de conflits
Choix technologique
Base de données locale : Drift
Drift (SQLite ORM) est retenu pour les raisons suivantes :
- Requêtes filtrées typées à la compilation (SQL)
- Streaming natif compatible Riverpod (
watch()→StreamProvider) - Migrations de schéma versionnées — évolutions du modèle sans perte de données
- Transactions atomiques pour la cohérence lors des synchronisations
- Multi-plateforme : Android, iOS, Web, Desktop
Hive (clé-valeur) a été écarté : pas de migrations natives, pas de streaming filtré, scan mémoire O(n) pour les requêtes.
Détection de connectivité : connectivity_plus
Détecte les changements Wi-Fi / données mobiles. Note : connexion détectée ≠ internet disponible — tous les appels API restent protégés par timeout.
Cartes offline : flutter_map_tile_caching (FMTC)
Téléchargement de tuiles par zone géographique délimitée. Zoom 15–17, environ 15–30 Mo par zone de 5 km². Expiration à 30 jours.
Licence GPL — à vérifier avant intégration en production.
Résolution de conflits
Stratégie : Last-Write-Wins basée sur lastModifiedAt.
- Modification locale plus récente → envoyée au serveur
- Version serveur plus récente → écrase la version locale
- En cas d’égalité → version serveur prime
Écrans / UX
- Bannière discrète quand l’application est hors ligne
- Indicateur visuel sur les éléments avec
needsSync: true - Notification au retour de la connectivité : « X éléments synchronisés »
- Écran de téléchargement de zone carte (accessible depuis les paramètres)
Cas limites
- Premier démarrage sans connexion : impossible — le cache est vide, l’utilisateur doit se connecter une première fois.
- Session expirée hors ligne : l’utilisateur travaille jusqu’à expiration du token, aucune re-authentification possible sans réseau.
- Stockage insuffisant : erreur explicite, téléchargement annulé.
- Entité référencée absente du cache : placeholder affiché, pas d’erreur fatale.
- Évolution du schéma : migration Drift, aucune perte de données.
Critères d’acceptation
- L’application démarre sans connexion et affiche les données du cache.
- Les parcelles et actions sont lisibles hors ligne.
- Une action créée hors ligne est sauvegardée localement et synchronisée à la reconnexion.
- Le statut d’une action modifié hors ligne est mis à jour immédiatement (optimiste) et synchronisé à la reconnexion.
- Les éléments non synchronisés sont visuellement distingués.
- Une zone de carte peut être téléchargée et consultée hors ligne.
- Une mise à jour de l’application ne perd pas les données locales.
Dépendances
Packages Flutter
| Package | Usage |
|---|---|
drift + drift_flutter | Base de données locale SQLite |
drift_dev + build_runner | Génération de code (dev uniquement) |
connectivity_plus | Détection de connectivité |
flutter_map_tile_caching | Cache de tuiles carte (GPL) |
Backend
- Aucun endpoint spécifique offline requis au MVP.
- Chaque entité doit exposer
updatedAtpour la résolution de conflits LWW. - Post-MVP : endpoint delta-sync (entités modifiées depuis un timestamp).
MVP vs Post-MVP
MVP
- Cache Drift pour parcelles et actions (lecture + écriture hors ligne)
- Synchronisation manuelle au retour de la connexion (pull-to-refresh / démarrage)
- Mise à jour optimiste pour les actions
- Indicateur visuel offline + éléments en attente de sync
- Téléchargement de tuiles par zone (FMTC)
- Résolution de conflits Last-Write-Wins
Post-MVP
- Synchronisation automatique en arrière-plan (workmanager, toutes les 20 min)
- Delta-sync depuis un timestamp
- Cache miniatures NDVI à la demande
- Gestion automatique de l’espace disque
- Notification push pour déclencher une sync depuis le serveur