Files
geo/app/README-IOS.md
pierre 2f5946a184 feat: Version 3.5.2 - Configuration Stripe et gestion des immeubles
- Configuration complète Stripe pour les 3 environnements (DEV/REC/PROD)
  * DEV: Clés TEST Pierre (mode test)
  * REC: Clés TEST Client (mode test)
  * PROD: Clés LIVE Client (mode live)
- Ajout de la gestion des bases de données immeubles/bâtiments
  * Configuration buildings_database pour DEV/REC/PROD
  * Service BuildingService pour enrichissement des adresses
- Optimisations pages et améliorations ergonomie
- Mises à jour des dépendances Composer
- Nettoyage des fichiers obsolètes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:26:27 +01:00

35 KiB

📱 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

  • Flutter downgrade vers 3.24.5 LTS (11/10/2025 sur Debian, 13/10/2025 corrections)
  • Dart SDK downgrade vers 3.5.4
  • Packages ajustés pour compatibilité Flutter 3.24.5 (voir détails ci-dessous)
  • flutter clean exécuté
  • flutter pub get exécuté avec succès
  • CocoaPods mis à jour (1.16.2)
  • 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 :

# 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

  • CFBundleName corrigé : geosector_appGeoSector
  • Bundle Identifier vérifié : fr.geosector.app3
  • Team ID configurée : 6WT84NWCTC
  • 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

  • Fichier Runner.entitlements créé avec :
    • NFC Tag Reading (NDEF, TAG)
    • Stripe Terminal - Tap to Pay on iPhone
    • Network Access
    • Keychain Sharing
  • 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

  • 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

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 :

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

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


📝 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 :
    cd ios
    rm -rf Pods Podfile.lock
    pod install
    cd ..
    
  4. Nettoyer et récupérer les dépendances :
    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 :

# 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 :

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

flutter --version

Réexécuter le fix des headers :

cd /Users/pierre/dev/geosector/app/ios
./fix_flutter_headers.sh

Nettoyer et reconstruire :

flutter clean
cd ios && pod install && ./fix_flutter_headers.sh

Retourner à Flutter 3.35.5 si nécessaire :

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

# 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 :

#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)

# Dans ios/.flutter-plugins-dependencies
"swift_package_manager_enabled": truefalse
  • 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


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

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
rm -rf ~/Library/Developer/Xcode/DerivedData/*
rm -rf build/ios
4. Compilation et création de l'archive
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

  • Logo intégré avec succès
  • Build 338 uploadé sur App Store Connect
  • 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 :

#!/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