#!/bin/bash # iOS Test App Build and Deploy Script # Builds and deploys the DailyNotification test app to iOS Simulator set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "${BLUE}[STEP]${NC} $1" } # Check if we're in the test app directory if [ ! -f "package.json" ] || [ ! -d "ios" ]; then log_error "This script must be run from test-apps/daily-notification-test directory" log_info "Usage: cd test-apps/daily-notification-test && ./scripts/build-and-deploy-ios.sh" exit 1 fi # Check prerequisites log_step "Checking prerequisites..." if ! command -v xcodebuild &> /dev/null; then log_error "xcodebuild not found. Install Xcode command line tools:" log_info " xcode-select --install" exit 1 fi if ! command -v pod &> /dev/null; then log_error "CocoaPods not found. Install with:" log_info " gem install cocoapods" exit 1 fi # Get simulator device (default to iPhone 15 Pro) SIMULATOR_DEVICE="${1:-iPhone 15 Pro}" log_info "Using simulator: $SIMULATOR_DEVICE" # Boot simulator log_step "Booting simulator..." if xcrun simctl list devices | grep -q "$SIMULATOR_DEVICE.*Booted"; then log_info "Simulator already booted" else # Try to boot the device if xcrun simctl boot "$SIMULATOR_DEVICE" 2>/dev/null; then log_info "✓ Simulator booted" else log_warn "Could not boot simulator automatically" log_info "Opening Simulator app... (you may need to select device manually)" open -a Simulator sleep 5 fi fi # Build web assets log_step "Building web assets..." npm run build # Sync with iOS log_step "Syncing with iOS project..." if ! npx cap sync ios; then log_error "Failed to sync with iOS project" exit 1 fi # Install CocoaPods dependencies log_step "Installing CocoaPods dependencies..." cd ios/App if [ ! -f "Podfile.lock" ] || [ "Podfile" -nt "Podfile.lock" ]; then pod install else log_info "CocoaPods dependencies up to date" fi # Build iOS app log_step "Building iOS app..." WORKSPACE="App.xcworkspace" SCHEME="App" CONFIG="Debug" SDK="iphonesimulator" xcodebuild -workspace "$WORKSPACE" \ -scheme "$SCHEME" \ -configuration "$CONFIG" \ -sdk "$SDK" \ -destination "platform=iOS Simulator,name=$SIMULATOR_DEVICE" \ -derivedDataPath build/derivedData \ CODE_SIGN_IDENTITY="" \ CODE_SIGNING_REQUIRED=NO \ CODE_SIGNING_ALLOWED=NO \ clean build # Find built app APP_PATH=$(find build/derivedData -name "*.app" -type d -path "*/Build/Products/*-iphonesimulator/*.app" | head -1) if [ -z "$APP_PATH" ]; then log_error "Could not find built app" log_info "Searching in: build/derivedData" exit 1 fi log_info "Found app: $APP_PATH" # Install app on simulator log_step "Installing app on simulator..." if xcrun simctl install booted "$APP_PATH"; then log_info "✓ App installed" else log_error "Failed to install app" exit 1 fi # Get bundle identifier BUNDLE_ID=$(plutil -extract CFBundleIdentifier raw App/Info.plist 2>/dev/null || echo "com.timesafari.dailynotification.test") log_info "Bundle ID: $BUNDLE_ID" # Launch app log_step "Launching app..." if xcrun simctl launch booted "$BUNDLE_ID"; then log_info "✓ App launched" else log_warn "App may already be running" fi log_info "" log_info "✅ Build and deploy complete!" log_info "" log_info "To view logs:" log_info " xcrun simctl spawn booted log stream" log_info "" log_info "To uninstall app:" log_info " xcrun simctl uninstall booted $BUNDLE_ID"