Files
unionflow-mobile-apps/scripts/build/build-ios-release.ps1
2026-03-28 14:22:16 +00:00

238 lines
8.2 KiB
PowerShell
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Script de Build iOS IPA Release - UnionFlow Mobile
# Usage: .\build-ios-release.ps1 [-env <dev|staging|prod>] [-clean]
# NOTE: Nécessite macOS avec Xcode installé
param(
[Parameter(Mandatory=$false)]
[ValidateSet("dev", "staging", "prod")]
[string]$env = "prod",
[Parameter(Mandatory=$false)]
[switch]$clean = $false
)
# Configuration
$ErrorActionPreference = "Stop"
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$projectRoot = Join-Path $scriptDir "../.."
# Couleurs pour output
function Write-Success { param($msg) Write-Host "$msg" -ForegroundColor Green }
function Write-Info { param($msg) Write-Host " $msg" -ForegroundColor Cyan }
function Write-Warning { param($msg) Write-Host "⚠️ $msg" -ForegroundColor Yellow }
function Write-Error { param($msg) Write-Host "$msg" -ForegroundColor Red }
# Banner
Write-Host @"
UnionFlow Mobile - iOS IPA Release Build
(App Store Connect)
"@ -ForegroundColor Cyan
# Vérifier OS
if (-not ($IsMacOS -or $IsOSX)) {
Write-Error "Build iOS nécessite macOS avec Xcode installé"
Write-Info "Utilisez un Mac ou un service de CI/CD cloud (Codemagic, Bitrise, etc.)"
exit 1
}
# Vérifier Flutter
Write-Info "Vérification de Flutter..."
try {
$flutterVersion = flutter --version | Select-String -Pattern "Flutter (\d+\.\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value }
Write-Success "Flutter $flutterVersion détecté"
} catch {
Write-Error "Flutter n'est pas installé ou n'est pas dans le PATH"
exit 1
}
# Vérifier Xcode
Write-Info "Vérification de Xcode..."
try {
$xcodeVersion = xcodebuild -version | Select-String -Pattern "Xcode (\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value }
Write-Success "Xcode $xcodeVersion détecté"
} catch {
Write-Error "Xcode n'est pas installé"
Write-Info "Installer depuis App Store: https://apps.apple.com/us/app/xcode/id497799835"
exit 1
}
# Changement de répertoire
Set-Location $projectRoot
Write-Info "Répertoire de travail: $projectRoot"
# Configuration environnement
$apiUrl = ""
$keycloakUrl = ""
$wsUrl = ""
switch ($env) {
"dev" {
$apiUrl = "http://localhost:8085"
$keycloakUrl = "http://localhost:8180"
$wsUrl = "ws://localhost:8085"
}
"staging" {
$apiUrl = "https://api-staging.lions.dev"
$keycloakUrl = "https://security-staging.lions.dev"
$wsUrl = "wss://api-staging.lions.dev"
}
"prod" {
$apiUrl = "https://api.lions.dev"
$keycloakUrl = "https://security.lions.dev"
$wsUrl = "wss://api.lions.dev"
}
}
Write-Info "Environnement: $env"
Write-Info "API URL: $apiUrl"
Write-Info "Keycloak URL: $keycloakUrl"
Write-Info "WebSocket URL: $wsUrl"
# Clean (optionnel)
if ($clean) {
Write-Info "Nettoyage du build précédent..."
flutter clean
Write-Success "Nettoyage terminé"
}
# Get dependencies
Write-Info "Installation des dépendances..."
flutter pub get
Write-Success "Dépendances installées"
# CocoaPods
Write-Info "Installation des CocoaPods..."
Set-Location "ios"
pod install
Set-Location ".."
Write-Success "CocoaPods installés"
# Build runner
Write-Info "Génération du code (build_runner)..."
flutter pub run build_runner build --delete-conflicting-outputs
Write-Success "Code généré"
# Linting
Write-Info "Analyse du code..."
$analyzeResult = flutter analyze 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Warning "Analyse du code a détecté des problèmes:"
Write-Host $analyzeResult
$continue = Read-Host "Continuer quand même? (y/n)"
if ($continue -ne "y") {
Write-Error "Build annulé"
exit 1
}
}
Write-Success "Analyse terminée"
# Avertissement pour production
if ($env -eq "prod") {
Write-Warning "⚠️ Build iOS pour production"
Write-Warning ""
Write-Warning "Vérifier:"
Write-Warning "1. Provisioning Profile configuré dans Xcode"
Write-Warning "2. Signing Certificate valide"
Write-Warning "3. App ID enregistré sur Apple Developer"
Write-Warning "4. Version et Build Number mis à jour"
Write-Warning ""
$continue = Read-Host "Continuer? (y/n)"
if ($continue -ne "y") {
Write-Error "Build annulé"
exit 1
}
}
# Build IPA
Write-Info "Build IPA Release en cours..."
Write-Info "Ceci peut prendre plusieurs minutes..."
$buildArgs = @(
"build",
"ipa",
"--release",
"--dart-define=ENV=$env",
"--dart-define=API_URL=$apiUrl",
"--dart-define=KEYCLOAK_URL=$keycloakUrl",
"--dart-define=WS_URL=$wsUrl"
)
# Obfuscation pour production
if ($env -eq "prod") {
Write-Info "Activation de l'obfuscation..."
$buildArgs += "--obfuscate"
$buildArgs += "--split-debug-info=build/ios/symbols"
}
& flutter $buildArgs
if ($LASTEXITCODE -ne 0) {
Write-Error "Build IPA échoué"
Write-Warning ""
Write-Warning "Si erreur de signing, ouvrir Xcode:"
Write-Warning " open ios/Runner.xcworkspace"
Write-Warning "Puis configurer Signing & Capabilities"
exit 1
}
# Résultat
$ipaPath = "build/ios/ipa/unionflow_mobile_apps.ipa"
$ipaFullPath = Join-Path $projectRoot $ipaPath
if (Test-Path $ipaFullPath) {
$ipaSize = (Get-Item $ipaFullPath).Length / 1MB
$ipaSizeFormatted = "{0:N2} MB" -f $ipaSize
Write-Host ""
Write-Success "Build IPA terminé avec succès!"
Write-Host ""
Write-Host "┌─────────────────────────────────────────────────────────┐" -ForegroundColor Green
Write-Host "│ Fichier: $ipaPath" -ForegroundColor Green
Write-Host "│ Taille: $ipaSizeFormatted" -ForegroundColor Green
Write-Host "│ Environnement: $env" -ForegroundColor Green
Write-Host "└─────────────────────────────────────────────────────────┘" -ForegroundColor Green
Write-Host ""
# Copie dans outputs/
$outputDir = Join-Path $projectRoot "outputs"
if (-not (Test-Path $outputDir)) {
New-Item -ItemType Directory -Path $outputDir | Out-Null
}
$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
$outputIpa = Join-Path $outputDir "unionflow-$env-$timestamp.ipa"
Copy-Item $ipaFullPath $outputIpa
Write-Success "IPA copié vers: outputs/unionflow-$env-$timestamp.ipa"
# Symboles de debug
$symbolsPath = Join-Path $projectRoot "build/ios/symbols"
if (Test-Path $symbolsPath) {
$outputSymbols = Join-Path $outputDir "unionflow-$env-$timestamp-symbols.zip"
Compress-Archive -Path $symbolsPath -DestinationPath $outputSymbols -Force
Write-Success "Symboles de debug: outputs/unionflow-$env-$timestamp-symbols.zip"
}
Write-Host ""
Write-Info "Prochaines étapes pour App Store:"
Write-Host "1. Ouvrir Xcode: open ios/Runner.xcworkspace" -ForegroundColor Yellow
Write-Host "2. Product → Archive (Cmd+B puis Cmd+Shift+B)" -ForegroundColor Yellow
Write-Host "3. Window → Organizer" -ForegroundColor Yellow
Write-Host "4. Sélectionner l'archive → Distribute App" -ForegroundColor Yellow
Write-Host "5. App Store Connect → Upload" -ForegroundColor Yellow
Write-Host "6. Se connecter avec Apple ID Developer" -ForegroundColor Yellow
Write-Host "7. Aller sur App Store Connect → My Apps → UnionFlow" -ForegroundColor Yellow
Write-Host "8. TestFlight → Internal Testing / External Testing" -ForegroundColor Yellow
Write-Host "9. App Store → Submit for Review" -ForegroundColor Yellow
Write-Host ""
} else {
Write-Error "IPA non trouvé à l'emplacement attendu"
Write-Warning "Vérifier les erreurs de signing dans Xcode"
exit 1
}