La connectivité est un privilège, pas une garantie dans les opérations militaires sur le terrain. Les brouilleurs GPS, le masquage par le terrain, les canyons urbains denses, les opérations sous-marines et le silence radio délibéré — tout cela produit le même résultat : votre application doit fonctionner sans aucun accès réseau. Il ne s'agit pas d'un cas limite à gérer avec élégance — c'est le mode d'exploitation principal pour lequel les applications mobiles tactiques doivent être conçues.
L'offline-first est une philosophie de conception, pas une fonctionnalité. Cela signifie que l'application a été conçue dès le départ en supposant l'absence de connectivité, la synchronisation réseau étant une amélioration plutôt qu'un prérequis. L'implication pratique est architecturale : toutes les données dont l'application a besoin doivent résider sur l'appareil, toutes les actions de l'utilisateur doivent être enregistrées localement, et un moteur de synchronisation doit réconcilier l'état local avec le serveur lorsque la connectivité est finalement rétablie.
Pourquoi l'offline-first est une exigence stricte
Le mode de défaillance d'une application connectée dans un environnement déconnecté n'est pas élégant. Lorsque l'application perd sa connexion au serveur, elle affiche généralement une erreur, désactive les fonctionnalités ou présente des données périmées sans indiquer leur âge. Aucun de ces comportements n'est acceptable dans un contexte tactique. Un opérateur qui perd l'image tactique parce que le modem cellulaire a perdu le signal a subi une dégradation de ses capacités opérationnelles par le logiciel censé les améliorer.
Il y a aussi une dimension sécuritaire. Dans les environnements électromagnétiques contestés, la réduction des émissions radio est elle-même une exigence tactique. Une application qui communique en permanence avec un serveur génère de l'énergie radiofréquence qui peut être détectée et géolocalisée. Le fonctionnement offline-first avec une synchronisation chiffrée par lots réduit la signature RF de la couche de données du système.
Stockage local des données : SQLite, Realm et WatermelonDB
SQLite est la base de données embarquée la plus répandue sur Android et iOS. Elle est mature, bien comprise et présente un profil de performances prévisible. L'activation du mode WAL (PRAGMA journal_mode=WAL) améliore considérablement les performances de lecture simultanée et le débit d'écriture — généralement 3 à 5 fois pour les charges de travail avec des lectures et des écritures mixtes. Pour les applications enregistrant des données de position à haute fréquence, le mode WAL est essentiel.
Realm est une base de données mobile-first conçue pour surpasser SQLite dans le stockage de graphes d'objets. Son principal avantage est le chargement paresseux : les objets Realm sont mappés en mémoire depuis le disque, ce qui signifie que vous ne chargez jamais plus de données que celles auxquelles vous accédez réellement.
WatermelonDB est une base de données haute performance spécifique à React Native construite sur SQLite. Sa principale caractéristique de conception est l'observation paresseuse — elle ne récupère les données que lorsque l'interface utilisateur en a réellement besoin.
Stratégies de synchronisation : LWW, transformations opérationnelles, CRDT
Last-Write-Wins (LWW) est la stratégie la plus simple : lorsque deux versions d'un enregistrement entrent en conflit, la version avec l'horodatage le plus récent l'emporte. LWW est facile à implémenter et fonctionne adéquatement pour les données rarement éditées simultanément par plusieurs opérateurs. Son mode de défaillance est la perte silencieuse de données.
Les transformations opérationnelles (OT) résolvent le problème que LWW ne peut pas : les modifications simultanées du même enregistrement. OT transforme les opérations entrantes pour tenir compte des opérations déjà appliquées localement, produisant un résultat incorporant les deux modifications.
Les CRDT (Conflict-free Replicated Data Types) sont la solution mathématiquement rigoureuse à la synchronisation d'état distribué. Un CRDT est une structure de données conçue pour que tout ensemble de mises à jour simultanées puisse être fusionné sans conflits, quelle que soit l'ordre dans lequel elles sont reçues. Les bibliothèques Automerge et Yjs fournissent des implémentations CRDT prêtes pour la production.
MBTiles pour les cartes hors ligne
Les cartes hors ligne dans les applications tactiques sont presque universellement livrées en MBTiles — une spécification ouverte qui empaquète les tuiles de carte dans une base de données SQLite. Le schéma est simple : une table tiles avec les colonnes zoom_level, tile_column, tile_row et tile_data.
Les stratégies de mise à jour partielle pour les cartes hors ligne traitent un problème opérationnel critique : comment mettre à jour une zone spécifique d'une carte hors ligne sans télécharger à nouveau l'ensemble du paquet de carte ? La réponse est les paquets delta — des fichiers MBTiles ne contenant que les tuiles modifiées depuis la dernière version.
Synchronisation en arrière-plan lors du rétablissement de la connectivité
Backoff exponentiel avec gigue. Lors d'un échec de synchronisation, réessayez avec un délai qui augmente de façon exponentielle plus une gigue aléatoire. Démarrant à 30 secondes, doublant chaque échec jusqu'à un maximum de 30 minutes, avec ±25% de gigue.
File d'attente prioritaire. Les rapports de position pour les opérations en cours doivent se synchroniser avant les journaux historiques. Les changements de statut urgents (demande CASEVAC, rapport de contact) doivent se synchroniser avant les rapports de routine. La DGA recommande au moins trois niveaux de priorité.
Opérations idempotentes. Chaque opération de synchronisation doit être idempotente — l'appliquer deux fois doit produire le même résultat que l'appliquer une fois. Cela nécessite l'attribution d'UUID stables à tous les enregistrements lors de leur création et l'utilisation de la sémantique upsert côté serveur.
Insight clé : Le moteur de synchronisation est le composant le plus complexe et le plus sujet aux défaillances d'une application tactique offline-first. Budgétisez-le en conséquence — une implémentation naïve corrompra les données en production dans des conditions opérationnelles réelles. Testez avec des partitions réseau simulées de 12 à 24 heures, pas seulement des déconnexions momentanées.