#!/bin/bash # iOS Test App Build and Deploy Script # Builds and deploys the DailyNotification iOS 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 right directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TEST_APP_DIR="$(dirname "$SCRIPT_DIR")" if [ ! -d "$TEST_APP_DIR/App" ]; then log_error "App directory not found at $TEST_APP_DIR/App" log_info "Please run setup first (see SETUP.md)" exit 1 fi cd "$TEST_APP_DIR" # 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 # Check for CocoaPods (try multiple locations) POD_CMD="" if command -v pod &> /dev/null; then POD_CMD="pod" elif [ -f ~/.rbenv/shims/pod ]; then POD_CMD="~/.rbenv/shims/pod" elif [ -f ~/.gem/bin/pod ]; then POD_CMD="~/.gem/bin/pod" else log_error "CocoaPods not found." log_info "" log_info "Installation options:" log_info " 1. Using rbenv (recommended):" log_info " rbenv install 3.1.0" log_info " rbenv global 3.1.0" log_info " gem install cocoapods" log_info "" log_info " 2. Using system Ruby (requires Ruby 3.1+):" log_info " gem install cocoapods" log_info "" log_info " 3. Using Homebrew:" log_info " brew install cocoapods" log_info "" log_info "Current Ruby version: $(ruby --version 2>/dev/null || echo 'not found')" exit 1 fi log_info "Using CocoaPods: $POD_CMD" # Get simulator device (default to first available iPhone, or user-specified) if [ -z "$1" ]; then # Auto-detect first available iPhone simulator SIMULATOR_DEVICE=$(xcrun simctl list devices available | grep -i "iPhone" | head -1 | sed 's/.*(\(.*\))/\1/' | xargs || echo "") if [ -z "$SIMULATOR_DEVICE" ]; then # Fallback to generic simulator SIMULATOR_DEVICE="Any iOS Simulator Device" log_warn "No iPhone simulators found, using generic destination" else log_info "Auto-detected simulator: $SIMULATOR_DEVICE" fi else SIMULATOR_DEVICE="$1" log_info "Using specified simulator: $SIMULATOR_DEVICE" fi # Boot simulator (only if specific device name provided) if [ "$SIMULATOR_DEVICE" != "Any iOS Simulator Device" ] && [ "$SIMULATOR_DEVICE" != "generic/platform=iOS Simulator" ]; then log_step "Booting simulator..." if xcrun simctl list devices | grep -q "$SIMULATOR_DEVICE.*Booted"; then log_info "Simulator already booted" else 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 fi # Install CocoaPods dependencies log_step "Installing CocoaPods dependencies..." cd App export LANG=en_US.UTF-8 # Required for CocoaPods if [ ! -f "Podfile.lock" ] || [ "Podfile" -nt "Podfile.lock" ]; then if eval "$POD_CMD install"; then log_info "✓ CocoaPods dependencies installed" else log_error "Failed to install CocoaPods dependencies" log_info "Try running manually: export LANG=en_US.UTF-8 && $POD_CMD install" exit 1 fi 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" # Use generic destination if device name is generic, otherwise use specific device if [ "$SIMULATOR_DEVICE" = "Any iOS Simulator Device" ] || [ "$SIMULATOR_DEVICE" = "generic/platform=iOS Simulator" ]; then DESTINATION="generic/platform=iOS Simulator" else DESTINATION="platform=iOS Simulator,name=$SIMULATOR_DEVICE" fi log_info "Build destination: $DESTINATION" xcodebuild -workspace "$WORKSPACE" \ -scheme "$SCHEME" \ -configuration "$CONFIG" \ -sdk "$SDK" \ -destination "$DESTINATION" \ -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") 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"