#!/bin/bash # Script de génération de l'application iOS pour GEOSECTOR # Usage: ./ios.sh # Options: ./ios.sh --skip-archive (build uniquement sans archive Xcode) set -e # Arrêter le script en cas d'erreur # Couleurs pour les messages RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' MAGENTA='\033[0;35m' NC='\033[0m' # No Color # Options SKIP_ARCHIVE=false if [[ "$1" == "--skip-archive" ]]; then SKIP_ARCHIVE=true fi # Fonction pour afficher les messages print_message() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_step() { echo -e "${MAGENTA}[STEP]${NC} $1" } # Fonction pour gérer les erreurs handle_error() { print_error "Une erreur est survenue lors de l'exécution de la commande" print_error "Ligne $1" exit 1 } # Trap pour capturer les erreurs trap 'handle_error $LINENO' ERR # Vérifier que nous sommes dans le bon dossier if [ ! -f "pubspec.yaml" ]; then print_error "Ce script doit être exécuté depuis le dossier racine de l'application Flutter" print_error "Fichier pubspec.yaml introuvable" exit 1 fi # Vérifier que nous sommes sur macOS if [[ "$OSTYPE" != "darwin"* ]]; then print_error "Ce script doit être exécuté sur macOS pour compiler iOS" exit 1 fi echo print_message "=========================================" print_message " GEOSECTOR - Build iOS Application" print_message "=========================================" echo # Vérifier que Flutter est installé if ! command -v flutter &> /dev/null; then print_error "Flutter n'est pas installé ou n'est pas dans le PATH" exit 1 fi # Vérifier la version Flutter FLUTTER_VERSION=$(flutter --version | head -n 1 | cut -d' ' -f2) print_message "Flutter version : $FLUTTER_VERSION" # Vérifier que c'est Flutter 3.24.5 (recommandé) if [[ "$FLUTTER_VERSION" != "3.24.5" ]]; then print_warning "Version Flutter détectée : $FLUTTER_VERSION" print_warning "Version recommandée : 3.24.5 LTS" read -p "Voulez-vous continuer ? (y/n) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then print_message "Build annulé par l'utilisateur" exit 0 fi fi # Vérifier que CocoaPods est installé if ! command -v pod &> /dev/null; then print_error "CocoaPods n'est pas installé" print_error "Installation : sudo gem install cocoapods" exit 1 fi POD_VERSION=$(pod --version) print_message "CocoaPods version : $POD_VERSION" # Vérifier que Xcode est installé if ! command -v xcodebuild &> /dev/null; then print_error "Xcode n'est pas installé" print_error "Installation : App Store > Xcode" exit 1 fi XCODE_VERSION=$(xcodebuild -version | head -n 1) print_message "$XCODE_VERSION" # Récupérer la version depuis pubspec.yaml VERSION=$(grep "^version:" pubspec.yaml | sed 's/version: //' | sed 's/+/-/') if [ -z "$VERSION" ]; then print_error "Impossible de récupérer la version depuis pubspec.yaml" exit 1 fi # Extraire le version code VERSION_CODE=$(echo $VERSION | cut -d'-' -f2) if [ -z "$VERSION_CODE" ]; then print_error "Impossible d'extraire le version code" exit 1 fi VERSION_NAME=$(echo $VERSION | cut -d'-' -f1) print_message "Version détectée : $VERSION_NAME ($VERSION_CODE)" echo # Vérifier que le dossier ios existe if [ ! -d "ios" ]; then print_error "Dossier ios/ introuvable" exit 1 fi print_success "Vérifications préliminaires terminées" echo # ============================================================================= # ÉTAPE 1 : Nettoyage complet # ============================================================================= print_step "Étape 1/7 : Nettoyage complet du projet..." echo print_message "Suppression du cache Flutter..." flutter clean print_message "Suppression du cache iOS (Pods, build, symlinks)..." rm -rf ios/Pods rm -rf ios/Podfile.lock rm -rf ios/.symlinks rm -rf build/ios print_success "Nettoyage terminé" echo # ============================================================================= # ÉTAPE 2 : Récupération des dépendances Flutter # ============================================================================= print_step "Étape 2/7 : Récupération des dépendances Flutter..." echo flutter pub get if [ $? -eq 0 ]; then print_success "Dépendances Flutter récupérées" else print_error "Échec de la récupération des dépendances Flutter" exit 1 fi echo # Vérifier que Generated.xcconfig a été créé avec les bons chemins if [ ! -f "ios/Flutter/Generated.xcconfig" ]; then print_error "Fichier ios/Flutter/Generated.xcconfig non généré" exit 1 fi FLUTTER_ROOT=$(grep "FLUTTER_ROOT=" ios/Flutter/Generated.xcconfig | cut -d'=' -f2) print_message "FLUTTER_ROOT configuré : $FLUTTER_ROOT" if [[ "$FLUTTER_ROOT" == *"/opt/flutter"* ]] || [[ "$FLUTTER_ROOT" == *"/home/"* ]]; then print_error "FLUTTER_ROOT contient un chemin Linux invalide : $FLUTTER_ROOT" print_error "Régénération nécessaire..." rm ios/Flutter/Generated.xcconfig flutter pub get fi print_success "Configuration Flutter vérifiée" echo # ============================================================================= # ÉTAPE 3 : Patch permission_handler_apple (critique pour iOS) # ============================================================================= print_step "Étape 3/7 : Application du patch permission_handler_apple..." echo if [ -f "./fastlane/scripts/commun/fix-permission-handler.sh" ]; then ./fastlane/scripts/commun/fix-permission-handler.sh if [ $? -eq 0 ]; then print_success "Patch permission_handler_apple appliqué" else print_error "Échec du patch permission_handler_apple" exit 1 fi else print_warning "Script fix-permission-handler.sh introuvable" print_warning "La compilation peut échouer sans ce patch" read -p "Voulez-vous continuer malgré tout ? (y/n) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then print_message "Build annulé par l'utilisateur" exit 0 fi fi echo # ============================================================================= # ÉTAPE 4 : Installation des pods CocoaPods # ============================================================================= print_step "Étape 4/7 : Installation des pods CocoaPods..." echo cd ios pod install if [ $? -eq 0 ]; then print_success "Pods installés avec succès" # Compter le nombre de pods installés POD_COUNT=$(grep -c "Installing" Podfile.lock 2>/dev/null || echo "0") print_message "Nombre de pods installés : $POD_COUNT" else print_error "Échec de l'installation des pods" exit 1 fi cd .. echo # Vérifier que le workspace a été créé if [ ! -d "ios/Runner.xcworkspace" ]; then print_error "Workspace Xcode non créé : ios/Runner.xcworkspace" exit 1 fi print_success "Workspace Xcode créé : ios/Runner.xcworkspace" echo # ============================================================================= # ÉTAPE 5 : Analyse du code (optionnel) # ============================================================================= print_step "Étape 5/7 : Analyse du code Dart..." echo flutter analyze --no-fatal-infos --no-fatal-warnings || { print_warning "Des avertissements ont été détectés dans le code" read -p "Voulez-vous continuer malgré les avertissements ? (y/n) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then print_message "Build annulé par l'utilisateur" exit 0 fi } print_success "Analyse du code terminée" echo # ============================================================================= # ÉTAPE 6 : Build iOS (sans signature) # ============================================================================= print_step "Étape 6/7 : Compilation iOS (release, sans signature)..." echo print_message "Cette opération peut prendre plusieurs minutes..." print_message "Compilation en cours..." flutter build ios --release --no-codesign if [ $? -eq 0 ]; then print_success "Compilation iOS réussie !" # Vérifier que l'app a été créée if [ -d "build/ios/iphoneos/Runner.app" ]; then APP_SIZE=$(du -sh build/ios/iphoneos/Runner.app | cut -f1) print_message "Taille de l'app : $APP_SIZE" print_message "Chemin : build/ios/iphoneos/Runner.app" else print_warning "Application générée mais introuvable à l'emplacement attendu" fi else print_error "Échec de la compilation iOS" print_error "Consultez les logs ci-dessus pour plus de détails" exit 1 fi echo # ============================================================================= # ÉTAPE 7 : Archive Xcode (optionnel) # ============================================================================= if [ "$SKIP_ARCHIVE" = false ]; then print_step "Étape 7/7 : Création de l'archive Xcode..." echo print_message "L'archive Xcode nécessite une signature de code" print_message "Cette étape ouvrira Xcode pour créer l'archive manuellement" echo read -p "Voulez-vous ouvrir Xcode pour créer l'archive ? (y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then print_message "Ouverture de Xcode..." open ios/Runner.xcworkspace echo print_message "=========================================" print_message " Instructions pour l'archive Xcode" print_message "=========================================" echo print_message "1. Dans Xcode, sélectionner : Any iOS Device (arm64)" print_message "2. Menu : Product > Clean Build Folder (Cmd+Shift+K)" print_message "3. Menu : Product > Archive" print_message "4. Attendre la fin de la compilation (~5-10 min)" print_message "5. Organizer s'ouvre automatiquement" print_message "6. Cliquer sur 'Validate App'" print_message "7. Puis 'Distribute App' > 'App Store Connect' > 'Upload'" echo print_warning "Ne fermez pas ce terminal pendant l'archive Xcode" echo read -p "Appuyez sur Entrée quand l'archive est terminée..." -r echo print_success "Archive créée avec succès (si aucune erreur Xcode)" else print_message "Archive ignorée" print_message "Vous pouvez créer l'archive plus tard avec :" print_message " open ios/Runner.xcworkspace" fi else print_message "Étape 7/7 : Archive Xcode ignorée (--skip-archive)" fi echo # ============================================================================= # RÉSUMÉ FINAL # ============================================================================= print_message "=========================================" print_success " BUILD iOS TERMINÉ AVEC SUCCÈS !" print_message "=========================================" echo print_message "Version : ${GREEN}$VERSION_NAME ($VERSION_CODE)${NC}" print_message "Bundle ID : ${GREEN}fr.geosector.app3${NC}" print_message "Application : ${GREEN}build/ios/iphoneos/Runner.app${NC}" echo if [ "$SKIP_ARCHIVE" = false ]; then print_message "Prochaines étapes (dans Xcode) :" print_message "1. ✅ Build iOS réussi" print_message "2. ⏳ Créer l'archive (Product > Archive)" print_message "3. ⏳ Valider l'archive (Organizer > Validate App)" print_message "4. ⏳ Upload vers App Store Connect" print_message "5. ⏳ Configurer les métadonnées" print_message "6. ⏳ Soumettre pour révision Apple" else print_message "Prochaines étapes :" print_message "1. Ouvrir Xcode : open ios/Runner.xcworkspace" print_message "2. Créer l'archive : Product > Archive" print_message "3. Upload vers App Store Connect" fi echo print_message "Documentation :" print_message " - BUILD-IOS-SUCCESS.md (guide complet)" print_message " - SOLUTION-IOS.md (détails de la solution)" print_message " - SCRIPTS-IOS.md (documentation des scripts)" echo print_success "Script terminé !" echo # Afficher un résumé des fichiers importants print_message "Fichiers générés :" print_message " - Runner.app : build/ios/iphoneos/Runner.app" if [ -d "build/ios/archive" ]; then print_message " - Archive : build/ios/archive/ (si créée)" fi echo