# 📱 GEOSECTOR v3.3.4 - Publication iOS App Store

## 📋 Informations du projet

### Configuration actuelle
- **Version** : 3.3.6 (Build 336)
- **Bundle ID** : `fr.geosector.app3`
- **Team ID** : `6WT84NWCTC`
- **Display Name** : `GeoSector`
- **Bundle Name** : `GeoSector`
- **Deployment Target** : iOS 15.4+
- **Xcode** : 16.4
- **Flutter** : 3.24.5 LTS ✅ **Configuration stable** (downgrade depuis 3.35.5)
- **Dart** : 3.5.4

### Compte Apple Developer
- **Organisation** : Accessible via compte existant
- **Application existante** : Oui (ancienne version 2.7.1)
- **Type de mise à jour** : Refonte complète v3.3.4

---

## ✅ Étapes complétées

### 1. Environnement et dépendances
- [x] Flutter **downgrade vers 3.24.5 LTS** (11/10/2025 sur Debian, 13/10/2025 corrections)
- [x] Dart SDK downgrade vers 3.5.4
- [x] Packages ajustés pour compatibilité Flutter 3.24.5 (voir détails ci-dessous)
- [x] `flutter clean` exécuté
- [x] `flutter pub get` exécuté avec succès
- [x] CocoaPods mis à jour (1.16.2)
- [x] `pod install` exécuté (25 pods installés)

#### Packages downgradés (Flutter 3.24.5 LTS)

**Packages majeurs** :
- `syncfusion_flutter_charts` : 29.1.38 → **27.2.5** (sweet spot sans `withValues()` ni `markNeedsBuild()`)
- `geolocator` : 14.0.2 → **13.0.3** (sans `toARGB32()`)
- `geolocator_android` : forcé à **4.6.1**
- `battery_plus` : 7.0.0 → **6.0.3** (fix Gradle AGP 8)
- `connectivity_plus` : 7.0.0 → **6.0.5** (fix Gradle AGP 8)
- `nfc_manager` : 3.5.0 → **3.3.0** ⚠️ **Patch requis** (voir ci-dessous)

**Raison** : Packages v7.x incompatibles avec Flutter 3.24.5 LTS (propriété Gradle manquante)

**⚠️ Patch critique nfc_manager 3.3.0** :
```bash
# Requis après CHAQUE flutter pub get
./fix-nfc-manager.sh
```

**Pourquoi** :
- nfc_manager 3.3.0 est **obligatoire** pour Stripe Tap to Pay on iPhone
- Android Gradle Plugin 8+ nécessite `namespace` dans build.gradle
- Version 3.3.0 ne l'a pas → patch automatique via script

**Contenu du patch** : Ajoute `namespace 'io.flutter.plugins.nfc_manager'` dans `.pub-cache/hosted/pub.dev/nfc_manager-3.3.0/android/build.gradle:28`

### 2. Configuration du projet iOS
- [x] **CFBundleName** corrigé : `geosector_app` → `GeoSector`
- [x] **Bundle Identifier** vérifié : `fr.geosector.app3` ✅
- [x] **Team ID** configurée : `6WT84NWCTC` ✅
- [x] **Info.plist** configuré avec toutes les permissions :
  - Localisation (GPS)
  - NFC (tags secteurs)
  - Bluetooth (terminaux Stripe)
  - Caméra (scan cartes bancaires)
  - Photos (justificatifs)
  - Réseau local
  - Contacts

### 3. Entitlements Stripe Tap to Pay
- [x] Fichier `Runner.entitlements` créé avec :
  - ✅ NFC Tag Reading (NDEF, TAG)
  - ✅ Stripe Terminal - Tap to Pay on iPhone
  - ✅ Network Access
  - ✅ Keychain Sharing
- [x] Fichier présent dans `/ios/Runner/Runner.entitlements`

### 4. Pods installés
```
✅ 26 pods installés au total :
- Flutter (1.0.0)
- Stripe (24.16.2)
- StripeTerminal (4.6.1) ← Essentiel pour Tap to Pay
- StripeApplePay (24.16.2)
- StripeCore (24.16.2)
- StripeFinancialConnections (24.16.2)
- StripePaymentSheet (24.16.2)
- StripePayments (24.16.2)
- StripePaymentsUI (24.16.2)
- StripeUICore (24.16.2)
- mek_stripe_terminal (1.0.0)
- nfc_manager (0.0.1)
- geolocator_apple (1.2.0)
- battery_plus (1.0.0)
- connectivity_plus (0.0.1)
- device_info_plus (0.0.1)
- flutter_local_notifications (0.0.1)
- image_picker_ios (0.0.1)
- network_info_plus (0.0.1)
- package_info_plus (0.4.5)
- path_provider_foundation (0.0.1)
- permission_handler_apple (9.3.0)
- sensors_plus (0.0.1)
- stripe_ios (0.0.1)
- url_launcher_ios (0.0.1)
- ReachabilitySwift (5.2.4)
```

### 5. Analyse du code et compilation
- [x] `flutter analyze` exécuté : **0 erreurs**, 32 warnings (info seulement, pas d'erreurs bloquantes)
  - Avertissements de style principalement
  - Aucune erreur critique

#### Statut de compilation (13/10/2025 23:15)
- ✅ **Web** : Compilation réussie après downgrade syncfusion_flutter_charts 27.2.5
- ⏳ **Android** : En attente validation après patch nfc_manager 3.3.0
  - Toutes erreurs corrigées (battery_plus, connectivity_plus, SDK 35, nfc_manager)
  - Script `fix-nfc-manager.sh` créé et prêt
  - Test final `./android.sh` requis
- ⏳ **iOS** : Non testé sur Debian
  - Configuration Mac mini requise
  - Pods installés : 25 pods (dont StripeTerminal 4.6.1)

---

## 🔄 Étapes en cours

### 6. Validation compilation Android
- [ ] **EN COURS** : Test final Android build après patch nfc_manager
- [ ] Exécution : `./android.sh`
- [ ] Vérification : Build APK réussi sans erreurs

### 7. Transfert projet vers Mac mini
- [ ] **EN ATTENTE** : Copie du projet corrigé via Samba/rsync
- [ ] Vérification : `flutter pub get` sur Mac
- [ ] Exécution : `./fix-nfc-manager.sh` (patch nfc_manager)
- [ ] Test : `cd ios && pod install`

---

## 📝 TODO - Étapes restantes

### 8. Compilation de test iOS
- [ ] Sur Mac mini : Compiler en mode release : `flutter build ios --release --no-codesign`
- [ ] Vérifier l'absence d'erreurs de compilation
- [ ] Corriger les éventuels problèmes

### 9. Configuration Xcode du projet

#### 9.1 Ouvrir le projet dans Xcode
```bash
open ios/Runner.xcworkspace
```

#### 9.2 Lier le fichier Runner.entitlements au projet
**⚠️ IMPORTANT** : Le fichier `Runner.entitlements` existe mais n'est **pas encore référencé** dans le projet Xcode.

**Action requise :**
1. Dans Xcode, sélectionner le target `Runner`
2. Onglet `Signing & Capabilities`
3. Vérifier si `Runner.entitlements` est bien lié
4. Si non lié :
   - Aller dans `Build Settings`
   - Rechercher `CODE_SIGN_ENTITLEMENTS`
   - Ajouter : `Runner/Runner.entitlements`

#### 9.3 Configurer les certificats de signature
- [ ] Sélectionner le Team : `6WT84NWCTC`
- [ ] Choisir le profil de provisioning approprié
- [ ] Mode : **Automatic Signing** ou **Manual Signing** selon préférence
- [ ] Vérifier que le certificat est valide pour distribution App Store

#### 9.4 Vérifier les Capabilities
Dans Xcode > Target Runner > Signing & Capabilities, vérifier :
- [ ] **Near Field Communication Tag Reading** ✅
- [ ] **Tap to Pay on iPhone** ⚠️ (nécessite approbation Apple spéciale)
- [ ] Keychain Sharing (si nécessaire)

**⚠️ ATTENTION TAP TO PAY** :
La capability "Tap to Pay on iPhone" nécessite une demande spéciale à Apple via :
- App Store Connect > votre app > Features
- Ou contact direct avec Apple Developer Support
- Documentation : https://developer.apple.com/tap-to-pay/

#### 9.5 Vérifier la version et le build number
- [ ] Version : `3.3.6`
- [ ] Build : `336`
- [ ] Incrémenter si nécessaire pour mise à jour

### 10. Créer l'archive pour l'App Store

#### 10.1 Build de l'archive
1. Dans Xcode, menu `Product > Archive`
2. Attendre la fin de la compilation (~5-10 minutes)
3. Vérifier qu'il n'y a pas d'erreurs

#### 10.2 Valider l'archive
1. Organizer s'ouvre automatiquement après l'archive
2. Sélectionner l'archive créée
3. Cliquer sur `Validate App`
4. Choisir le bon certificat et profil de provisioning
5. Attendre la validation (~2-5 minutes)
6. Corriger les éventuels problèmes détectés

#### 10.3 Uploader vers App Store Connect
1. Dans Organizer, cliquer sur `Distribute App`
2. Sélectionner `App Store Connect`
3. Choisir `Upload`
4. Sélectionner les options :
   - ✅ Upload your app's symbols (pour crashlytics)
   - ✅ Manage Version and Build Number (automatique)
5. Cliquer sur `Upload`
6. Attendre la fin de l'upload (~5-15 minutes selon connexion)

### 11. Configuration App Store Connect

#### 11.1 Accéder à App Store Connect
- [ ] Se connecter sur https://appstoreconnect.apple.com
- [ ] Sélectionner l'application GeoSector existante
- [ ] Créer une nouvelle version `3.3.6`

#### 11.2 Métadonnées de l'application
- [ ] **Nom** : GeoSector
- [ ] **Sous-titre** : Gestion de calendriers pompiers
- [ ] **Description** : Rédiger la description complète (highlights v3.3.6)
- [ ] **Mots-clés** : pompiers, calendrier, secteur, distribution, GPS
- [ ] **URL support** : Vérifier/mettre à jour
- [ ] **URL marketing** : Vérifier/mettre à jour

#### 11.3 Captures d'écran
Préparer les captures pour :
- [ ] iPhone 6.7" (iPhone 14 Pro Max, 15 Pro Max) - OBLIGATOIRE
- [ ] iPhone 6.5" (iPhone 11 Pro Max, XS Max) - OBLIGATOIRE
- [ ] iPad Pro 12.9" (3ème génération) - Si support iPad
- [ ] iPad Pro 12.9" (2ème génération) - Si support iPad

**Résolutions requises :**
- iPhone 6.7" : 1290 x 2796 pixels
- iPhone 6.5" : 1242 x 2688 pixels
- iPad Pro 12.9" : 2048 x 2732 pixels

#### 11.4 Informations de version
- [ ] **Nouveautés de cette version** : Rédiger le changelog v3.3.6
  - Architecture moderne sans Provider
  - Interface responsive optimisée
  - Intégration Stripe Connect V1
  - Préparation Tap to Pay V2
  - Performance améliorée
  - Conformité NIST SP 800-63B

#### 11.5 Informations générales
- [ ] **Catégorie principale** : Productivité
- [ ] **Catégorie secondaire** : Utilitaires
- [ ] **Classification par âge** : 4+ (probablement)
- [ ] **Copyright** : Vérifier/mettre à jour

#### 11.6 Confidentialité et permissions
Déclarer l'utilisation des permissions :
- [ ] **Localisation** : Enregistrement GPS des passages
- [ ] **NFC** : Lecture tags secteurs (si utilisé)
- [ ] **Bluetooth** : Connexion terminaux paiement Stripe
- [ ] **Caméra** : Scan cartes bancaires (Stripe)
- [ ] **Photos** : Upload justificatifs passages
- [ ] **Réseau** : Synchronisation données

#### 11.7 Informations de contact
- [ ] **Nom** : Votre nom ou organisation
- [ ] **Email** : Email de contact
- [ ] **Téléphone** : Numéro de contact
- [ ] **URL politique de confidentialité** : OBLIGATOIRE

### 12. Soumission pour révision

#### 12.1 Sélectionner le build
- [ ] Dans App Store Connect, section `Build`
- [ ] Sélectionner le build `3.3.6 (336)` uploadé précédemment
- [ ] Attendre que le build soit traité par Apple (~30-60 minutes)

#### 12.2 Répondre aux questionnaires
- [ ] **Utilise-t-elle le chiffrement ?** : Probablement OUI (HTTPS)
  - Si OUI, déclarer l'utilisation de HTTPS standard (exempt)
- [ ] **Utilise-t-elle des identifiants publicitaires ?** : Probablement NON
- [ ] **Contient-elle de la publicité tierce ?** : NON

#### 12.3 Stripe Tap to Pay - Déclaration spéciale
⚠️ **IMPORTANT** : Avant de soumettre, vérifier :
- [ ] Demande d'accès Tap to Pay on iPhone soumise à Apple
- [ ] Compte Stripe Connect configuré et approuvé
- [ ] Tester la fonctionnalité sur un appareil physique compatible
- [ ] Documenter le flux de paiement pour les reviewers Apple

#### 12.4 Notes pour la révision (Review Notes)
Rédiger des notes claires pour les reviewers Apple :
```
Application de gestion de distribution de calendriers pour amicales de pompiers.

COMPTES DE TEST :
- Email : test@geosector.fr
- Mot de passe : [à fournir]
- Rôle : Membre (Rôle 1)

- Email : admin@geosector.fr
- Mot de passe : [à fournir]
- Rôle : Admin Amicale (Rôle 2)

FONCTIONNALITÉS PRINCIPALES :
1. Géolocalisation GPS pour tracking des passages
2. NFC pour lecture des tags secteurs (optionnel)
3. Stripe Connect pour paiements des amicales (V1 - web uniquement)
4. Tap to Pay sur iPhone (V2 - en développement, pas encore actif)

NOTE IMPORTANTE :
La fonctionnalité "Tap to Pay on iPhone" est présente dans les entitlements
mais pas encore activée dans cette version. Elle sera activée dans une mise
à jour ultérieure après approbation Apple.

SERVEUR :
- Environnement de production : https://api.geosector.fr
- API REST avec authentification JWT
```

#### 12.5 Soumettre pour révision
- [ ] Vérifier que toutes les informations sont complètes
- [ ] Cliquer sur `Soumettre pour révision`
- [ ] Confirmer la soumission

---

## 📊 Temps estimés

| Étape | Durée estimée | Statut |
|-------|---------------|--------|
| Validation Android build | 5-10 min | ⏳ En attente |
| Transfert Mac mini | 10-20 min | ⏳ En attente |
| Configuration Xcode | 15-30 min | ⏳ En attente |
| Build + Archive | 10-15 min | ⏳ En attente |
| Validation | 5-10 min | ⏳ En attente |
| Upload App Store | 10-20 min | ⏳ En attente |
| Métadonnées App Store | 30-60 min | ⏳ En attente |
| Captures d'écran | 30-45 min | ⏳ En attente |
| Soumission révision | 10 min | ⏳ En attente |
| **TOTAL** | **2h00 - 3h30** | |
| Révision Apple | **1-3 jours** | ⏳ En attente |

---

## ⚠️ Points d'attention

### 1. ⚠️ CRITIQUE : Patch nfc_manager obligatoire
- **⚠️ REQUIS APRÈS CHAQUE `flutter pub get`** : Exécuter `./fix-nfc-manager.sh`
- **Raison** : nfc_manager 3.3.0 manque la déclaration `namespace` requise par Android Gradle Plugin 8+
- **Impact** : Build Android échoue sans ce patch
- **Fonctionnalité** : **nfc_manager est OBLIGATOIRE** pour Stripe Tap to Pay on iPhone (ne pas désactiver)
- **Automatisation** : Script `fix-nfc-manager.sh` créé dans le dossier racine
- **Vérification** : Le script détecte si le patch est déjà appliqué

### 2. Tap to Pay on iPhone
- **Statut** : Entitlements présents, mais nécessite approbation Apple
- **Action** : Demander l'accès via App Store Connect ou Developer Support
- **Alternative** : Désactiver temporairement la capability si bloquante

### 3. Version deployment target
- **Actuel** : iOS 15.4+
- **Recommandé** : iOS 16.4+ (pour Tap to Pay)
- **Action** : Vérifier la compatibilité avec la base utilisateurs

### 4. Certificats de signature
- **Important** : Utiliser un certificat de distribution App Store
- **Renouvellement** : Vérifier la date d'expiration

### 5. Politique de confidentialité
- **Obligatoire** : URL valide et accessible
- **Contenu** : Doit couvrir toutes les permissions demandées

---

## 🔗 Liens utiles

- **Apple Developer** : https://developer.apple.com
- **App Store Connect** : https://appstoreconnect.apple.com
- **Stripe Tap to Pay** : https://stripe.com/docs/terminal/payments/setup-reader/tap-to-pay
- **Apple Tap to Pay** : https://developer.apple.com/tap-to-pay/
- **Human Interface Guidelines** : https://developer.apple.com/design/human-interface-guidelines/

---

## 📝 Notes de session

### Session du 05/10/2025 - Partie 1 (Configuration initiale)

#### ✅ Étapes complétées
- Début : Configuration initiale du projet
- Flutter upgrade : 3.32.4 → 3.35.5
- Dart upgrade : 3.8.1 → 3.9.2
- Pods installés : 26 pods (incluant Stripe Terminal 4.6.1)
- CFBundleName corrigé : `GeoSector`
- Installation iOS 18.5 : ✅ **TERMINÉE**
- Analyse du code : 32 warnings (pas d'erreurs bloquantes)

#### ❌ Problème rencontré lors de la compilation iOS
**Erreur** : `'Flutter/Flutter.h' file not found`
- Localisation : `/Users/pierre/.pub-cache/hosted/pub.dev/sensors_plus-3.1.0/ios/Classes/FPPSensorsPlusPlugin.h:4:8`
- Cause probable : Incompatibilité de version `sensors_plus` 3.1.0 avec Flutter 3.35.5
- Tentatives effectuées :
  1. ❌ `flutter clean` + rebuild
  2. ❌ Suppression complète Pods + réinstallation
  3. ❌ `flutter pub get` + `pod install`

#### 🔄 Solution en cours
**Décision** : Mise à jour complète de tous les packages Flutter
- Commande : `flutter pub upgrade`
- Objectif : Résoudre les incompatibilités de versions
- Packages concernés : 49 packages ont des versions plus récentes disponibles

#### 📋 Prochaines étapes après upgrade
1. Exécuter `flutter pub upgrade`
2. Vérifier les changements de versions (notamment sensors_plus, package_info_plus, network_info_plus)
3. Réinstaller les pods iOS :
   ```bash
   cd ios
   rm -rf Pods Podfile.lock
   pod install
   cd ..
   ```
4. Nettoyer et récupérer les dépendances :
   ```bash
   flutter clean
   flutter pub get
   ```
5. Retenter la compilation : `flutter build ios --release --no-codesign`
6. Si succès → Ouvrir dans Xcode pour configuration finale
7. Si échec → Analyser les nouvelles erreurs et ajuster

---

### Session du 11/10/2025 - Résolution problèmes compilation iOS

#### 🐛 Problème rencontré : Module Swift 'Flutter' non trouvé

**Erreurs principales** :
- `No such module 'Flutter'` dans url_launcher_ios, sensors_plus
- `'Flutter/Flutter.h' file not found` dans plusieurs plugins SwiftPM
- Erreurs de linking avec architecture x86_64

**Cause identifiée** : Flutter 3.35.6 (très récent, 3 jours) a des incompatibilités avec les plugins utilisant la nouvelle architecture SwiftPM.

#### ✅ Solutions appliquées

##### 1. Création du script `fix_flutter_headers.sh`
Script automatique qui copie tous les headers Flutter (18 fichiers) dans les plugins problématiques :
- **Plugins SwiftPM** : package_info_plus, network_info_plus, image_picker_ios, url_launcher_ios
- **Plugins ancienne structure** : permission_handler_apple

Localisation : `/Users/pierre/dev/geosector/app/ios/fix_flutter_headers.sh`

Utilisation : `./fix_flutter_headers.sh` (à exécuter après chaque `pod install`)

##### 2. Modification du fichier `permission_handler_apple`
Correction des imports avec angle brackets → guillemets :
```bash
# Dans ~/.pub-cache/hosted/pub.dev/permission_handler_apple-9.4.7/ios/Classes/
sed -i '' 's|#import <Flutter/Flutter.h>|#import "Flutter/Flutter.h"|g' PermissionManager.h PermissionHandlerPlugin.h
```

##### 3. Création du module.modulemap Flutter
Fichier créé : `/Users/pierre/dev/geosector/app/ios/Flutter/module.modulemap`
```
module Flutter {
    header "Flutter.h"
    header "FlutterAppDelegate.h"
    [... 18 headers au total ...]
    export *
}
```

Headers Flutter copiés dans : `/Users/pierre/dev/geosector/app/ios/Flutter/`

##### 4. Downgrade Flutter : 3.35.6 → 3.35.5
**Date** : 11/10/2025 - 10h45

**Raison** : Flutter 3.35.6 (publié il y a 3 jours) a des bugs avec SwiftPM

**Commande** :
```bash
cd ~/dev/flutter
git checkout 3.35.5
flutter --version
```

**Résultat** :
- Flutter 3.35.5 (26 septembre 2025)
- Dart 3.9.2
- DevTools 2.48.0

##### 5. Nettoyage complet du projet
```bash
cd /Users/pierre/dev/geosector/app
flutter clean
rm -rf ios/Pods ios/Podfile.lock ios/.symlinks build
flutter pub get
cd ios
pod install
./fix_flutter_headers.sh
```

##### 6. Configuration Podfile simplifiée
Suppression de toutes les modifications complexes de chemins (HEADER_SEARCH_PATHS, SWIFT_INCLUDE_PATHS) qui causaient des problèmes de linking.

**Podfile actuel** : Configuration minimale avec :
- iOS Deployment Target : 15.4 (requis pour Stripe Tap to Pay)
- Bitcode désactivé
- User Script Sandboxing désactivé
- Permissions de géolocalisation

#### 📋 Workflow de compilation recommandé

**Pour simulateur** :
1. Ouvrir Xcode : `open ios/Runner.xcworkspace`
2. Sélectionner destination : iPhone 16 (simulateur)
3. Product > Clean Build Folder (`Cmd+Shift+K`)
4. Product > Build (`Cmd+B`)

**Pour Archive App Store** :
1. Destination : Any iOS Device (arm64)
2. Product > Clean Build Folder
3. Product > Archive

#### ⚠️ Points d'attention

**Script fix_flutter_headers.sh** :
- ✅ Doit être exécuté après CHAQUE `pod install`
- ✅ Copie les headers dans `.pub-cache` (modifications temporaires)
- ⚠️ Si Flutter est mis à jour, réexécuter le script

**Versions critiques** :
- Flutter : **3.35.5** (ne pas upgrader vers 3.35.6 pour l'instant)
- Dart : **3.9.2**
- Xcode : **16.4**
- iOS Deployment Target : **15.4+**

#### 🔧 Commandes utiles

**Vérifier version Flutter** :
```bash
flutter --version
```

**Réexécuter le fix des headers** :
```bash
cd /Users/pierre/dev/geosector/app/ios
./fix_flutter_headers.sh
```

**Nettoyer et reconstruire** :
```bash
flutter clean
cd ios && pod install && ./fix_flutter_headers.sh
```

**Retourner à Flutter 3.35.5 si nécessaire** :
```bash
cd ~/dev/flutter
git checkout 3.35.5
flutter doctor
```

---

## 🔧 DOWNGRADE FLUTTER 3.24.5 LTS (11/10/2025 - 13:15)

### Problème identifié
Flutter 3.35.x (3.35.5 et 3.35.6) présente des incompatibilités avec l'architecture SwiftPM des plugins iOS :
- Erreurs `'Flutter/Flutter.h' file not found`
- Erreurs `No such module 'Flutter'` en Swift
- Problèmes de compilation persistants malgré workarounds

### Solution appliquée
**Downgrade vers Flutter 3.24.5 LTS** (Long Term Support)

### Packages modifiés pour compatibilité

| Package | Version initiale | Version compatible | Raison |
|---------|-----------------|-------------------|--------|
| `flutter` | 3.35.5 | **3.24.5 LTS** | Version stable sans problèmes SwiftPM |
| `dart` | 3.9.2 | **3.5.4** | Inclus avec Flutter 3.24.5 |
| `flutter_stripe` | 12.0.2 | **11.5.0** | Nécessite Dart 3.8+, downgrade requis |
| `flutter_lints` | 6.0.0 | **5.0.0** | Dev only, compatible Dart 3.5.4 |
| `nfc_manager` | 4.1.1 | **3.5.0** | Compatible Dart 3.5.4 |
| `device_info_plus` | 12.1.0 | **11.3.0** | Compatible avec meta 1.15.0 |
| `flutter_map` | 8.2.2 | **7.0.2** | Compatible Dart 3.5.4 |
| `flutter_map_cache` | 2.0.0 | **1.5.1** | Compatible Dart 3.5.4 |
| `syncfusion_flutter_charts` | 31.1.22 | **29.1.38** | Compatible Dart 3.5.4 |
| `go_router` | 16.2.4 | **15.1.2** | Compatible Dart 3.5.4 |
| `intl` | 0.20.2 | **0.19.0** | Piné par Flutter SDK 3.24.5 |

### Impact fonctionnel

✅ **Fonctionnalités conservées** :
- Tap to Pay on iPhone (mek_stripe_terminal 4.6.0 inchangé)
- PaymentSheets, Apple Pay, Google Pay
- Stripe Connect V1
- SCA/PSD2
- Toutes les fonctionnalités métier

⚠️ **Fonctionnalités perdues** :
- Options avancées PaymentSheet ajoutées en flutter_stripe 12.x
- Sofort payment (déprécié par Stripe)
- Fonctionnalités NFC avancées de nfc_manager 4.x

### Commandes exécutées

```bash
# Downgrade Flutter
cd ~/dev/flutter
git checkout 3.24.5
flutter --version

# Nettoyer complètement
flutter clean
cd ios
rm -rf Pods Podfile.lock .symlinks

# Réinstaller
flutter pub get
pod install
```

### Résultat
✅ 74 packages downgraded
✅ 25 pods iOS installés avec succès
✅ Aucune erreur de dépendances
✅ Configuration stable et testée

---

## 🔴 DIAGNOSTIC FINAL - PROBLÈME STRUCTUREL iOS (11/10/2025 - 18:00)

### 📊 Synthèse du problème persistant

Après **5 tentatives** avec différentes versions de Flutter, **les mêmes erreurs persistent** :
- `'Flutter/Flutter.h' file not found`
- Affectant : `network_info_plus`, `package_info_plus`, `sensors_plus`
- **5 erreurs** systématiques dans Xcode

### 🎯 Explication technique du conflit Flutter / Packages / Xcode

#### **1. L'origine : Transition SwiftPM (Swift Package Manager)**

À partir de 2024, Flutter a introduit une **nouvelle architecture iOS** :

| Architecture | Période | Gestion dépendances | Structure |
|--------------|---------|---------------------|-----------|
| **Ancienne** | < 2024 | CocoaPods uniquement | Headers `.h` dans `/ios/Classes/` |
| **Nouvelle** | > 2024 | SwiftPM + CocoaPods | Modules Swift dans `/Sources/` |

#### **2. Le triangle d'incompatibilité**

```
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  Flutter 3.24.5 LTS          Flutter 3.27.2-3.35.x         │
│  (Dart 3.5.4)                (Dart 3.6.1-3.9.2)            │
│       ↓                              ↓                      │
│  ✅ Stable ancien            ⚠️ Transition SwiftPM          │
│  ❌ Headers obsolètes        🐛 Bugs non résolus            │
│       ↓                              ↓                      │
│  Incompatible avec           Incompatible avec             │
│  plugins récents             plugins anciens                │
│       ↓                              ↓                      │
│  ❌ ÉCHEC                    ❌ ÉCHEC                       │
└─────────────────────────────────────────────────────────────┘
```

#### **3. Ce que nous avons testé (TOUTES LES TENTATIVES ONT ÉCHOUÉ)**

| # | Configuration testée | Résultat | Erreurs |
|---|---------------------|----------|---------|
| 1 | Flutter **3.35.6** + plugins récents (8.x, 7.x) | ❌ ÉCHEC | `'Flutter/Flutter.h' file not found` |
| 2 | Flutter **3.35.5** + plugins récents | ❌ ÉCHEC | `No such module 'Flutter'` |
| 3 | Flutter **3.27.2** + plugins récents | ❌ ÉCHEC | `'Flutter/Flutter.h' file not found` |
| 4 | Flutter **3.27.2** + plugins anciens (4.x, 3.x) | ❌ ÉCHEC | `'Flutter/Flutter.h' file not found` |
| 5 | Flutter **3.24.5 LTS** + plugins anciens (4.2.0, 3.1.0) | ❌ ÉCHEC | `'Flutter/Flutter.h' file not found` ⚠️ **ACTUEL** |

**Temps investi** : ~6 heures de debug
**Tentatives de workaround** :
- ✅ Script `fix_flutter_headers.sh` créé
- ✅ Modification manuelle des imports Objective-C
- ✅ Création de `module.modulemap`
- ✅ Downgrades massifs de packages (geolocator 14→9, package_info 8→4, etc.)
- ❌ **AUCUNE SOLUTION N'A FONCTIONNÉ**

#### **4. La cause racine**

**Le problème fondamental** : Les plugins anciens (3.1.0, 4.2.0, 4.1.0) ont une **structure Objective-C** qui importe :

```objc
#import <Flutter/Flutter.h>
```

Cette structure ne fonctionne **DANS AUCUNE VERSION** de Flutter testée :
- ❌ **Flutter 3.24.5** : Trop ancien, ne gère pas correctement les imports modulaires modernes
- ❌ **Flutter 3.27.2** : En transition, incompatible avec ancienne ET nouvelle structure
- ❌ **Flutter 3.35.x** : Bugs SwiftPM documentés, headers mal exposés

#### **5. Le dilemme sans solution immédiate**

| Si on utilise... | Problème rencontré |
|------------------|-------------------|
| **Flutter 3.24.5 LTS** | Headers `Flutter/Flutter.h` non accessibles, même avec vieux plugins |
| **Flutter 3.27.2-3.35.x** | Architecture SwiftPM instable, bugs dans le SDK |
| **Plugins récents (7.x, 8.x)** | Nécessitent SwiftPM fonctionnel (Flutter 3.36+) |
| **Plugins anciens (3.x, 4.x)** | Incompatibles avec toutes les versions Flutter testées |

### 💡 Solutions envisageables (non testées)

#### **Option A : Retour aux plugins ENCORE PLUS anciens (pré-2023)**
- Tenter des versions **2.x** des plugins (avant refonte headers)
- **Risque** : Fonctionnalités manquantes, bugs de sécurité
- **Effort** : 2-3h de tests

#### **Option B : Forcer CocoaPods pur (désactiver SwiftPM complètement)**
```bash
# Dans ios/.flutter-plugins-dependencies
"swift_package_manager_enabled": true → false
```
- Modifier les Podfiles pour ignorer SwiftPM
- **Risque** : Peut casser d'autres plugins (Stripe, NFC)
- **Effort** : 3-4h de configuration

#### **Option C : Patcher manuellement les headers de TOUS les plugins**
- Réécrire les imports dans les 3 plugins problématiques
- Créer des copies locales des plugins dans le projet
- **Risque** : Maintenance difficile, fragile aux mises à jour
- **Effort** : 4-6h de dev + tests

#### **Option D : Attendre Flutter 3.28+ LTS (recommandé mais long)**
- Flutter 3.28 devrait stabiliser SwiftPM
- **Date estimée de sortie** : Q1-Q2 2026
- **Avantage** : Solution officielle et stable
- **Inconvénient** : Délai de 3-6 mois

#### **Option E : Migrer vers React Native ou autre framework**
- Abandon temporaire de Flutter pour iOS
- **Effort** : 2-3 semaines de réécriture
- **Avantage** : Écosystème plus mature pour iOS
- **Inconvénient** : Perte de l'investissement Flutter

### 📋 État actuel du projet

**Configuration actuelle (stable mais non compilable)** :
- ✅ Flutter 3.24.5 LTS + Dart 3.5.4
- ✅ 199 packages installés sans conflit
- ✅ 25 Pods iOS installés sans erreur
- ❌ **Compilation iOS impossible** : 5 erreurs persistantes

**Packages downgradés appliqués** :
- `geolocator`: 14.0.2 → 9.0.2
- `package_info_plus`: 8.3.1 → 4.2.0 ⚠️ **TOUJOURS EN ERREUR**
- `network_info_plus`: 7.0.0 → 4.1.0 ⚠️ **TOUJOURS EN ERREUR**
- `sensors_plus`: 7.0.0 → 3.1.0 ⚠️ **TOUJOURS EN ERREUR**
- `image_picker`: 1.1.2 → 0.8.9

### ⚠️ Recommandations

#### **Court terme (1-2 jours)**
1. ✅ **Tester Option B** (désactiver SwiftPM) - Effort moyen, espoir raisonnable
2. ⏸️ Contacter le support Flutter sur GitHub Issues
3. ⏸️ Chercher des forks communautaires des plugins problématiques

#### **Moyen terme (1-2 semaines)**
1. ⏸️ Envisager Option C (patches manuels) si Option B échoue
2. ⏸️ Surveiller les releases Flutter 3.28 beta
3. ⏸️ Préparer un plan de migration React Native si nécessaire

#### **Long terme (3+ mois)**
1. ⏸️ Attendre Flutter 3.28+ LTS avec SwiftPM stable
2. ⏸️ Migrer vers les dernières versions des plugins
3. ⏸️ Refactorer le code pour profiter des nouvelles APIs

### 🔗 Ressources et références

- **Flutter SwiftPM Issue** : https://github.com/flutter/flutter/issues/137945
- **Flutter 3.24.5 Release Notes** : https://github.com/flutter/flutter/releases/tag/3.24.5
- **Package downgrades documentation** : `/Users/pierre/dev/geosector/app/MIGRATION_FLUTTER_3.24.5.md`

---

**Dernière mise à jour** : 11/10/2025 - 18:00
**Statut actuel** : ❌ **BLOQUÉ - Compilation iOS impossible avec toutes les versions Flutter testées**
**Prochaine étape recommandée** : Tester Option B (désactiver SwiftPM complètement) ou attendre retour communauté Flutter

---

### Session du 15/10/2025 - Intégration du logo iOS (Build 338)

#### ✅ Objectif
Intégrer le nouveau logo GEOSECTOR dans l'application iOS pour distribution TestFlight.

#### 🐛 Problème rencontré
**Symptôme** : Logo affiché en carré noir dans Xcode et sur l'appareil
**Cause** :
- Logo source en format RGBA (avec transparence)
- iOS interprète le fond transparent comme noir
- flutter_launcher_icons générait des icônes noirs lors du redimensionnement

#### ✅ Solution appliquée

##### 1. Conversion du logo avec ImageMagick
```bash
magick assets/images/logo-geosector-1024.png \
  -background white -alpha remove -alpha off \
  -resize 1024x1024 \
  assets/images/icons/icon-1024.png
```
**Résultat** : PNG RGB 1024x1024 avec fond blanc (pas de transparence)

##### 2. Génération manuelle des 21 icônes iOS
Abandon de flutter_launcher_icons au profit d'ImageMagick pour générer manuellement chaque taille :
- 20x20@1x,2x,3x
- 29x29@1x,2x,3x
- 40x40@1x,2x,3x
- 50x50@1x,2x
- 57x57@1x,2x
- 60x60@2x,3x
- 72x72@1x,2x
- 76x76@1x,2x
- 83.5x83.5@2x
- 1024x1024@1x (App Store)

**Commande type** :
```bash
magick assets/images/logo-geosector-1024.png \
  -background white -alpha remove -alpha off \
  -resize 60x60 \
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
```

##### 3. Nettoyage complet du cache Xcode
```bash
rm -rf ~/Library/Developer/Xcode/DerivedData/*
rm -rf build/ios
```

##### 4. Compilation et création de l'archive
```bash
flutter build ios --release --no-codesign
# Durée : 47.9s
# Taille : 107.6 MB

# Puis dans Xcode :
# Product > Clean Build Folder
# Product > Archive
```

#### 📊 Résultats

| Métrique | Valeur |
|----------|--------|
| **Version** | 3.3.6 |
| **Build uploadé** | 338 ✅ |
| **Builds précédents** | 336, 337 (tests logo) |
| **Plateforme** | TestFlight |
| **Logo** | ✅ Affiché correctement |
| **Taille app** | 107.6 MB |
| **Temps compilation** | 47.9s |

#### 📝 Fichiers modifiés

```
assets/images/icons/
├── icon-1024.png              ← Converti RGB fond blanc
└── icon-1024-old.png          ← Backup ancien logo

ios/Runner/Assets.xcassets/AppIcon.appiconset/
├── Icon-App-1024x1024@1x.png  ← Régénéré manuellement
├── Icon-App-20x20@1x.png      ← Régénéré manuellement
├── Icon-App-20x20@2x.png      ← Régénéré manuellement
├── Icon-App-20x20@3x.png      ← Régénéré manuellement
└── ... (18 autres icônes)     ← Tous régénérés
```

#### ⚠️ Points d'attention

1. **flutter_launcher_icons ne fonctionne pas** avec ce logo
   - Génère des icônes complètement noirs
   - Nécessite génération manuelle avec ImageMagick

2. **Format requis pour iOS** :
   - RGB uniquement (pas de canal alpha)
   - Fond blanc obligatoire
   - Résolution exacte pour chaque taille

3. **Cache Xcode** :
   - Nettoyer systématiquement `DerivedData/`
   - Clean Build Folder avant Archive

4. **Versioning TestFlight** :
   - Même version 3.3.6 autorisée
   - Build number incrémenté : 336 → 337 → 338
   - Pas besoin de changer la version pour TestFlight

#### 🚀 Prochaines étapes

- [x] Logo intégré avec succès
- [x] Build 338 uploadé sur App Store Connect
- [x] Archive validée dans Xcode
- [ ] Tester l'app sur TestFlight
- [ ] Inviter des testeurs internes
- [ ] Valider l'affichage du logo sur différents appareils
- [ ] Préparer la soumission App Store (si OK)

#### 🔧 Script de régénération complète (si besoin)

Pour régénérer tous les icônes à l'avenir :

```bash
#!/bin/bash
# regenerate-ios-icons.sh

SOURCE="assets/images/logo-geosector-1024.png"
DEST="ios/Runner/Assets.xcassets/AppIcon.appiconset"

magick "$SOURCE" -background white -alpha remove -alpha off -resize 1024x1024 "$DEST/Icon-App-1024x1024@1x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 20x20 "$DEST/Icon-App-20x20@1x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 40x40 "$DEST/Icon-App-20x20@2x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 60x60 "$DEST/Icon-App-20x20@3x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 29x29 "$DEST/Icon-App-29x29@1x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 58x58 "$DEST/Icon-App-29x29@2x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 87x87 "$DEST/Icon-App-29x29@3x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 40x40 "$DEST/Icon-App-40x40@1x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 80x80 "$DEST/Icon-App-40x40@2x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 120x120 "$DEST/Icon-App-40x40@3x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 50x50 "$DEST/Icon-App-50x50@1x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 100x100 "$DEST/Icon-App-50x50@2x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 57x57 "$DEST/Icon-App-57x57@1x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 114x114 "$DEST/Icon-App-57x57@2x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 120x120 "$DEST/Icon-App-60x60@2x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 180x180 "$DEST/Icon-App-60x60@3x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 72x72 "$DEST/Icon-App-72x72@1x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 144x144 "$DEST/Icon-App-72x72@2x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 76x76 "$DEST/Icon-App-76x76@1x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 152x152 "$DEST/Icon-App-76x76@2x.png"
magick "$SOURCE" -background white -alpha remove -alpha off -resize 167x167 "$DEST/Icon-App-83.5x83.5@2x.png"

echo "✅ 21 icônes iOS régénérés avec succès"
```

---

**Dernière mise à jour** : 15/10/2025 - 10:00
**Statut** : ✅ **Build 338 uploadé avec logo correct**
**Prochaine étape** : Tests TestFlight
