# Plan de Validation TestFlight & Play Store

**Date** : 2026-01-31
**Auteur** : QA & Mobile Team RoadWave
**Objectif** : Valider stratégie de permissions géolocalisation pour acceptation stores
**Statut** : Prêt à exécuter

---

## Vue d'Ensemble

### Objectifs

1. **Valider acceptation Apple App Store** pour permission "Always Location"
2. **Valider acceptation Google Play Store** pour `ACCESS_BACKGROUND_LOCATION`
3. **Mesurer taux d'acceptation** utilisateurs réels (permissions progressives)
4. **Identifier bugs** flow de permissions sur différents OS/devices
5. **Optimiser textes** pour maximiser acceptation

### Timeline

```
Semaine 1  : Préparation builds + documentation stores
Semaine 2-3: Beta testing iOS (TestFlight)
Semaine 3-4: Beta testing Android (Internal Testing)
Semaine 5  : Corrections + re-soumission si nécessaire
Semaine 6  : Validation finale + go/no-go production
```

---

## Phase 1 : Préparation (Semaine 1)

### Checklist Build iOS

- [ ] **Code freeze** branche `release/testflight-permissions-v1`
- [ ] Vérifier `Info.plist` textes permissions :
  - [ ] `NSLocationWhenInUseUsageDescription` ≤ 200 caractères
  - [ ] `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)

### Checklist Build Android

- [ ] **Code freeze** même branche que iOS
- [ ] Vérifier `AndroidManifest.xml` permissions :
  - [ ] `ACCESS_FINE_LOCATION`
  - [ ] `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

**Questionnaire "Background Location"** :

**Q1** : "Why does your app use background location?"

**A1** (réponse exacte) :
```
RoadWave sends push notifications to users when they walk near tourist
audio-guides and monuments, even when the app is closed. This allows
tourists to discover local content while exploring a city on foot.

This feature is entirely optional and can be disabled in the app settings.
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
```

**Q2** : "How do users benefit from background location?"

**A2** :
```
Users walking in a city receive timely notifications about nearby cultural
content (museums, monuments, historical sites) without having to keep the
app open. This improves the tourist experience while preserving battery life
through native iOS geofencing.
```

**Screenshots à fournir** (5 minimum) :
1. Onboarding demandant permission "When In Use" uniquement
2. App fonctionnelle en mode voiture (avec permission "When In Use")
3. Settings montrant toggle "Mode piéton" désactivé
4. Écran d'éducation avant demande "Always"
5. App fonctionnelle en mode voiture après refus "Always"

### Documentation Play Console

**Déclaration Permission Background Location** :

**Justification** (max 1000 caractères) :
```
RoadWave utilise ACCESS_BACKGROUND_LOCATION uniquement pour envoyer des
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)

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
- [ ] Montrer demande permission système Android
- [ ] Montrer app fonctionnelle si refusé
- [ ] Format : MP4, 1080p portrait, < 50MB
- [ ] Upload vers Play Console (section "Permissions")

---

## Phase 2 : Beta Testing iOS (Semaine 2-3)

### Configuration TestFlight

**Groupes de testeurs** :

| Groupe | Nombre | Profil | Objectif |
|--------|--------|--------|----------|
| **Internal** | 3-5 | Équipe dev/QA | Tests rapides pre-external |
| **External 1** | 10-15 | Early adopters tech-savvy | Tests fonctionnels détaillés |
| **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)
- [ ] Activer feedback automatique TestFlight
- [ ] Préparer questionnaire post-test (Google Forms)

### Scénarios de Test (Internal)

**Durée** : 2-3 jours

**Devices** :
- iPhone 12 (iOS 15)
- iPhone 13 Pro (iOS 16)
- iPhone 14 (iOS 17)
- iPhone 15 Pro (iOS 18)

**Test Case 1 : Onboarding Fresh Install**
```
Given: App jamais installée
When: Installation depuis TestFlight
Then:
  - Écran onboarding demande permission "When In Use"
  - Texte clair et rassurant
  - Acceptation → navigation home
  - Refus → mode dégradé disponible
```

**Test Case 2 : Mode Voiture (Permission When In Use)**
```
Given: Permission "When In Use" accordée
When: Utilisation normale app pendant 1h de conduite
Then:
  - GPS actif quand app ouverte
  - Notifications géolocalisées sonores fonctionnent
  - ETA calcul correct (7s avant POI)
  - Pas de demande permission supplémentaire
```

**Test Case 3 : Activation Mode Piéton**
```
Given: App utilisée en mode voiture depuis quelques jours
When: User active toggle "Mode piéton" dans Settings
Then:
  - Écran d'éducation s'affiche AVANT demande OS
  - Texte mentionne "optionnel"
  - Tap "Continuer" → demande iOS "Allow Always"
  - Tap "Non merci" → toggle reste OFF, app fonctionnelle
```

**Test Case 4 : Mode Piéton Actif**
```
Given: Permission "Always" accordée
When: App en arrière-plan, user marche près d'un POI
Then:
  - Notification push reçue (200m du POI)
  - Tap notification → app ouvre contenu
  - Geofencing ne vide pas batterie (< 5%/h)
```

**Test Case 5 : Refus Permission Always**
```
Given: User refuse permission "Always" dans dialog iOS
When: Retour dans app
Then:
  - Message "Mode piéton non disponible"
  - Bouton "Ouvrir réglages" disponible
  - Mode voiture toujours pleinement fonctionnel
  - Pas de popup récurrent de demande permission
```

**Test Case 6 : Changement Permission dans Settings iOS**
```
Given: Permission "Always" active
When: User change dans Settings iOS → "While Using"
Then:
  - App détecte changement (AppLifecycleState)
  - Mode piéton désactivé automatiquement
  - Notification in-app : "Mode piéton désactivé (permission changée)"
  - Mode voiture reste fonctionnel
```

### Scénarios de Test (External Beta 1)

**Durée** : 1 semaine

**Instructions aux testeurs** :

```
Bienvenue sur la beta RoadWave !

Nous testons notre système de permissions géolocalisation.

Jour 1-2 : Installation & Mode Voiture
1. Installez l'app depuis TestFlight
2. Suivez l'onboarding (acceptez permission "When In Use")
3. Utilisez l'app normalement en voiture pendant 2 jours
4. Notez : bugs, crashs, notifications fonctionnent ?

Jour 3-5 : Mode Piéton (optionnel)
5. Allez dans Settings > Notifications
6. Activez "Audio-guides piéton"
7. Lisez l'écran explicatif
8. Acceptez OU refusez permission "Always" (votre choix !)
9. Testez mode piéton en marchant en ville

Jour 6-7 : Feedback
10. Répondez au questionnaire (lien ci-dessous)
11. Signalez tout bug via TestFlight feedback

Questionnaire : [lien Google Forms]
```

**Questionnaire Post-Test** (Google Forms) :

1. Avez-vous accepté permission "When In Use" au démarrage ? (Oui/Non)
2. Pourquoi ? (Texte libre)
3. Le texte de permission était-il clair ? (1-5)
4. Avez-vous essayé d'activer le mode piéton ? (Oui/Non)
5. Si oui, avez-vous accepté permission "Always" ? (Oui/Non/N'ai pas essayé)
6. Pourquoi ? (Texte libre)
7. L'écran explicatif avant permission "Always" était-il rassurant ? (1-5)
8. Si vous avez refusé "Always", l'app reste-t-elle utilisable ? (Oui/Non/N/A)
9. Bugs rencontrés ? (Texte libre)
10. Suggestions d'amélioration textes permissions ? (Texte libre)

### Métriques Collectées (Firebase Analytics)

**Events trackés** :

```dart
// Onboarding
analytics.logEvent(
  name: 'permission_when_in_use_requested',
);
analytics.logEvent(
  name: 'permission_when_in_use_granted',
  parameters: {'granted': true},
);

// Mode piéton
analytics.logEvent(
  name: 'pedestrian_mode_toggle_attempted',
);
analytics.logEvent(
  name: 'permission_education_shown',
);
analytics.logEvent(
  name: 'permission_education_continued', // User tap "Continuer"
);
analytics.logEvent(
  name: 'permission_education_dismissed', // User tap "Non merci"
);
analytics.logEvent(
  name: 'permission_always_granted',
  parameters: {'granted': true},
);

// Fallback
analytics.logEvent(
  name: 'degraded_mode_activated',
  parameters: {'reason': 'permission_denied'},
);
```

**Dashboards Firebase** :

- 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%

### Critères de Succès Beta 1

- [ ] Taux acceptation "When In Use" ≥ 80%
- [ ] Taux acceptation "Always" ≥ 35%
- [ ] 0 crash lié aux permissions
- [ ] 0 feedback "app inutilisable sans Always"
- [ ] Score satisfaction écran éducation ≥ 4/5
- [ ] **Apple approuve External Beta** (critique !)

Si Apple **rejette** External Beta :
1. Analyser raison rejet (email App Store Connect)
2. Ajuster textes `Info.plist` si problème wording
3. Ajuster flow si problème UX (ex: trop insistant)
4. Re-soumettre sous 48h
5. Itérer jusqu'à acceptation

---

## Phase 3 : Beta Testing Android (Semaine 3-4)

### 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)
- Google Pixel 8 (Android 15)

### Scénarios de Test (Focus Android)

**Test Case 1 : Foreground Service Notification (Android 12+)**
```
Given: Permission background accordée, mode piéton actif
When: App en arrière-plan avec geofencing actif
Then:
  - Notification foreground service visible dans panneau
  - Texte : "RoadWave détecte audio-guides à proximité"
  - Icône RoadWave visible
  - Tap notification → ouvre app
  - Notification ne peut pas être swipée (persistent)
```

**Test Case 2 : Permission Background Android 10+**
```
Given: Android 10, 11, 12, 13, 14, ou 15
When: Activation mode piéton
Then:
  - Écran éducation s'affiche
  - Dialog Android demande "Toujours autoriser"
  - Options : "Toujours" / "Seulement pendant utilisation" / "Refuser"
  - Selection "Toujours" → mode piéton activé
  - Selection autre → mode piéton désactivé
```

**Test Case 3 : Battery Drain**
```
Given: Mode piéton actif, app en arrière-plan
When: 4 heures d'utilisation continue (marche en ville)
Then:
  - Consommation batterie < 20% (< 5%/h)
  - Pas de "Battery draining" warning Android
  - Geofencing utilise location updates optimisés (pas de polling continu)
```

**Test Case 4 : Permission Revocation**
```
Given: Permission background accordée
When: User révoque dans Settings Android
Then:
  - App détecte changement (broadcast receiver)
  - Mode piéton désactivé automatiquement
  - Foreground service arrêté
  - Notification in-app : "Mode piéton désactivé"
```

### Vidéo Démo Play Store

**Enregistrement** :
- [ ] Device : Pixel 8 (Android 15, UI stock)
- [ ] Screen recorder : Android natif (Game Toolbar)
- [ ] Durée : 25-30s
- [ ] Orientation : Portrait
- [ ] Résolution : 1080p

**Script** (voir [permissions-strategy.md](permissions-strategy.md#vidéo-démo-play-store-script)) :
1. (0-5s) Settings > Notifications > scroll vers "Audio-guides piéton"
2. (5-8s) Toggle OFF → ON
3. (8-15s) Écran d'éducation affiché, scroll pour lire
4. (15-18s) Tap "Continuer" → demande permission Android
5. (18-22s) Tap "Toujours autoriser"
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

### Critères de Succès Android

- [ ] Foreground service notification visible et claire
- [ ] Consommation batterie acceptable (< 5%/h)
- [ ] 0 crash sur Android 10-15
- [ ] Vidéo démo uploadée et acceptée Play Console
- [ ] Déclaration permission background validée

---

## Phase 4 : Validation & Go/No-Go (Semaine 5-6)

### Analyse Résultats

**Tableau consolidé** :

| Métrique | iOS (Cible) | iOS (Réel) | Android (Cible) | Android (Réel) | Status |
|----------|-------------|-----------|-----------------|----------------|--------|
| Taux acceptation permission base | >85% | ? | >85% | ? | ? |
| Taux activation mode piéton | >30% | ? | >30% | ? | ? |
| Taux acceptation permission background | >40% | ? | >40% | ? | ? |
| Crash rate permissions | 0% | ? | 0% | ? | ? |
| Battery drain mode piéton | <5%/h | ? | <5%/h | ? | ? |
| Feedback "app inutilisable" | 0 | ? | 0 | ? | ? |

### 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%
- [ ] 0 crash critique lié aux permissions
- [ ] 0 feedback utilisateur "app inutilisable sans background permission"
- [ ] Vidéo démo Android uploadée et validée
- [ ] Battery drain mode piéton < 5%/h (iOS & Android)

**Si NO-GO** :
1. Identifier problème bloquant (cf métriques)
2. Planifier corrections (ex: rewording textes, ajustement flow)
3. Nouvelle itération beta (1-2 semaines)
4. Re-validation

**Si GO** :
1. Merge branche `release/testflight-permissions-v1` → `main`
2. Tag version `v1.0.0`
3. Préparer soumission production (Semaine 7)

---

## Phase 5 : Soumission Production (Semaine 7+)

### 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)
- [ ] Description mentionnant "mode piéton optionnel"
- [ ] Keywords : roadwave, audio, gps, tourisme, voyage
- [ ] Pricing : Gratuit
- [ ] App Privacy : Déclarer usage location (voir section)
- [ ] Submit for Review

**App Privacy (obligatoire iOS 14+)** :

Location Data Collection :
- [ ] "Precise Location" : Yes
- [ ] Purpose : "App Functionality" + "Product Personalization"
- [ ] Linked to user : Yes
- [ ] Used for tracking : No
- [ ] "Coarse Location" : No

**Timing** :
- Review Apple : 24-48h (généralement)
- Si rejet : corrections + re-soumission (24h)
- **Total prévu** : 3-7 jours

### Android Play Store

**Checklist soumission** :
- [ ] Build production (Release AAB)
- [ ] Version : `1.0.0 (1)`
- [ ] Screenshots (8 minimum)
- [ ] Description courte (80 caractères)
- [ ] Description longue (4000 caractères max)
- [ ] Catégorie : Travel & Local
- [ ] Pricing : Gratuit
- [ ] Data Safety : Déclarer usage location
- [ ] Submit for Review (Production track)

**Data Safety Form** :

Location Data :
- [ ] "Approximate location" : No
- [ ] "Precise location" : Yes
- [ ] Purpose : "App functionality" + "Personalization"
- [ ] Shared with third parties : No
- [ ] Optional : Yes (mode dégradé disponible)
- [ ] 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

---

## Contingences & Risques

### Risque 1 : Apple rejette permission "Always"

**Probabilité** : Moyenne (30%)
**Impact** : Critique (bloque production)

**Mitigation** :
1. Rewording `Info.plist` pour insister sur "optionnel"
2. Ajouter screenshots montrant app sans permission "Always"
3. Écrire email explicatif à App Review Team
4. Si blocage persistant : envisager retrait mode piéton du MVP

### Risque 2 : Taux acceptation permission trop faible

**Probabilité** : Faible (20%)
**Impact** : Modéré (feature peu utilisée)

**Mitigation** :
1. A/B testing textes écran éducation
2. Améliorer wording pour rassurer utilisateurs
3. Ajouter testimonials/reviews dans écran éducation
4. Retarder demande "Always" (demander après 1 semaine d'usage)

### Risque 3 : Battery drain trop élevé

**Probabilité** : Faible (15%)
**Impact** : Critique (rejets stores + mauvaises reviews)

**Mitigation** :
1. Optimiser geofencing radius (200m → 500m)
2. Augmenter interval updates (30s → 60s)
3. Utiliser "significant location changes" iOS au lieu de "continuous"
4. Désactiver geofencing si batterie < 20%

### Risque 4 : Crash sur anciens OS

**Probabilité** : Faible (10%)
**Impact** : Modéré (fragmentation utilisateurs)

**Mitigation** :
1. Tester sur iOS 14, Android 10 (versions minimales)
2. Fallback gracieux si API geofencing non disponible
3. Considérer min SDK Android 11 (au lieu de 10) si trop de bugs

---

## Contacts & Ressources

### Équipe

- **Mobile Lead** : Responsable builds & soumissions stores
- **QA Lead** : Coordination testeurs beta, analyse métriques
- **Product Owner** : Décision go/no-go, priorisation corrections
- **Legal/RGPD** : Validation textes permissions conformité

### Outils

- **TestFlight** : https://appstoreconnect.apple.com
- **Play Console** : https://play.google.com/console
- **Firebase Analytics** : https://console.firebase.google.com
- **Questionnaire Beta** : Google Forms (lien à créer)
- **Tracking Issues** : GitHub Issues avec label `[testflight]`

### Documentation

- [Stratégie Permissions](permissions-strategy.md)
- [ADR-010 Frontend Mobile](../adr/010-frontend-mobile.md)
- [Règle 05 Mode Piéton](../regles-metier/05-interactions-navigation.md)

---

**Plan approuvé par** : [Nom Product Owner]
**Date d'approbation** : [Date]
**Prochaine revue** : Fin Semaine 2 (après External Beta 1)
