diff --git a/docs/build-system/platforms/android-custom-api-ip.md b/docs/build-system/platforms/android-custom-api-ip.md index 1db748c5..a741fba9 100644 --- a/docs/build-system/platforms/android-custom-api-ip.md +++ b/docs/build-system/platforms/android-custom-api-ip.md @@ -1,4 +1,4 @@ -# Android Custom API IP Configuration +# Mobile Custom API IP Configuration **Author**: Matthew Raymer **Date**: 2025-01-27 @@ -10,61 +10,85 @@ When deploying TimeSafari to physical Android devices during development, you ma ## Problem -During Android development: -- **Emulator**: Uses `10.0.2.2:3000` to access host machine's localhost (default) -- **Physical Device**: Cannot access `localhost` or `10.0.2.2` - needs actual IP address +During mobile development: +- **Android Emulator**: Uses `10.0.2.2:3000` to access host machine's localhost (Android emulator default) +- **iOS Simulator**: Uses `localhost:3000` to access host machine's localhost (iOS simulator default) +- **Physical Devices**: Cannot access `localhost` or `10.0.2.2` - needs actual IP address for network access ## Solution -The Android build system defaults to `10.0.2.2:3000` for emulator development and supports specifying a custom IP address for the claim API server when building for physical devices. +The mobile build system uses platform-appropriate defaults and supports specifying a custom IP address for the claim API server when building for physical devices: +- **Android**: Defaults to `10.0.2.2:3000` for emulator development +- **iOS**: Uses Capacitor default (`localhost:3000`) for simulator development ## Usage ### Command Line Usage ```bash -# Default behavior (uses 10.0.2.2 for emulator) +# Android - Default behavior (uses 10.0.2.2 for emulator) ./scripts/build-android.sh --dev -# Custom IP for physical device +# Android - Custom IP for physical device ./scripts/build-android.sh --dev --api-ip 192.168.1.100 +# iOS - Default behavior (uses localhost for simulator) +./scripts/build-ios.sh --dev + +# iOS - Custom IP for physical device +./scripts/build-ios.sh --dev --api-ip 192.168.1.100 + # Test environment with custom IP ./scripts/build-android.sh --test --api-ip 192.168.1.100 +./scripts/build-ios.sh --test --api-ip 192.168.1.100 # Build and auto-run with custom IP ./scripts/build-android.sh --dev --api-ip 192.168.1.100 --auto-run +./scripts/build-ios.sh --dev --api-ip 192.168.1.100 --auto-run ``` ### NPM Scripts ```bash -# Default development build (uses 10.0.2.2 for emulator) +# Android - Default development build (uses 10.0.2.2 for emulator) npm run build:android:dev -# Development build with custom IP (requires IP parameter) +# Android - Development build with custom IP (requires IP parameter) npm run build:android:dev:custom 192.168.1.100 -# Test build with custom IP (requires IP parameter) +# iOS - Default development build (uses localhost for simulator) +npm run build:ios:dev + +# iOS - Development build with custom IP (requires IP parameter) +npm run build:ios:dev:custom 192.168.1.100 + +# Test builds with custom IP (requires IP parameter) npm run build:android:test:custom 192.168.1.100 +npm run build:ios:test:custom 192.168.1.100 # Development build + auto-run with custom IP npm run build:android:dev:run:custom 192.168.1.100 +npm run build:ios:dev:run:custom 192.168.1.100 # Test build + auto-run with custom IP npm run build:android:test:run:custom 192.168.1.100 +npm run build:ios:test:run:custom 192.168.1.100 ``` ## Examples -### Scenario 1: Development on Emulator (Default) +### Scenario 1: Development on Simulator/Emulator (Default) ```bash -# Default behavior - uses 10.0.2.2 for emulator +# Android - Default behavior - uses 10.0.2.2 for emulator npm run build:android:dev -# Build and immediately run on emulator +# iOS - Default behavior - uses localhost for simulator +npm run build:ios:dev + +# Build and immediately run on simulator/emulator npm run build:android:dev:run +npm run build:ios:dev:run ``` ### Scenario 2: Development on Physical Device @@ -72,9 +96,11 @@ npm run build:android:dev:run ```bash # Your development server is running on 192.168.1.50:3000 npm run build:android:dev:custom 192.168.1.50 +npm run build:ios:dev:custom 192.168.1.50 # Build and immediately run on device npm run build:android:dev:run:custom 192.168.1.50 +npm run build:ios:dev:run:custom 192.168.1.50 ``` ### Scenario 3: Testing on Physical Device @@ -82,20 +108,23 @@ npm run build:android:dev:run:custom 192.168.1.50 ```bash # Your test server is running on 192.168.1.75:3000 npm run build:android:test:custom 192.168.1.75 +npm run build:ios:test:custom 192.168.1.75 # Build and immediately run on device npm run build:android:test:run:custom 192.168.1.75 +npm run build:ios:test:run:custom 192.168.1.75 ``` ### Scenario 4: Direct Script Usage ```bash -# Default behavior (emulator) +# Default behavior (uses platform-appropriate defaults) ./scripts/build-android.sh --dev --studio +./scripts/build-ios.sh --dev --studio # Custom IP for physical device ./scripts/build-android.sh --dev --api-ip 192.168.1.100 --studio -./scripts/build-android.sh --test --api-ip 192.168.1.100 --apk +./scripts/build-ios.sh --dev --api-ip 192.168.1.100 --studio ``` ## How It Works @@ -104,18 +133,23 @@ npm run build:android:test:run:custom 192.168.1.75 The build system handles API server configuration as follows: -1. **Default behavior**: Uses `http://10.0.2.2:3000` for emulator development -2. **Custom IP specified**: Overrides with `http://:3000` for physical device development -3. **Maintains other APIs**: Image and Partner APIs remain at production URLs -4. **Logs the configuration**: Shows which IP is being used in build logs +1. **Android default**: Uses Android emulator default (`http://10.0.2.2:3000`) +2. **iOS default**: Uses Capacitor default (`http://localhost:3000`) +3. **Custom IP specified**: Overrides with `http://:3000` for physical device development +4. **Maintains other APIs**: Image and Partner APIs remain at production URLs +5. **Logs the configuration**: Shows which IP is being used in build logs ### Build Process ```bash -# Development mode with default IP (10.0.2.2) +# Development mode with Android emulator default (10.0.2.2) export VITE_DEFAULT_ENDORSER_API_SERVER="http://10.0.2.2:3000" npm run build:capacitor -- --mode development +# Development mode with iOS simulator default (localhost) +export VITE_DEFAULT_ENDORSER_API_SERVER="http://localhost:3000" +npm run build:capacitor -- --mode development + # Development mode with custom IP export VITE_DEFAULT_ENDORSER_API_SERVER="http://192.168.1.100:3000" npm run build:capacitor -- --mode development @@ -123,7 +157,8 @@ npm run build:capacitor -- --mode development ### Default Behavior -- **No `--api-ip` specified**: Uses default emulator IP (`10.0.2.2:3000`) +- **Android (no `--api-ip`)**: Uses Android emulator default (`10.0.2.2:3000`) +- **iOS (no `--api-ip`)**: Uses Capacitor default (`localhost:3000`) - **Custom IP specified**: Uses provided IP address for physical device development - **Invalid IP format**: Build will fail with clear error message - **Network unreachable**: App will show connection errors at runtime diff --git a/package.json b/package.json index 9ec3b946..2274ed91 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,10 @@ "build:ios:sync": "./scripts/build-ios.sh --sync", "build:ios:assets": "./scripts/build-ios.sh --assets", "build:ios:deploy": "./scripts/build-ios.sh --deploy", + "build:ios:dev:custom": "./scripts/build-ios.sh --dev --api-ip", + "build:ios:test:custom": "./scripts/build-ios.sh --test --api-ip", + "build:ios:dev:run:custom": "./scripts/build-ios.sh --dev --api-ip --auto-run", + "build:ios:test:run:custom": "./scripts/build-ios.sh --test --api-ip --auto-run", "build:web": "./scripts/build-web.sh", "build:web:dev": "./scripts/build-web.sh --dev", "build:web:test": "./scripts/build-web.sh --test", diff --git a/scripts/build-android.sh b/scripts/build-android.sh index 874761ce..ba4d3ac6 100755 --- a/scripts/build-android.sh +++ b/scripts/build-android.sh @@ -193,9 +193,9 @@ if [ "$BUILD_MODE" = "development" ]; then export VITE_DEFAULT_ENDORSER_API_SERVER="http://${CUSTOM_API_IP}:3000" log_info "Android development mode: Using custom IP ${CUSTOM_API_IP} for physical device" else - # Use default emulator IP (10.0.2.2) for Android development + # Use Android emulator IP (10.0.2.2) for Android development export VITE_DEFAULT_ENDORSER_API_SERVER="http://10.0.2.2:3000" - log_debug "Android development mode: Using default 10.0.2.2 for emulator" + log_debug "Android development mode: Using 10.0.2.2 for emulator" fi fi diff --git a/scripts/build-ios.sh b/scripts/build-ios.sh index 985fb080..33e78e3b 100755 --- a/scripts/build-ios.sh +++ b/scripts/build-ios.sh @@ -22,6 +22,7 @@ SYNC_ONLY=false ASSETS_ONLY=false DEPLOY_APP=false AUTO_RUN=false +CUSTOM_API_IP="" # Function to print iOS-specific usage print_ios_usage() { @@ -41,6 +42,7 @@ print_ios_usage() { echo " --assets Generate assets only" echo " --deploy Deploy app to connected device" echo " --auto-run Auto-run app after build" + echo " --api-ip Custom IP address for claim API (uses Capacitor default)" echo "" echo "Common Options:" echo " -h, --help Show this help message" @@ -54,12 +56,19 @@ print_ios_usage() { echo " $0 --clean # Clean only" echo " $0 --sync # Sync only" echo " $0 --deploy # Build and deploy to device" + echo " $0 --dev # Dev build with Capacitor default" + echo " $0 --dev --api-ip 192.168.1.100 # Dev build with custom API IP" echo "" } # Function to parse iOS-specific arguments parse_ios_args() { - for arg in "$@"; do + local args=("$@") + local i=0 + + while [ $i -lt ${#args[@]} ]; do + local arg="${args[$i]}" + case $arg in --dev|--development) BUILD_MODE="development" @@ -100,6 +109,18 @@ parse_ios_args() { --auto-run) AUTO_RUN=true ;; + --api-ip) + if [ $((i + 1)) -lt ${#args[@]} ]; then + CUSTOM_API_IP="${args[$((i + 1))]}" + i=$((i + 1)) # Skip the next argument + else + log_error "Error: --api-ip requires an IP address" + exit 1 + fi + ;; + --api-ip=*) + CUSTOM_API_IP="${arg#*=}" + ;; -h|--help) print_ios_usage exit 0 @@ -111,6 +132,7 @@ parse_ios_args() { log_warn "Unknown argument: $arg" ;; esac + i=$((i + 1)) done } @@ -291,6 +313,13 @@ log_info "Build type: $BUILD_TYPE" # Setup environment for Capacitor build setup_build_env "capacitor" +# Override API server for iOS development when custom IP is specified +if [ "$BUILD_MODE" = "development" ] && [ -n "$CUSTOM_API_IP" ]; then + # Use custom IP for physical device development + export VITE_DEFAULT_ENDORSER_API_SERVER="http://${CUSTOM_API_IP}:3000" + log_info "iOS development mode: Using custom IP ${CUSTOM_API_IP} for physical device" +fi + # Setup application directories setup_app_directories