Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

🎯 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éeFaisabilitéStratégie
Parcelles (métadonnées)✅ OuiCache complet
Actions / tâches✅ OuiCache complet + mise à jour optimiste
Missions de vol (métadonnées)✅ OuiCache métadonnées uniquement
Tuiles de carte✅ Oui (par zone)Téléchargement à la demande (FMTC)
Imagerie NDVI⚠️ SélectifMiniatures uniquement, à la demande
Images brutes drone❌ NonServeur uniquement

Champs offline ajoutés à chaque entité

  • needsSync (bool) : modification locale en attente de synchronisation
  • lastModifiedAt (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

PackageUsage
drift + drift_flutterBase de données locale SQLite
drift_dev + build_runnerGénération de code (dev uniquement)
connectivity_plusDétection de connectivité
flutter_map_tile_cachingCache de tuiles carte (GPL)

Backend

  • Aucun endpoint spécifique offline requis au MVP.
  • Chaque entité doit exposer updatedAt pour 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