Native Features
Version : 1.0
Statut : Architecture cible
Décision : MOBILE-008
1. Objectif
L'application DMV repose principalement sur des technologies Web (React + Capacitor).
Cependant, certaines fonctionnalités offertes par les systèmes Android et iOS ne sont pas accessibles directement depuis le navigateur.
Le rôle de la couche Native Features est de fournir un accès uniforme à ces capacités sans introduire de logique métier dans la partie native.
Elle constitue une couche d'intégration entre le système d'exploitation et les applications React.
État actuel
Aucun shell Capacitor complet n'est encore identifié dans le code audité. Les applications web portent déjà l'essentiel de l'expérience et certaines capacités web, mais la couche Native Platform décrite ici reste une cible d'architecture.
Architecture cible
La Native Platform centralise l'accès aux capacités Android et iOS : notifications, caméra, galerie, partage, détection réseau, stockage sécurisé, géolocalisation et ouverture de liens.
Elle expose des services techniques aux applications React, sans logique métier et sans décision fonctionnelle.
Migration
La migration consiste à :
- créer le shell Capacitor ;
- intégrer les plugins natifs un par un ;
- fournir une abstraction React stable pour chaque capacité ;
- remplacer les appels directs aux APIs natives par cette abstraction ;
- auditer chaque fonctionnalité pour garantir qu'aucune règle métier ne migre dans le natif.
2. Philosophie
Le téléphone possède de nombreuses capacités.
Ces capacités ne sont pas le métier.
Le métier reste :
- Laravel
- PostgreSQL
- dmv-public
- dmv-workspace
Le natif apporte uniquement des services.
Application React
│
Native Service Layer
│
Capacitor Plugins
│
Android / iOS
3. Principes d'architecture
Toutes les fonctionnalités natives doivent respecter les principes suivants.
Aucune logique métier
Le code natif ne prend jamais de décision fonctionnelle.
Il fournit uniquement un service.
Exemple :
La caméra fournit une photo.
Elle ne décide jamais :
- où la stocker ;
- à quel acteur elle appartient ;
- si elle est valide.
Interface unique
React ne dialogue jamais directement avec Capacitor.
Toutes les fonctionnalités passent par une couche d'abstraction.
Exemple :
CameraService
NotificationService
LocationService
ShareService
Ainsi, si Capacitor est remplacé un jour, le reste de l'application reste inchangé.
Dégradation élégante
Une fonctionnalité native peut être :
- absente ;
- refusée ;
- indisponible.
L'application doit toujours continuer à fonctionner.
Exemple :
GPS refusé
↓
Sélection manuelle de la commune.
Permissions à la demande
Aucune permission n'est demandée au lancement.
Une permission est demandée uniquement lorsqu'une fonctionnalité en a réellement besoin.
4. Architecture
React
↓
Native Service
↓
Capacitor
↓
Android / iOS
Chaque service possède une responsabilité unique.
5. Services natifs
CameraService
Responsabilités :
- prendre une photo ;
- ouvrir la galerie ;
- retourner une image.
Utilisations :
- avatar ;
- logo acteur ;
- bannière ;
- publication.
NotificationService
Responsabilités :
- enregistrer le téléphone ;
- recevoir les notifications ;
- ouvrir les Deep Links.
Ne décide jamais du contenu des notifications.
LocationService
Responsabilités :
- récupérer la position GPS ;
- suivre les changements si autorisés.
Utilisations :
- commune actuelle ;
- recherche autour de moi ;
- calcul de distance.
ShareService
Utilisé pour partager :
- publication ;
- événement ;
- acteur ;
- commune.
Le contenu est généré par React.
FileService
Gestion :
- téléchargements ;
- cache ;
- brouillons ;
- documents.
NetworkService
Informe l'application :
- connexion disponible ;
- perte réseau ;
- type de réseau.
PreferencesService
Stockage léger :
- thème ;
- langue ;
- derniers contextes.
BiometricsService (future)
Authentification :
- Face ID
- Touch ID
- Empreinte Android
HapticService
Retour tactile.
Exemples :
- validation ;
- erreur ;
- succès.
ClipboardService
Copie :
- liens ;
- codes ;
- coordonnées.
6. Gestion des permissions
Les permissions suivent toujours le même cycle.
Fonction demandée
↓
Permission nécessaire ?
↓
Oui
↓
Demande utilisateur
↓
Autorisée
↓
Fonction exécutée
↓
Refusée
↓
Alternative proposée
Jamais de permission "préventive".
7. Stratégie de dégradation
Toutes les fonctionnalités natives doivent posséder une solution de secours.
| Fonction | Alternative |
|---|---|
| GPS | Choix manuel de la commune |
| Caméra | Galerie |
| Notifications | Centre de notifications DMV |
| Biométrie | Mot de passe |
| NFC | QR Code |
| Wallet |
Aucune fonctionnalité ne doit bloquer l'utilisation de DMV.
8. Notifications Push
Les notifications constituent l'une des fonctionnalités majeures.
Exemples :
- nouvelle publication favorite ;
- alerte mairie ;
- rappel d'événement ;
- message Workspace.
Une notification ouvre toujours directement la ressource concernée.
Jamais l'écran d'accueil.
9. Caméra
La caméra est utilisée pour :
- photo de profil ;
- logo ;
- bannière ;
- publication.
Les traitements (compression, validation, stockage) restent réalisés côté React et serveur.
10. Géolocalisation
La géolocalisation est utilisée uniquement lorsque cela apporte une réelle valeur.
Exemples :
- déterminer la commune actuelle ;
- afficher les acteurs proches ;
- rechercher autour de moi.
Elle n'est jamais utilisée en permanence.
11. Stockage local
Le stockage local est réservé à :
- cache ;
- brouillons ;
- préférences.
Jamais aux données métier.
12. Deep Links
Les fonctionnalités natives doivent ouvrir directement les ressources DMV, mais chaque type de lien a un rôle distinct.
- Les URLs HTTPS restent l'adresse canonique publique et partageable :
https://www.dansmonvillage.fr/.... - Les Universal Links iOS associent ces URLs HTTPS à l'application installée.
- Les Android App Links jouent le même rôle côté Android.
- Le schéma
dmv://est réservé aux liens internes contrôlés par l'application ou aux intégrations natives qui ne nécessitent pas d'URL publique.
Exemples internes :
dmv://publication/123
dmv://commune/sete
dmv://acteur/bibliotheque
dmv://workspace/acteur/tennis-club
Une notification peut transporter une URL HTTPS canonique ou une route interne. La Native Platform la résout ensuite vers l'écran DMV correspondant.
13. Évolutions futures
L'architecture doit permettre d'ajouter sans refonte :
Widgets
Accueil Android
Widgets iOS
Live Activities
Suivi d'événement.
Dynamic Island
Notifications contextuelles.
Wallet
Cartes :
- adhérent ;
- bibliothèque ;
- piscine.
NFC
Contrôle d'accès.
Pointage.
Badge.
Apple Watch
Notifications.
Validation rapide.
Consultation.
Wear OS
Même principe.
Android Auto
Informations utiles pendant un trajet.
CarPlay
Fonctionnalités compatibles avec la conduite.
14. Sécurité
Toutes les API natives doivent respecter :
- les permissions système ;
- les recommandations Apple ;
- les recommandations Google.
Aucune donnée sensible ne doit rester stockée en clair.
15. ADR
Alternatives étudiées
Utiliser directement Capacitor partout
Rejetée.
Couplage trop fort.
Couche d'abstraction Native Services
Retenue.
Simple.
Évolutive.
Testable.
16. Décisions figées
✅ Aucun métier dans le natif.
✅ Tous les appels passent par une couche d'abstraction.
✅ Les permissions sont demandées uniquement au moment du besoin.
✅ Chaque fonctionnalité possède une solution de secours.
✅ Les évolutions futures (Watch, Wallet, NFC, Widgets...) doivent s'intégrer sans modifier l'architecture existante.
Conclusion
La couche Native Features permet à DMV de bénéficier des capacités offertes par Android et iOS tout en conservant une architecture propre.
Le téléphone apporte des services.
La plateforme conserve le métier.
Cette séparation garantit une maintenance simple, une évolution durable et une compatibilité avec les futures technologies mobiles.