docs: améliorer rendu markdown et navigation mkdocs
- Ajouter ADR-018 (librairies Go) dans TECHNICAL.md - Transformer Shared en menu dépliable dans mkdocs (cohérence avec autres domaines) - Corriger listes markdown (ajout lignes vides avant listes) - Corriger line breaks dans génération BDD (étapes "Et" sur nouvelles lignes) - Ajouter script fix-markdown-lists.sh pour corrections futures Impacte 86 fichiers de documentation et 164 fichiers BDD générés.
This commit is contained in:
@@ -14,18 +14,21 @@ La géolocalisation est **critique** pour RoadWave, mais les permissions arrièr
|
||||
### Problématiques Identifiées
|
||||
|
||||
#### iOS App Store
|
||||
|
||||
- **Taux de rejet ~70%** si permission "Always Location" mal justifiée
|
||||
- Apple exige que l'app soit **pleinement utilisable** sans "Always Location"
|
||||
- Textes `Info.plist` scrutés manuellement par reviewers humains
|
||||
- Rejection si suspicion de tracking publicitaire ou vente de données
|
||||
|
||||
#### Android Play Store
|
||||
|
||||
- Depuis Android 10 : `ACCESS_BACKGROUND_LOCATION` nécessite **déclaration justifiée**
|
||||
- Vidéo démo **obligatoire** montrant le flow de demande (< 30s)
|
||||
- Google vérifie que la permission est **réellement optionnelle**
|
||||
- Foreground service notification **obligatoire** en arrière-plan (Android 12+)
|
||||
|
||||
#### RGPD (Règle 02)
|
||||
|
||||
- Permissions doivent être **optionnelles**
|
||||
- Utilisateur doit pouvoir **refuser sans pénalité**
|
||||
- App doit fonctionner en **mode dégradé acceptable**
|
||||
@@ -62,6 +65,7 @@ La géolocalisation est **critique** pour RoadWave, mais les permissions arrièr
|
||||
## Étape 1 : Permission de Base (Onboarding)
|
||||
|
||||
### Quand
|
||||
|
||||
- **Premier lancement** de l'app
|
||||
- Avant de pouvoir utiliser les fonctionnalités principales
|
||||
|
||||
@@ -109,6 +113,7 @@ La géolocalisation est **critique** pour RoadWave, mais les permissions arrièr
|
||||
### Si Permission Refusée
|
||||
|
||||
**Mode dégradé (IP2Location)** :
|
||||
|
||||
- Détection pays/ville via adresse IP (IP2Location Lite, voir [ADR-019](../adr/019-geolocalisation-ip.md))
|
||||
- Contenus nationaux et régionaux disponibles
|
||||
- Pas de contenus hyperlocaux (< 10km)
|
||||
@@ -246,6 +251,7 @@ class LocationOnboardingScreen extends StatelessWidget {
|
||||
## Étape 2 : Permission Arrière-Plan (Optionnelle)
|
||||
|
||||
### Quand
|
||||
|
||||
- User **active explicitement** "Notifications audio-guides piéton" dans Settings
|
||||
- **Jamais au premier lancement**
|
||||
|
||||
@@ -547,6 +553,7 @@ class _NotificationsSettingsScreenState extends State<NotificationsSettingsScree
|
||||
| **Denied** | ⚠️ IP2Location (ville) | ❌ Désactivé | ❌ Aucun | Aucune |
|
||||
|
||||
**Garanties** :
|
||||
|
||||
- App **utilisable** à tous niveaux de permission ✅
|
||||
- Pas de fonctionnalité **bloquante** sans permission ✅
|
||||
- Mode dégradé **acceptable** (contenus régionaux) ✅
|
||||
@@ -632,6 +639,7 @@ class _NotificationsSettingsScreenState extends State<NotificationsSettingsScree
|
||||
- [ ] Fonctionnalité précise ("audio-guides piéton")
|
||||
- [ ] **Optionnalité** ("Cette fonctionnalité est optionnelle")
|
||||
- [ ] Pas de mention tracking/publicité
|
||||
|
||||
- [ ] App fonctionne **complètement** avec permission "When In Use" uniquement
|
||||
- [ ] App fonctionne en **mode dégradé** sans aucune permission (IP2Location)
|
||||
- [ ] Screenshots montrant app fonctionnelle sans permission "Always"
|
||||
@@ -642,11 +650,13 @@ class _NotificationsSettingsScreenState extends State<NotificationsSettingsScree
|
||||
- [ ] Déclaration `ACCESS_BACKGROUND_LOCATION` avec justification dans Play Console :
|
||||
- [ ] "Notifications géolocalisées pour audio-guides touristiques en arrière-plan"
|
||||
- [ ] "Permet aux utilisateurs de recevoir des alertes lorsqu'ils passent près de monuments"
|
||||
|
||||
- [ ] **Vidéo démo obligatoire** (< 30s) montrant :
|
||||
- [ ] Activation toggle "Mode piéton" dans Settings
|
||||
- [ ] Écran d'éducation pré-permission
|
||||
- [ ] Demande permission système Android
|
||||
- [ ] App fonctionnelle si permission refusée
|
||||
|
||||
- [ ] Foreground service notification visible en mode piéton (Android 12+)
|
||||
- [ ] App fonctionne **complètement** avec `ACCESS_FINE_LOCATION` uniquement
|
||||
- [ ] App fonctionne en **mode dégradé** sans permissions
|
||||
@@ -729,6 +739,7 @@ void main() {
|
||||
### Tests Manuels (Devices Réels)
|
||||
|
||||
**iOS** :
|
||||
|
||||
- [ ] iPhone avec iOS 14, 15, 16, 17, 18
|
||||
- [ ] Tester flow onboarding permission "When In Use"
|
||||
- [ ] Tester activation mode piéton avec permission "Always"
|
||||
@@ -736,6 +747,7 @@ void main() {
|
||||
- [ ] Tester changement permission dans Settings iOS → app réagit correctement
|
||||
|
||||
**Android** :
|
||||
|
||||
- [ ] Android 10, 11, 12, 13, 14, 15
|
||||
- [ ] Tester flow onboarding permission `FINE_LOCATION`
|
||||
- [ ] Tester activation mode piéton avec `BACKGROUND_LOCATION`
|
||||
@@ -755,11 +767,13 @@ void main() {
|
||||
**Durée** : 2 semaines
|
||||
|
||||
**Checklist** :
|
||||
|
||||
- [ ] Upload build vers TestFlight
|
||||
- [ ] Compléter questionnaire App Store Connect :
|
||||
- [ ] "Why does your app use background location?"
|
||||
→ "To send push notifications when users walk near tourist audio-guides, even when app is closed. This feature is optional and can be disabled in settings."
|
||||
- [ ] Screenshots montrant app fonctionnelle sans permission "Always"
|
||||
|
||||
- [ ] Attendre review Apple (24-48h)
|
||||
- [ ] Si rejet : analyser feedback, ajuster textes/flow, re-soumettre
|
||||
- [ ] Si accepté : lancer beta test avec testeurs
|
||||
@@ -772,6 +786,7 @@ void main() {
|
||||
5. Désactiver mode piéton → vérifier app toujours fonctionnelle
|
||||
|
||||
**Métriques collectées** :
|
||||
|
||||
- Taux acceptation permission "When In Use" : cible >85%
|
||||
- Taux acceptation permission "Always" : cible >40%
|
||||
- Taux rejet App Review : cible 0%
|
||||
@@ -785,10 +800,12 @@ void main() {
|
||||
**Durée** : 1 semaine
|
||||
|
||||
**Checklist** :
|
||||
|
||||
- [ ] Upload build vers Play Console (Internal Testing)
|
||||
- [ ] Compléter déclaration permissions :
|
||||
- [ ] `ACCESS_BACKGROUND_LOCATION` justification
|
||||
- [ ] Upload vidéo démo (< 30s)
|
||||
|
||||
- [ ] Tester sur Android 10, 11, 12, 13, 14, 15
|
||||
- [ ] Vérifier foreground notification visible (Android 12+)
|
||||
|
||||
@@ -800,6 +817,7 @@ void main() {
|
||||
5. Vérifier notification foreground service visible dans panneau notifications
|
||||
|
||||
**Métriques collectées** :
|
||||
|
||||
- Consommation batterie mode piéton : cible <5% par heure
|
||||
- Taux crash background service : cible <0.1%
|
||||
|
||||
@@ -843,6 +861,7 @@ void main() {
|
||||
### Q4 : Combien de temps pour validation TestFlight/Play Store ?
|
||||
|
||||
**R** :
|
||||
|
||||
- TestFlight : 24-48h (review Apple)
|
||||
- Play Console Internal Testing : Immédiat (pas de review)
|
||||
- Play Console Production : 3-7 jours (review Google)
|
||||
|
||||
@@ -39,11 +39,13 @@ Semaine 6 : Validation finale + go/no-go production
|
||||
- [ ] `NSLocationAlwaysAndWhenInUseUsageDescription` ≤ 200 caractères
|
||||
- [ ] Pas de mention tracking/publicité
|
||||
- [ ] Mention explicite "optionnel"
|
||||
|
||||
- [ ] Vérifier `UIBackgroundModes` contient `location`
|
||||
- [ ] Build & Archive (Xcode)
|
||||
- [ ] Version : `1.0.0 (1)` (beta)
|
||||
- [ ] Bundle ID : `com.roadwave.app`
|
||||
- [ ] Signing : Distribution certificate
|
||||
|
||||
- [ ] Upload vers App Store Connect
|
||||
- [ ] Attendre processing (15-30 min)
|
||||
|
||||
@@ -55,11 +57,13 @@ Semaine 6 : Validation finale + go/no-go production
|
||||
- [ ] `ACCESS_BACKGROUND_LOCATION`
|
||||
- [ ] `FOREGROUND_SERVICE`
|
||||
- [ ] `FOREGROUND_SERVICE_LOCATION`
|
||||
|
||||
- [ ] Vérifier foreground service déclaration
|
||||
- [ ] Build AAB (Android App Bundle)
|
||||
- [ ] Version : `1.0.0 (1)`
|
||||
- [ ] Package : `com.roadwave.app`
|
||||
- [ ] Signing : Release keystore
|
||||
|
||||
- [ ] Upload vers Play Console (Internal Testing)
|
||||
|
||||
### Documentation App Store Connect
|
||||
@@ -79,10 +83,12 @@ Users can use RoadWave fully without enabling background location - they
|
||||
will simply use the "car mode" which only requires location "while using".
|
||||
|
||||
Background location is ONLY used for:
|
||||
|
||||
- Detecting proximity to audio-guide points of interest (200m radius)
|
||||
- Sending a single push notification to alert the user
|
||||
|
||||
Background location is NEVER used for:
|
||||
|
||||
- Advertising or tracking
|
||||
- Selling data to third parties
|
||||
- Analytics beyond core functionality
|
||||
@@ -116,11 +122,13 @@ notifications push géolocalisées aux utilisateurs en mode piéton (touristes
|
||||
à pied).
|
||||
|
||||
Usage précis :
|
||||
|
||||
- Geofencing radius 200m autour des points d'intérêt (monuments, musées)
|
||||
- Notification push unique lorsque l'utilisateur entre dans la zone
|
||||
- Permet découverte de contenus audio-guides sans ouvrir l'app
|
||||
|
||||
Cette fonctionnalité est OPTIONNELLE :
|
||||
|
||||
- Demandée uniquement si utilisateur active "Mode piéton" dans Settings
|
||||
- Écran explicatif affiché AVANT demande permission système
|
||||
- L'app fonctionne pleinement sans cette permission (mode voiture disponible)
|
||||
@@ -128,12 +136,14 @@ Cette fonctionnalité est OPTIONNELLE :
|
||||
Foreground service notification visible (Android 12+) lorsque geofencing actif.
|
||||
|
||||
Données de localisation :
|
||||
|
||||
- JAMAIS vendues ou partagées avec tiers
|
||||
- JAMAIS utilisées pour publicité ciblée
|
||||
- Anonymisées après 24h (conformité RGPD)
|
||||
```
|
||||
|
||||
**Vidéo démo** (requis) :
|
||||
|
||||
- [ ] Enregistrer screen recording (25-30s)
|
||||
- [ ] Montrer activation mode piéton depuis Settings
|
||||
- [ ] Montrer écran d'éducation
|
||||
@@ -157,6 +167,7 @@ Données de localisation :
|
||||
| **External 2** | 20-30 | Grand public varié | Tests UX/acceptation réelle |
|
||||
|
||||
**Configuration** :
|
||||
|
||||
- [ ] Créer groupe "Internal Testers" (accès immédiat)
|
||||
- [ ] Créer groupe "External Beta 1" (review Apple requise, 24-48h)
|
||||
- [ ] Créer groupe "External Beta 2" (après succès Beta 1)
|
||||
@@ -168,6 +179,7 @@ Données de localisation :
|
||||
**Durée** : 2-3 jours
|
||||
|
||||
**Devices** :
|
||||
|
||||
- iPhone 12 (iOS 15)
|
||||
- iPhone 13 Pro (iOS 16)
|
||||
- iPhone 14 (iOS 17)
|
||||
@@ -325,10 +337,13 @@ analytics.logEvent(
|
||||
|
||||
- Taux acceptation "When In Use" : `granted / requested`
|
||||
- Cible : >85%
|
||||
|
||||
- Taux activation mode piéton : `toggle_attempted / total_users`
|
||||
- Cible : >30%
|
||||
|
||||
- Taux acceptation "Always" : `always_granted / education_continued`
|
||||
- Cible : >40%
|
||||
|
||||
- Taux abandon education : `education_dismissed / education_shown`
|
||||
- Cible : <60%
|
||||
|
||||
@@ -355,11 +370,13 @@ Si Apple **rejette** External Beta :
|
||||
### Configuration Play Console Internal Testing
|
||||
|
||||
**Testeurs** :
|
||||
|
||||
- [ ] Ajouter emails testeurs (max 100 pour Internal Testing)
|
||||
- [ ] Créer "testers list" dans Play Console
|
||||
- [ ] Share lien installation (pas de review Google pour Internal)
|
||||
|
||||
**Devices** :
|
||||
|
||||
- Google Pixel 5 (Android 12)
|
||||
- Samsung Galaxy S21 (Android 13)
|
||||
- OnePlus 9 (Android 14)
|
||||
@@ -415,6 +432,7 @@ Then:
|
||||
### Vidéo Démo Play Store
|
||||
|
||||
**Enregistrement** :
|
||||
|
||||
- [ ] Device : Pixel 8 (Android 15, UI stock)
|
||||
- [ ] Screen recorder : Android natif (Game Toolbar)
|
||||
- [ ] Durée : 25-30s
|
||||
@@ -430,6 +448,7 @@ Then:
|
||||
6. (22-25s) Retour Settings, toggle ON confirmé
|
||||
|
||||
**Post-production** :
|
||||
|
||||
- [ ] Ajouter text overlays : "Utilisateur active mode piéton", "Écran explicatif affiché", etc.
|
||||
- [ ] Exporter MP4 < 50MB
|
||||
- [ ] Upload Play Console > Permissions > Background Location > Video demo
|
||||
@@ -462,6 +481,7 @@ Then:
|
||||
### Décision Go/No-Go Production
|
||||
|
||||
**Critères GO** (tous doivent être ✅) :
|
||||
|
||||
- [ ] Apple a approuvé External Beta TestFlight
|
||||
- [ ] Taux acceptation permission base iOS ≥ 80%
|
||||
- [ ] Taux acceptation permission base Android ≥ 80%
|
||||
@@ -488,6 +508,7 @@ Then:
|
||||
### iOS App Store
|
||||
|
||||
**Checklist soumission** :
|
||||
|
||||
- [ ] Build production uploadé (même code que TestFlight validé)
|
||||
- [ ] Version : `1.0.0 (1)`
|
||||
- [ ] Screenshots stores (5 minimum, incluant permissions flow)
|
||||
@@ -500,6 +521,7 @@ Then:
|
||||
**App Privacy (obligatoire iOS 14+)** :
|
||||
|
||||
Location Data Collection :
|
||||
|
||||
- [ ] "Precise Location" : Yes
|
||||
- [ ] Purpose : "App Functionality" + "Product Personalization"
|
||||
- [ ] Linked to user : Yes
|
||||
@@ -507,6 +529,7 @@ Location Data Collection :
|
||||
- [ ] "Coarse Location" : No
|
||||
|
||||
**Timing** :
|
||||
|
||||
- Review Apple : 24-48h (généralement)
|
||||
- Si rejet : corrections + re-soumission (24h)
|
||||
- **Total prévu** : 3-7 jours
|
||||
@@ -514,6 +537,7 @@ Location Data Collection :
|
||||
### Android Play Store
|
||||
|
||||
**Checklist soumission** :
|
||||
|
||||
- [ ] Build production (Release AAB)
|
||||
- [ ] Version : `1.0.0 (1)`
|
||||
- [ ] Screenshots (8 minimum)
|
||||
@@ -527,6 +551,7 @@ Location Data Collection :
|
||||
**Data Safety Form** :
|
||||
|
||||
Location Data :
|
||||
|
||||
- [ ] "Approximate location" : No
|
||||
- [ ] "Precise location" : Yes
|
||||
- [ ] Purpose : "App functionality" + "Personalization"
|
||||
@@ -535,6 +560,7 @@ Location Data :
|
||||
- [ ] User can request deletion : Yes
|
||||
|
||||
**Timing** :
|
||||
|
||||
- Review Google : 3-7 jours
|
||||
- Si rejet : corrections + re-soumission (1-2 jours)
|
||||
- **Total prévu** : 5-10 jours
|
||||
|
||||
Reference in New Issue
Block a user