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>
This commit is contained in:
6
app/fastlane/Appfile
Normal file
6
app/fastlane/Appfile
Normal file
@@ -0,0 +1,6 @@
|
||||
app_identifier("fr.geosector.app3") # Bundle ID
|
||||
apple_id("contact@d6soft.com") # Votre Apple ID
|
||||
team_id("6WT84NWCTC")
|
||||
|
||||
# Pour Android
|
||||
package_name("fr.geosector.app3")
|
||||
381
app/fastlane/Fastfile
Normal file
381
app/fastlane/Fastfile
Normal file
@@ -0,0 +1,381 @@
|
||||
# Fastfile pour GEOSECTOR Flutter App
|
||||
# Version: 2.0
|
||||
# Date: 2025-10-26
|
||||
# Auteur: Pierre (avec l'aide de Claude)
|
||||
#
|
||||
# Usage depuis le Mac mini (après transfert depuis Debian):
|
||||
# cd /Users/pierre/dev/geosector/app_346
|
||||
# fastlane android build # Build seulement (test local)
|
||||
# fastlane android release # Build + Upload vers Play Store
|
||||
# fastlane ios build # Build iOS seulement (test local)
|
||||
# fastlane ios release # Build + Upload vers TestFlight
|
||||
|
||||
default_platform(:android)
|
||||
|
||||
# =============================================================================
|
||||
# ANDROID
|
||||
# =============================================================================
|
||||
|
||||
platform :android do
|
||||
|
||||
desc "Build Android AAB (bundle) en mode release - sans upload"
|
||||
lane :build do
|
||||
UI.header("🤖 Build Android Bundle")
|
||||
|
||||
# Étape 1 : Nettoyer le projet
|
||||
UI.message("🧹 [1/6] Nettoyage du projet...")
|
||||
sh("cd .. && flutter clean")
|
||||
UI.success("Projet nettoyé")
|
||||
|
||||
# Étape 2 : Récupérer les dépendances
|
||||
UI.message("📦 [2/6] Récupération des dépendances...")
|
||||
sh("cd .. && flutter pub get")
|
||||
UI.success("Dépendances récupérées")
|
||||
|
||||
# Étape 3 : Patch nfc_manager
|
||||
UI.message("🔧 [3/6] Application du patch nfc_manager...")
|
||||
sh("cd .. && ./fastlane/scripts/commun/fix-nfc-manager.sh")
|
||||
UI.success("Patch nfc_manager appliqué")
|
||||
|
||||
# Étape 4 : Analyser le code (non bloquant)
|
||||
UI.message("🔍 [4/6] Analyse du code...")
|
||||
begin
|
||||
sh("cd .. && flutter analyze --no-fatal-infos --no-fatal-warnings")
|
||||
UI.success("Analyse du code terminée")
|
||||
rescue => ex
|
||||
UI.important("⚠️ Des warnings détectés, mais on continue...")
|
||||
end
|
||||
|
||||
# Étape 5 : Build du bundle AAB
|
||||
UI.message("🏗️ [5/6] Build du bundle Android (RELEASE)...")
|
||||
sh("cd .. && flutter build appbundle --release")
|
||||
UI.success("Bundle AAB généré")
|
||||
|
||||
# Étape 6 : Copier le bundle avec version
|
||||
UI.message("📋 [6/6] Copie du bundle avec version...")
|
||||
version_info = sh("cd .. && grep '^version:' pubspec.yaml | sed 's/version: //'").strip
|
||||
version_code = version_info.split('+').last
|
||||
final_name = "geosector-#{version_code}.aab"
|
||||
|
||||
sh("cd .. && cp build/app/outputs/bundle/release/app-release.aab #{final_name}")
|
||||
|
||||
bundle_size = sh("cd .. && du -h #{final_name} | cut -f1").strip
|
||||
|
||||
UI.success("✅ Build Android terminé avec succès!")
|
||||
UI.success("📦 Bundle: #{final_name}")
|
||||
UI.success("📊 Taille: #{bundle_size}")
|
||||
end
|
||||
|
||||
desc "Build Android AAB + Upload vers Google Play Console (Internal Testing)"
|
||||
lane :release do
|
||||
UI.header("🚀 Build & Deploy Android vers Play Store")
|
||||
|
||||
# Étape 1 : Nettoyer le projet
|
||||
UI.message("🧹 [1/7] Nettoyage du projet...")
|
||||
sh("cd .. && flutter clean")
|
||||
UI.success("Projet nettoyé")
|
||||
|
||||
# Étape 2 : Récupérer les dépendances
|
||||
UI.message("📦 [2/7] Récupération des dépendances...")
|
||||
sh("cd .. && flutter pub get")
|
||||
UI.success("Dépendances récupérées")
|
||||
|
||||
# Étape 3 : Patch nfc_manager
|
||||
UI.message("🔧 [3/7] Application du patch nfc_manager...")
|
||||
sh("cd .. && ./fastlane/scripts/commun/fix-nfc-manager.sh")
|
||||
UI.success("Patch nfc_manager appliqué")
|
||||
|
||||
# Étape 4 : Analyser le code (non bloquant)
|
||||
UI.message("🔍 [4/7] Analyse du code...")
|
||||
begin
|
||||
sh("cd .. && flutter analyze --no-fatal-infos --no-fatal-warnings")
|
||||
UI.success("Analyse du code terminée")
|
||||
rescue => ex
|
||||
UI.important("⚠️ Des warnings détectés, mais on continue...")
|
||||
end
|
||||
|
||||
# Étape 5 : Build du bundle AAB
|
||||
UI.message("🏗️ [5/7] Build du bundle Android (RELEASE)...")
|
||||
sh("cd .. && flutter build appbundle --release")
|
||||
UI.success("Bundle AAB généré")
|
||||
|
||||
# Étape 6 : Récupérer les informations de version
|
||||
version_info = sh("cd .. && grep '^version:' pubspec.yaml | sed 's/version: //'").strip
|
||||
version_name = version_info.split('+').first
|
||||
version_code = version_info.split('+').last
|
||||
|
||||
UI.message("📋 Version: #{version_name} (#{version_code})")
|
||||
|
||||
# Étape 7 : Upload vers Google Play Console
|
||||
UI.message("📤 [6/7] Upload vers Google Play Console...")
|
||||
|
||||
upload_to_play_store(
|
||||
json_key: '../android/google-play-api-key.json', # Credentials Google Play API
|
||||
track: 'internal', # Track: internal, alpha, beta, ou production
|
||||
aab: '../build/app/outputs/bundle/release/app-release.aab',
|
||||
skip_upload_apk: true, # On n'upload que l'AAB
|
||||
skip_upload_metadata: true, # On ne met pas à jour les métadonnées
|
||||
skip_upload_images: true, # On ne met pas à jour les images
|
||||
skip_upload_screenshots: true, # On ne met pas à jour les screenshots
|
||||
release_status: 'completed', # completed = publié immédiatement sur le track
|
||||
version_code: version_code.to_i, # Version code explicite
|
||||
package_name: 'fr.geosector.app3' # Package name explicite
|
||||
)
|
||||
|
||||
UI.success("✅ Déploiement Android terminé avec succès!")
|
||||
UI.success("📦 Version: #{version_name} (Build #{version_code})")
|
||||
UI.success("🎯 Track: Internal Testing")
|
||||
UI.success("🌐 URL: https://play.google.com/console")
|
||||
end
|
||||
|
||||
desc "Upload un AAB existant vers Google Play Console"
|
||||
lane :upload do
|
||||
UI.header("📤 Upload AAB vers Play Store")
|
||||
|
||||
# Vérifier que le bundle existe
|
||||
aab_path = '../build/app/outputs/bundle/release/app-release.aab'
|
||||
|
||||
if File.exist?(aab_path)
|
||||
# Récupérer la version
|
||||
version_info = sh("cd .. && grep '^version:' pubspec.yaml | sed 's/version: //'").strip
|
||||
version_code = version_info.split('+').last
|
||||
|
||||
UI.message("📦 Upload du bundle existant...")
|
||||
|
||||
upload_to_play_store(
|
||||
json_key: '../android/google-play-api-key.json',
|
||||
track: 'internal',
|
||||
aab: aab_path,
|
||||
skip_upload_apk: true,
|
||||
skip_upload_metadata: true,
|
||||
skip_upload_images: true,
|
||||
skip_upload_screenshots: true,
|
||||
release_status: 'completed',
|
||||
version_code: version_code.to_i,
|
||||
package_name: 'fr.geosector.app3'
|
||||
)
|
||||
|
||||
UI.success("✅ Upload terminé!")
|
||||
else
|
||||
UI.user_error!("❌ Bundle introuvable: #{aab_path}")
|
||||
UI.message("💡 Lancez d'abord: fastlane android build")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# =============================================================================
|
||||
# iOS
|
||||
# =============================================================================
|
||||
|
||||
platform :ios do
|
||||
|
||||
desc "Build iOS IPA en mode release - sans upload"
|
||||
lane :build do
|
||||
UI.header("🍎 Build iOS IPA")
|
||||
|
||||
# Étape 1 : Vérifier le cache local (préparé sur Debian)
|
||||
UI.message("📦 [1/6] Vérification du cache local...")
|
||||
|
||||
cache_path = File.expand_path("../.pub-cache-local")
|
||||
if !Dir.exist?(cache_path)
|
||||
UI.user_error!("❌ Cache local introuvable: #{cache_path}")
|
||||
UI.message("💡 Exécutez './deploy-app.sh' sur Debian pour préparer le projet")
|
||||
end
|
||||
|
||||
ENV['PUB_CACHE'] = cache_path
|
||||
ENV['GRADLE_USER_HOME'] = File.expand_path("../.gradle-local")
|
||||
|
||||
UI.success("Cache local configuré: #{cache_path}")
|
||||
UI.important("⚠️ flutter pub get et patchs déjà appliqués sur Debian")
|
||||
|
||||
# Étape 2 : Nettoyer les artefacts de build
|
||||
UI.message("🧹 [2/6] Nettoyage des artefacts...")
|
||||
sh("cd .. && rm -rf build .dart_tool ios/Pods ios/.symlinks")
|
||||
UI.success("Artefacts nettoyés")
|
||||
|
||||
# Étape 3 : Installation des pods
|
||||
UI.message("📦 [3/6] Installation des CocoaPods...")
|
||||
sh("cd ../ios && pod install")
|
||||
UI.success("CocoaPods installés")
|
||||
|
||||
# Étape 4 : Analyser le code (non bloquant)
|
||||
UI.message("🔍 [4/6] Analyse du code...")
|
||||
begin
|
||||
sh("cd .. && flutter analyze --no-fatal-infos --no-fatal-warnings")
|
||||
UI.success("Analyse du code terminée")
|
||||
rescue => ex
|
||||
UI.important("⚠️ Des warnings détectés, mais on continue...")
|
||||
end
|
||||
|
||||
# Étape 5 : Build Flutter iOS
|
||||
UI.message("🏗️ [5/6] Build Flutter iOS (RELEASE)...")
|
||||
sh("cd .. && flutter build ios --release --no-codesign")
|
||||
UI.success("Build Flutter iOS généré")
|
||||
|
||||
# Étape 6 : Archive Xcode (gym)
|
||||
UI.message("📦 [6/6] Archive Xcode et export IPA...")
|
||||
|
||||
build_ios_app(
|
||||
workspace: "./Runner.xcworkspace",
|
||||
scheme: "Runner",
|
||||
export_method: "app-store",
|
||||
export_options: {
|
||||
method: "app-store",
|
||||
teamID: "6WT84NWCTC",
|
||||
uploadBitcode: false,
|
||||
uploadSymbols: true,
|
||||
compileBitcode: false,
|
||||
signingStyle: "automatic",
|
||||
destination: "export",
|
||||
provisioningProfiles: {
|
||||
"fr.geosector.app3" => "match AppStore fr.geosector.app3"
|
||||
}
|
||||
},
|
||||
output_directory: "../build/ios/ipa",
|
||||
output_name: "Runner.ipa",
|
||||
clean: false,
|
||||
skip_profile_detection: true
|
||||
)
|
||||
|
||||
UI.success("IPA généré")
|
||||
|
||||
# Afficher les informations de version
|
||||
version_info = sh("cd .. && grep '^version:' pubspec.yaml | sed 's/version: //'").strip
|
||||
ipa_size = sh("cd .. && du -h build/ios/ipa/Runner.ipa | cut -f1").strip
|
||||
|
||||
UI.success("✅ Build iOS terminé avec succès!")
|
||||
UI.success("📦 IPA: build/ios/ipa/Runner.ipa")
|
||||
UI.success("📊 Version: #{version_info}")
|
||||
UI.success("📊 Taille: #{ipa_size}")
|
||||
end
|
||||
|
||||
desc "Build iOS IPA + Upload vers TestFlight"
|
||||
lane :release do
|
||||
UI.header("🚀 Build & Deploy iOS vers TestFlight")
|
||||
|
||||
# Étape 1 : Vérifier le cache local (préparé sur Debian)
|
||||
UI.message("📦 [1/7] Vérification du cache local...")
|
||||
|
||||
cache_path = File.expand_path("../.pub-cache-local")
|
||||
if !Dir.exist?(cache_path)
|
||||
UI.user_error!("❌ Cache local introuvable: #{cache_path}")
|
||||
UI.message("💡 Exécutez './deploy-app.sh' sur Debian pour préparer le projet")
|
||||
end
|
||||
|
||||
ENV['PUB_CACHE'] = cache_path
|
||||
ENV['GRADLE_USER_HOME'] = File.expand_path("../.gradle-local")
|
||||
|
||||
UI.success("Cache local configuré: #{cache_path}")
|
||||
UI.important("⚠️ flutter pub get et patchs déjà appliqués sur Debian")
|
||||
|
||||
# Étape 2 : Nettoyer les artefacts de build
|
||||
UI.message("🧹 [2/7] Nettoyage des artefacts...")
|
||||
sh("cd .. && rm -rf build .dart_tool ios/Pods ios/.symlinks")
|
||||
UI.success("Artefacts nettoyés")
|
||||
|
||||
# Étape 3 : Installation des pods
|
||||
UI.message("📦 [3/7] Installation des CocoaPods...")
|
||||
sh("cd ../ios && pod install")
|
||||
UI.success("CocoaPods installés")
|
||||
|
||||
# Étape 4 : Récupérer les informations de version
|
||||
version_info = sh("cd .. && grep '^version:' pubspec.yaml | sed 's/version: //'").strip
|
||||
version_name = version_info.split('+').first
|
||||
version_code = version_info.split('+').last
|
||||
|
||||
UI.message("📋 Version: #{version_name} (#{version_code})")
|
||||
|
||||
# Étape 5 : Analyser le code (non bloquant)
|
||||
UI.message("🔍 [4/7] Analyse du code...")
|
||||
begin
|
||||
sh("cd .. && flutter analyze --no-fatal-infos --no-fatal-warnings")
|
||||
UI.success("Analyse du code terminée")
|
||||
rescue => ex
|
||||
UI.important("⚠️ Des warnings détectés, mais on continue...")
|
||||
end
|
||||
|
||||
# Étape 6 : Build Flutter iOS
|
||||
UI.message("🏗️ [5/7] Build Flutter iOS (RELEASE)...")
|
||||
sh("cd .. && flutter build ios --release --no-codesign")
|
||||
UI.success("Build Flutter iOS généré")
|
||||
|
||||
# Étape 7 : Archive Xcode
|
||||
UI.message("📦 [6/7] Archive Xcode...")
|
||||
|
||||
build_ios_app(
|
||||
workspace: "./Runner.xcworkspace",
|
||||
scheme: "Runner",
|
||||
export_method: "app-store",
|
||||
export_options: {
|
||||
method: "app-store",
|
||||
teamID: "6WT84NWCTC",
|
||||
uploadBitcode: false,
|
||||
uploadSymbols: true,
|
||||
compileBitcode: false,
|
||||
signingStyle: "automatic",
|
||||
provisioningProfiles: {
|
||||
"fr.geosector.app3" => "match AppStore fr.geosector.app3"
|
||||
}
|
||||
},
|
||||
output_directory: "../build/ios/ipa",
|
||||
output_name: "Runner.ipa",
|
||||
clean: false,
|
||||
skip_profile_detection: true
|
||||
)
|
||||
|
||||
UI.success("IPA généré")
|
||||
|
||||
# Étape 7 : Upload vers TestFlight
|
||||
UI.message("📤 [7/7] Upload vers TestFlight...")
|
||||
|
||||
upload_to_testflight(
|
||||
apple_id: "contact@d6soft.com",
|
||||
app_identifier: "fr.geosector.app3",
|
||||
team_id: "6WT84NWCTC",
|
||||
ipa: "../build/ios/ipa/Runner.ipa",
|
||||
skip_waiting_for_build_processing: true,
|
||||
skip_submission: true,
|
||||
distribute_external: false
|
||||
)
|
||||
|
||||
UI.success("✅ Déploiement iOS terminé avec succès!")
|
||||
UI.success("📦 Version: #{version_name} (Build #{version_code})")
|
||||
UI.success("🎯 Track: TestFlight (Internal)")
|
||||
UI.success("🌐 URL: https://appstoreconnect.apple.com")
|
||||
end
|
||||
|
||||
desc "Upload un IPA existant vers TestFlight"
|
||||
lane :upload do
|
||||
UI.header("📤 Upload IPA vers TestFlight")
|
||||
|
||||
# Vérifier que l'IPA existe
|
||||
ipa_path = '../build/ios/ipa/Runner.ipa'
|
||||
|
||||
if File.exist?(ipa_path)
|
||||
# Récupérer la version
|
||||
version_info = sh("cd .. && grep '^version:' pubspec.yaml | sed 's/version: //'").strip
|
||||
version_name = version_info.split('+').first
|
||||
version_code = version_info.split('+').last
|
||||
|
||||
UI.message("📦 Upload de l'IPA existant...")
|
||||
|
||||
upload_to_testflight(
|
||||
apple_id: "contact@d6soft.com",
|
||||
app_identifier: "fr.geosector.app3",
|
||||
team_id: "6WT84NWCTC",
|
||||
ipa: ipa_path,
|
||||
skip_waiting_for_build_processing: true,
|
||||
skip_submission: true,
|
||||
distribute_external: false
|
||||
)
|
||||
|
||||
UI.success("✅ Upload terminé!")
|
||||
UI.success("📦 Version: #{version_name} (Build #{version_code})")
|
||||
else
|
||||
UI.user_error!("❌ IPA introuvable: #{ipa_path}")
|
||||
UI.message("💡 Lancez d'abord: fastlane ios build")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
211
app/fastlane/scripts/android/android.sh
Executable file
211
app/fastlane/scripts/android/android.sh
Executable file
@@ -0,0 +1,211 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de génération du bundle Android pour GEOSECTOR
|
||||
# Usage: ./android.sh
|
||||
|
||||
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'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 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"
|
||||
}
|
||||
|
||||
# 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
|
||||
|
||||
print_message "========================================="
|
||||
print_message " GEOSECTOR - Génération Bundle Android"
|
||||
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
|
||||
|
||||
# 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
|
||||
|
||||
print_message "Version détectée : $VERSION"
|
||||
print_message "Version code : $VERSION_CODE"
|
||||
echo
|
||||
|
||||
# Vérifier la présence du keystore
|
||||
if [ ! -f "android/app/geosector2025.jks" ]; then
|
||||
print_error "Fichier keystore introuvable : android/app/geosector2025.jks"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier la présence du fichier key.properties
|
||||
if [ ! -f "android/key.properties" ]; then
|
||||
print_error "Fichier key.properties introuvable"
|
||||
print_error "Ce fichier est nécessaire pour signer l'application"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_success "Configuration de signature vérifiée"
|
||||
echo
|
||||
|
||||
# Étape 1 : Nettoyer le projet
|
||||
print_message "Étape 1/4 : Nettoyage du projet..."
|
||||
flutter clean
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Projet nettoyé"
|
||||
else
|
||||
print_error "Échec du nettoyage du projet"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
|
||||
# Étape 2 : Récupérer les dépendances
|
||||
print_message "Étape 2/4 : Récupération des dépendances..."
|
||||
flutter pub get
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Dépendances récupérées"
|
||||
else
|
||||
print_error "Échec de la récupération des dépendances"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Patch nfc_manager 3.3.0 (AndroidManifest namespace)
|
||||
print_message "Application du patch nfc_manager 3.3.0..."
|
||||
./fastlane/scripts/commun/fix-nfc-manager.sh || {
|
||||
print_error "Échec du patch nfc_manager"
|
||||
exit 1
|
||||
}
|
||||
echo
|
||||
|
||||
# Étape 3 : Analyser le code (optionnel mais recommandé)
|
||||
print_message "Étape 3/4 : Analyse du code Dart..."
|
||||
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 "Génération annulée par l'utilisateur"
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
print_success "Analyse du code terminée"
|
||||
echo
|
||||
|
||||
# Étape 4 : Générer le bundle
|
||||
print_message "Étape 4/4 : Génération du bundle Android..."
|
||||
print_message "Cette opération peut prendre plusieurs minutes..."
|
||||
flutter build appbundle --release
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Bundle généré avec succès"
|
||||
else
|
||||
print_error "Échec de la génération du bundle"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
|
||||
# Vérifier que le bundle a été créé
|
||||
BUNDLE_PATH="build/app/outputs/bundle/release/app-release.aab"
|
||||
if [ ! -f "$BUNDLE_PATH" ]; then
|
||||
print_error "Bundle introuvable à l'emplacement attendu : $BUNDLE_PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Copier le bundle à la racine avec le nouveau nom
|
||||
FINAL_NAME="geosector-$VERSION_CODE.aab"
|
||||
print_message "Copie du bundle vers : $FINAL_NAME"
|
||||
cp "$BUNDLE_PATH" "$FINAL_NAME"
|
||||
|
||||
if [ -f "$FINAL_NAME" ]; then
|
||||
print_success "Bundle copié avec succès"
|
||||
|
||||
# Afficher la taille du fichier
|
||||
FILE_SIZE=$(du -h "$FINAL_NAME" | cut -f1)
|
||||
print_message "Taille du bundle : $FILE_SIZE"
|
||||
else
|
||||
print_error "Échec de la copie du bundle"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
print_message "========================================="
|
||||
print_success " GÉNÉRATION TERMINÉE AVEC SUCCÈS !"
|
||||
print_message "========================================="
|
||||
echo
|
||||
print_message "Bundle généré : ${GREEN}$FINAL_NAME${NC}"
|
||||
print_message "Version : $VERSION"
|
||||
print_message "Chemin : $(pwd)/$FINAL_NAME"
|
||||
echo
|
||||
print_message "Prochaines étapes :"
|
||||
print_message "1. Tester le bundle sur un appareil Android"
|
||||
print_message "2. Uploader sur Google Play Console"
|
||||
print_message "3. Soumettre pour review"
|
||||
echo
|
||||
|
||||
# Optionnel : Générer aussi l'APK
|
||||
read -p "Voulez-vous aussi générer l'APK pour des tests ? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
print_message "Génération de l'APK..."
|
||||
flutter build apk --release
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
APK_PATH="build/app/outputs/flutter-apk/app-release.apk"
|
||||
if [ -f "$APK_PATH" ]; then
|
||||
APK_NAME="geosector-$VERSION_CODE.apk"
|
||||
cp "$APK_PATH" "$APK_NAME"
|
||||
print_success "APK généré : $APK_NAME"
|
||||
|
||||
# Afficher la taille de l'APK
|
||||
APK_SIZE=$(du -h "$APK_NAME" | cut -f1)
|
||||
print_message "Taille de l'APK : $APK_SIZE"
|
||||
fi
|
||||
else
|
||||
print_warning "Échec de la génération de l'APK (le bundle a été créé avec succès)"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo
|
||||
print_success "Script terminé !"
|
||||
214
app/fastlane/scripts/commun/fix-nfc-manager.sh
Executable file
214
app/fastlane/scripts/commun/fix-nfc-manager.sh
Executable file
@@ -0,0 +1,214 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ============================================================================
|
||||
# Script de correction du package nfc_manager 3.3.0 pour Android Gradle Plugin 8+
|
||||
# ============================================================================
|
||||
#
|
||||
# Problème :
|
||||
# nfc_manager 3.3.0 utilise l'ancien format 'package="..."' dans AndroidManifest.xml
|
||||
# et ne déclare pas de namespace dans build.gradle (requis par AGP 8+)
|
||||
#
|
||||
# Solution :
|
||||
# 1. Supprime l'attribut package="io.flutter.plugins.nfcmanager" du AndroidManifest.xml
|
||||
# 2. Ajoute namespace 'io.flutter.plugins.nfc_manager' dans build.gradle
|
||||
#
|
||||
# Usage :
|
||||
# ./fix-nfc-manager.sh
|
||||
#
|
||||
# Historique :
|
||||
# 14/10/2025 - Création du script pour résoudre compilation Android
|
||||
# ============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
# Détection de l'OS pour la syntaxe sed
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# macOS (BSD sed)
|
||||
SED_INPLACE="sed -i ''"
|
||||
else
|
||||
# Linux (GNU sed)
|
||||
SED_INPLACE="sed -i"
|
||||
fi
|
||||
|
||||
# Couleurs pour les messages
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
echo_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
echo_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
echo_step() {
|
||||
echo -e "${BLUE}[STEP]${NC} $1"
|
||||
}
|
||||
|
||||
# Chemins vers les fichiers de nfc_manager 3.3.0
|
||||
# Utilise $PUB_CACHE si défini (cache local projet), sinon $HOME/.pub-cache
|
||||
PUB_CACHE_BASE="${PUB_CACHE:-$HOME/.pub-cache}"
|
||||
NFC_DIR="${PUB_CACHE_BASE}/hosted/pub.dev/nfc_manager-3.3.0/android"
|
||||
NFC_MANIFEST="${NFC_DIR}/src/main/AndroidManifest.xml"
|
||||
NFC_BUILD_GRADLE="${NFC_DIR}/build.gradle"
|
||||
NFC_TRANSLATOR="${NFC_DIR}/src/main/kotlin/io/flutter/plugins/nfcmanager/Translator.kt"
|
||||
|
||||
echo_info "=========================================="
|
||||
echo_info " nfc_manager 3.3.0 - Android Patch"
|
||||
echo_info "=========================================="
|
||||
echo ""
|
||||
|
||||
# Vérifier si les fichiers existent
|
||||
if [ ! -f "$NFC_MANIFEST" ]; then
|
||||
echo_error "Fichier AndroidManifest.xml introuvable"
|
||||
echo_error "Chemin attendu: $NFC_MANIFEST"
|
||||
echo ""
|
||||
echo_info "Exécutez 'flutter pub get' d'abord"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$NFC_BUILD_GRADLE" ]; then
|
||||
echo_error "Fichier build.gradle introuvable"
|
||||
echo_error "Chemin attendu: $NFC_BUILD_GRADLE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$NFC_TRANSLATOR" ]; then
|
||||
echo_error "Fichier Translator.kt introuvable"
|
||||
echo_error "Chemin attendu: $NFC_TRANSLATOR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo_info "Fichiers trouvés:"
|
||||
echo_info " - AndroidManifest.xml: $NFC_MANIFEST"
|
||||
echo_info " - build.gradle: $NFC_BUILD_GRADLE"
|
||||
echo_info " - Translator.kt: $NFC_TRANSLATOR"
|
||||
echo ""
|
||||
|
||||
# ===========================================
|
||||
# ÉTAPE 1 : Patcher AndroidManifest.xml
|
||||
# ===========================================
|
||||
echo_step "Étape 1/2 : Patch AndroidManifest.xml"
|
||||
echo ""
|
||||
|
||||
if grep -q 'package="io.flutter.plugins.nfcmanager"' "$NFC_MANIFEST"; then
|
||||
echo_warning "Attribut 'package' détecté dans AndroidManifest.xml"
|
||||
|
||||
# Créer une sauvegarde
|
||||
BACKUP_MANIFEST="${NFC_MANIFEST}.backup"
|
||||
if [ ! -f "$BACKUP_MANIFEST" ]; then
|
||||
cp "$NFC_MANIFEST" "$BACKUP_MANIFEST"
|
||||
echo_info "Sauvegarde créée: ${BACKUP_MANIFEST}"
|
||||
fi
|
||||
|
||||
# Appliquer le patch (compatible Linux + macOS)
|
||||
eval "$SED_INPLACE 's/ package=\"io.flutter.plugins.nfcmanager\"//g' \"$NFC_MANIFEST\""
|
||||
|
||||
# Vérifier
|
||||
if ! grep -q 'package="io.flutter.plugins.nfcmanager"' "$NFC_MANIFEST"; then
|
||||
echo_info "✅ AndroidManifest.xml patché avec succès"
|
||||
else
|
||||
echo_error "❌ Échec du patch AndroidManifest.xml"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo_info "✅ AndroidManifest.xml déjà patché"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# ===========================================
|
||||
# ÉTAPE 2 : Patcher build.gradle
|
||||
# ===========================================
|
||||
echo_step "Étape 2/2 : Patch build.gradle"
|
||||
echo ""
|
||||
|
||||
if grep -q "namespace 'io.flutter.plugins.nfc_manager'" "$NFC_BUILD_GRADLE"; then
|
||||
echo_info "✅ build.gradle déjà patché (namespace présent)"
|
||||
else
|
||||
echo_warning "Namespace manquant dans build.gradle"
|
||||
|
||||
# Créer une sauvegarde
|
||||
BACKUP_GRADLE="${NFC_BUILD_GRADLE}.backup"
|
||||
if [ ! -f "$BACKUP_GRADLE" ]; then
|
||||
cp "$NFC_BUILD_GRADLE" "$BACKUP_GRADLE"
|
||||
echo_info "Sauvegarde créée: ${BACKUP_GRADLE}"
|
||||
fi
|
||||
|
||||
# Appliquer le patch : ajouter namespace après "android {" (compatible Linux + macOS)
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# macOS : nécessite un retour à la ligne explicite
|
||||
sed -i '' "/^android {$/a\\
|
||||
namespace 'io.flutter.plugins.nfc_manager'
|
||||
" "$NFC_BUILD_GRADLE"
|
||||
else
|
||||
# Linux : syntaxe différente
|
||||
sed -i "/^android {$/a\\ namespace 'io.flutter.plugins.nfc_manager'" "$NFC_BUILD_GRADLE"
|
||||
fi
|
||||
|
||||
# Vérifier
|
||||
if grep -q "namespace 'io.flutter.plugins.nfc_manager'" "$NFC_BUILD_GRADLE"; then
|
||||
echo_info "✅ build.gradle patché avec succès (namespace ajouté)"
|
||||
else
|
||||
echo_error "❌ Échec du patch build.gradle"
|
||||
# Restaurer le backup
|
||||
mv "$BACKUP_GRADLE" "$NFC_BUILD_GRADLE"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# ===========================================
|
||||
# ÉTAPE 3 : Patcher Translator.kt (Kotlin)
|
||||
# ===========================================
|
||||
echo_step "Étape 3/3 : Patch Translator.kt (fix Kotlin deprecated)"
|
||||
echo ""
|
||||
|
||||
if grep -q '\.toLowerCase(' "$NFC_TRANSLATOR"; then
|
||||
echo_warning "Méthode dépréciée 'toLowerCase()' détectée dans Translator.kt"
|
||||
|
||||
# Créer une sauvegarde
|
||||
BACKUP_TRANSLATOR="${NFC_TRANSLATOR}.backup"
|
||||
if [ ! -f "$BACKUP_TRANSLATOR" ]; then
|
||||
cp "$NFC_TRANSLATOR" "$BACKUP_TRANSLATOR"
|
||||
echo_info "Sauvegarde créée: ${BACKUP_TRANSLATOR}"
|
||||
fi
|
||||
|
||||
# Appliquer le patch : remplacer toLowerCase par lowercase (compatible Linux + macOS)
|
||||
eval "$SED_INPLACE 's/\\.toLowerCase(/\\.lowercase(/g' \"$NFC_TRANSLATOR\""
|
||||
|
||||
# Vérifier
|
||||
if ! grep -q '\.toLowerCase(' "$NFC_TRANSLATOR"; then
|
||||
echo_info "✅ Translator.kt patché avec succès (toLowerCase → lowercase)"
|
||||
else
|
||||
echo_error "❌ Échec du patch Translator.kt"
|
||||
# Restaurer le backup
|
||||
mv "$BACKUP_TRANSLATOR" "$NFC_TRANSLATOR"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo_info "✅ Translator.kt déjà patché (pas de toLowerCase)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo_info "=========================================="
|
||||
echo_info " ✅ Patch terminé avec succès!"
|
||||
echo_info "=========================================="
|
||||
echo ""
|
||||
echo_info "Modifications appliquées:"
|
||||
echo_info " 1. AndroidManifest.xml - Attribut 'package' supprimé"
|
||||
echo_info " 2. build.gradle - Namespace ajouté"
|
||||
echo_info " 3. Translator.kt - toLowerCase() → lowercase()"
|
||||
echo ""
|
||||
echo_info "Vous pouvez maintenant compiler Android:"
|
||||
echo_info " ./android.sh"
|
||||
echo ""
|
||||
|
||||
exit 0
|
||||
87
app/fastlane/scripts/commun/fix-permission-handler.sh
Executable file
87
app/fastlane/scripts/commun/fix-permission-handler.sh
Executable file
@@ -0,0 +1,87 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de correction automatique pour permission_handler_apple
|
||||
# Problème : Le package embarque ses propres headers Flutter qui créent des conflits
|
||||
# Solution : Supprimer le dossier Flutter/ et corriger les imports
|
||||
# Date : 14/10/2025
|
||||
# Usage : ./fix-permission-handler.sh
|
||||
|
||||
set -e # Arrêter en cas d'erreur
|
||||
|
||||
# Détection de l'OS pour la syntaxe sed
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# macOS (BSD sed)
|
||||
SED_INPLACE="sed -i ''"
|
||||
else
|
||||
# Linux (GNU sed)
|
||||
SED_INPLACE="sed -i"
|
||||
fi
|
||||
|
||||
echo "🔧 Fix permission_handler_apple - Correction des conflits Flutter headers"
|
||||
echo ""
|
||||
|
||||
# Couleurs pour les messages
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Trouver le chemin du package dans .pub-cache
|
||||
# Utilise $PUB_CACHE si défini (cache local projet), sinon $HOME/.pub-cache
|
||||
PUB_CACHE_BASE="${PUB_CACHE:-$HOME/.pub-cache}"
|
||||
PERMISSION_HANDLER_PATH=$(find "${PUB_CACHE_BASE}/hosted/pub.dev" -maxdepth 1 -name "permission_handler_apple-*" -type d | sort -V | tail -n 1)
|
||||
|
||||
if [ -z "$PERMISSION_HANDLER_PATH" ]; then
|
||||
echo -e "${RED}❌ Erreur : Package permission_handler_apple introuvable dans .pub-cache${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}📦 Package trouvé : $PERMISSION_HANDLER_PATH${NC}"
|
||||
echo ""
|
||||
|
||||
CLASSES_PATH="$PERMISSION_HANDLER_PATH/ios/Classes"
|
||||
FLUTTER_DIR="$CLASSES_PATH/Flutter"
|
||||
|
||||
# Étape 1 : Vérifier si le dossier Flutter existe
|
||||
if [ -d "$FLUTTER_DIR" ]; then
|
||||
echo -e "${YELLOW}🗑️ Suppression du dossier Flutter embarqué...${NC}"
|
||||
rm -rf "$FLUTTER_DIR"
|
||||
echo -e "${GREEN}✅ Dossier Flutter supprimé${NC}"
|
||||
else
|
||||
echo -e "${GREEN}✅ Dossier Flutter déjà supprimé${NC}"
|
||||
fi
|
||||
|
||||
# Étape 2 : Corriger les imports dans PermissionHandlerPlugin.h
|
||||
PLUGIN_HEADER="$CLASSES_PATH/PermissionHandlerPlugin.h"
|
||||
if [ -f "$PLUGIN_HEADER" ]; then
|
||||
if grep -q '#import "Flutter/Flutter.h"' "$PLUGIN_HEADER"; then
|
||||
echo -e "${YELLOW}📝 Correction de PermissionHandlerPlugin.h...${NC}"
|
||||
eval "$SED_INPLACE 's|#import \"Flutter/Flutter.h\"|#import <Flutter/Flutter.h>|g' \"$PLUGIN_HEADER\""
|
||||
echo -e "${GREEN}✅ PermissionHandlerPlugin.h corrigé${NC}"
|
||||
else
|
||||
echo -e "${GREEN}✅ PermissionHandlerPlugin.h déjà corrigé${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e "${RED}⚠️ Fichier PermissionHandlerPlugin.h introuvable${NC}"
|
||||
fi
|
||||
|
||||
# Étape 3 : Corriger les imports dans PermissionManager.h
|
||||
MANAGER_HEADER="$CLASSES_PATH/PermissionManager.h"
|
||||
if [ -f "$MANAGER_HEADER" ]; then
|
||||
if grep -q '#import "Flutter/Flutter.h"' "$MANAGER_HEADER"; then
|
||||
echo -e "${YELLOW}📝 Correction de PermissionManager.h...${NC}"
|
||||
eval "$SED_INPLACE 's|#import \"Flutter/Flutter.h\"|#import <Flutter/Flutter.h>|g' \"$MANAGER_HEADER\""
|
||||
echo -e "${GREEN}✅ PermissionManager.h corrigé${NC}"
|
||||
else
|
||||
echo -e "${GREEN}✅ PermissionManager.h déjà corrigé${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e "${RED}⚠️ Fichier PermissionManager.h introuvable${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}🎉 Correction terminée avec succès !${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}ℹ️ Ce script doit être exécuté après chaque 'flutter pub get'${NC}"
|
||||
echo -e "${YELLOW}ℹ️ Raison : Le package permission_handler_apple embarque des headers Flutter qui créent des conflits${NC}"
|
||||
echo ""
|
||||
65
app/fastlane/scripts/ios/fix-ios-packages.sh
Executable file
65
app/fastlane/scripts/ios/fix-ios-packages.sh
Executable file
@@ -0,0 +1,65 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script maître de correction des packages iOS problématiques
|
||||
# Combine : fix-nfc-manager.sh + fix-permission-handler.sh
|
||||
# Date : 14/10/2025
|
||||
# Usage : ./fix-ios-packages.sh (à exécuter après chaque flutter pub get)
|
||||
|
||||
set -e # Arrêter en cas d'erreur
|
||||
|
||||
echo "🚀 Fix iOS Packages - Correction automatique des packages problématiques"
|
||||
echo "========================================================================="
|
||||
echo ""
|
||||
|
||||
# Couleurs pour les messages
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# =============================================================================
|
||||
# 1. Fix nfc_manager (namespace Android + headers iOS)
|
||||
# =============================================================================
|
||||
|
||||
echo -e "${BLUE}📦 [1/2] Correction de nfc_manager...${NC}"
|
||||
echo ""
|
||||
|
||||
if [ -f "./fastlane/scripts/commun/fix-nfc-manager.sh" ]; then
|
||||
./fastlane/scripts/commun/fix-nfc-manager.sh
|
||||
echo ""
|
||||
else
|
||||
echo -e "${YELLOW}⚠️ Script fix-nfc-manager.sh introuvable, ignoré${NC}"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# 2. Fix permission_handler_apple (headers Flutter embarqués)
|
||||
# =============================================================================
|
||||
|
||||
echo -e "${BLUE}📦 [2/2] Correction de permission_handler_apple...${NC}"
|
||||
echo ""
|
||||
|
||||
if [ -f "./fastlane/scripts/commun/fix-permission-handler.sh" ]; then
|
||||
./fastlane/scripts/commun/fix-permission-handler.sh
|
||||
echo ""
|
||||
else
|
||||
echo -e "${YELLOW}⚠️ Script fix-permission-handler.sh introuvable, ignoré${NC}"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Résumé
|
||||
# =============================================================================
|
||||
|
||||
echo "========================================================================="
|
||||
echo -e "${GREEN}✅ Tous les packages iOS ont été corrigés avec succès !${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}📋 Workflow de build iOS recommandé :${NC}"
|
||||
echo " 1. flutter clean"
|
||||
echo " 2. flutter pub get"
|
||||
echo " 3. ./fix-ios-packages.sh ← Ce script"
|
||||
echo " 4. cd ios && pod install && cd .."
|
||||
echo " 5. flutter build ios --release --no-codesign"
|
||||
echo ""
|
||||
echo -e "${YELLOW}💡 Astuce : Vous pouvez ajouter ce script à votre .gitignore${NC}"
|
||||
echo ""
|
||||
152
app/fastlane/scripts/ios/ios-build-mac.sh
Executable file
152
app/fastlane/scripts/ios/ios-build-mac.sh
Executable file
@@ -0,0 +1,152 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de compilation et archivage iOS sur Mac mini
|
||||
# Ce script doit être exécuté SUR le Mac mini
|
||||
# Usage: ./ios-build-mac.sh
|
||||
|
||||
set -e
|
||||
|
||||
# Couleurs pour les messages
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${BLUE}=========================================${NC}"
|
||||
echo -e "${BLUE} GEOSECTOR - Build iOS sur Mac mini${NC}"
|
||||
echo -e "${BLUE}=========================================${NC}"
|
||||
echo ""
|
||||
|
||||
# Vérifier que nous sommes sur macOS
|
||||
if [[ "$OSTYPE" != "darwin"* ]]; then
|
||||
echo -e "${RED}Erreur: Ce script doit être exécuté sur macOS (Mac mini)${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier que nous sommes dans le bon dossier
|
||||
if [ ! -f "pubspec.yaml" ]; then
|
||||
echo -e "${RED}Erreur: Ce script doit être exécuté depuis le dossier racine de l'application Flutter${NC}"
|
||||
echo -e "${RED}Fichier pubspec.yaml introuvable${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier que Flutter est installé
|
||||
if ! command -v flutter &> /dev/null; then
|
||||
echo -e "${RED}Erreur: Flutter n'est pas installé ou n'est pas dans le PATH${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier que Xcode est installé
|
||||
if ! command -v xcodebuild &> /dev/null; then
|
||||
echo -e "${RED}Erreur: Xcode Command Line Tools ne sont pas installés${NC}"
|
||||
echo -e "${YELLOW}Installation: xcode-select --install${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Récupérer la version depuis pubspec.yaml
|
||||
VERSION=$(grep "^version:" pubspec.yaml | sed 's/version: //' | tr -d ' ')
|
||||
VERSION_NAME=$(echo $VERSION | cut -d'+' -f1)
|
||||
VERSION_CODE=$(echo $VERSION | cut -d'+' -f2)
|
||||
|
||||
if [ -z "$VERSION_CODE" ]; then
|
||||
echo -e "${RED}Impossible de récupérer la version depuis pubspec.yaml${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}Version détectée :${NC} $VERSION"
|
||||
echo -e "${YELLOW}Version name :${NC} $VERSION_NAME"
|
||||
echo -e "${YELLOW}Build number :${NC} $VERSION_CODE"
|
||||
echo ""
|
||||
|
||||
# Afficher la version de Flutter
|
||||
echo -e "${BLUE}Version Flutter :${NC}"
|
||||
flutter --version
|
||||
echo ""
|
||||
|
||||
# Étape 1 : Nettoyer le projet
|
||||
echo -e "${BLUE}Étape 1/5 : Nettoyage du projet...${NC}"
|
||||
flutter clean
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN}✓ Projet nettoyé${NC}"
|
||||
else
|
||||
echo -e "${RED}✗ Échec du nettoyage${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Étape 2 : Récupérer les dépendances Flutter
|
||||
echo -e "${BLUE}Étape 2/5 : Récupération des dépendances Flutter...${NC}"
|
||||
flutter pub get
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN}✓ Dépendances Flutter récupérées${NC}"
|
||||
else
|
||||
echo -e "${RED}✗ Échec de la récupération des dépendances${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Étape 3 : Installer les pods iOS
|
||||
echo -e "${BLUE}Étape 3/5 : Installation des CocoaPods...${NC}"
|
||||
cd ios
|
||||
pod install
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN}✓ Pods installés${NC}"
|
||||
cd ..
|
||||
else
|
||||
echo -e "${RED}✗ Échec de l'installation des pods${NC}"
|
||||
cd ..
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Étape 4 : Build iOS release
|
||||
echo -e "${BLUE}Étape 4/5 : Compilation iOS (release)...${NC}"
|
||||
echo -e "${YELLOW}Cette étape peut prendre 5-10 minutes...${NC}"
|
||||
flutter build ios --release --no-codesign
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "${GREEN}✓ Compilation iOS réussie${NC}"
|
||||
else
|
||||
echo -e "${RED}✗ Échec de la compilation iOS${NC}"
|
||||
echo -e "${YELLOW}Consultez les logs ci-dessus pour plus de détails${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Étape 5 : Ouvrir Xcode pour l'archive
|
||||
echo -e "${BLUE}Étape 5/5 : Ouverture de Xcode pour l'archive...${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}L'archive en ligne de commande peut échouer avec les certificats.${NC}"
|
||||
echo -e "${YELLOW}Xcode gère mieux la signature automatique.${NC}"
|
||||
echo ""
|
||||
|
||||
# Ouvrir Xcode
|
||||
echo -e "${GREEN}Ouverture de Xcode...${NC}"
|
||||
open ios/Runner.xcworkspace
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}=========================================${NC}"
|
||||
echo -e "${GREEN} ✓ BUILD iOS TERMINÉ AVEC SUCCÈS !${NC}"
|
||||
echo -e "${GREEN}=========================================${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Version :${NC} $VERSION_NAME ($VERSION_CODE)"
|
||||
echo ""
|
||||
echo -e "${BLUE}📱 PROCHAINES ÉTAPES DANS XCODE :${NC}"
|
||||
echo ""
|
||||
echo -e " ${GREEN}1.${NC} Attendre que Xcode charge le projet (quelques secondes)"
|
||||
echo -e " ${GREEN}2.${NC} Vérifier le Team : ${YELLOW}Runner > Signing & Capabilities > Team = 6WT84NWCTC${NC}"
|
||||
echo -e " ${GREEN}3.${NC} Menu : ${YELLOW}Product > Clean Build Folder${NC} (Cmd+Shift+K)"
|
||||
echo -e " ${GREEN}4.${NC} Menu : ${YELLOW}Product > Archive${NC}"
|
||||
echo -e " ${GREEN}5.${NC} Attendre la fin de l'archive (5-10 minutes)"
|
||||
echo -e " ${GREEN}6.${NC} Fenêtre Organizer s'ouvrira automatiquement"
|
||||
echo -e " ${GREEN}7.${NC} Clic sur ${YELLOW}Distribute App${NC}"
|
||||
echo -e " ${GREEN}8.${NC} Sélectionner ${YELLOW}App Store Connect${NC}"
|
||||
echo -e " ${GREEN}9.${NC} Suivre l'assistant d'upload"
|
||||
echo ""
|
||||
echo -e "${BLUE}💡 CONSEILS :${NC}"
|
||||
echo -e " • Si l'archive échoue, vérifier les certificats dans Signing & Capabilities"
|
||||
echo -e " • Automatic signing doit être coché"
|
||||
echo -e " • Team doit être 6WT84NWCTC (Pierre ROTROU)"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Xcode est maintenant ouvert et prêt pour l'archive !${NC}"
|
||||
echo ""
|
||||
400
app/fastlane/scripts/ios/ios.sh
Executable file
400
app/fastlane/scripts/ios/ios.sh
Executable file
@@ -0,0 +1,400 @@
|
||||
#!/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
|
||||
32
app/fastlane/scripts/ios/ios_reset.sh
Executable file
32
app/fastlane/scripts/ios/ios_reset.sh
Executable file
@@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Se placer dans le répertoire du projet
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# Supprimer les fichiers générés par Flutter
|
||||
flutter clean
|
||||
|
||||
# Supprimer les fichiers de CocoaPods
|
||||
cd ios
|
||||
rm -rf Pods
|
||||
rm -rf .symlinks
|
||||
rm -f Podfile.lock
|
||||
rm -rf ~/Library/Developer/Xcode/DerivedData
|
||||
|
||||
# Supprimer le workspace Xcode (il sera recréé)
|
||||
rm -rf Runner.xcworkspace
|
||||
|
||||
# Revenir au répertoire parent
|
||||
cd ..
|
||||
|
||||
# Récupérer les dépendances Flutter
|
||||
flutter pub get
|
||||
|
||||
# Régénérer les fichiers iOS
|
||||
flutter precache --ios
|
||||
|
||||
# Réinstaller les pods
|
||||
cd ios
|
||||
pod install --repo-update
|
||||
|
||||
echo "Réinitialisation iOS terminée !"
|
||||
Reference in New Issue
Block a user