#!/usr/bin/env bash # 本机 iOS Release:切换 env → expo prebuild → 打开 Xcode 打 Archive 上传 TestFlight。 # # 用法(在仓库任意目录): # app-expo/scripts/ios-prebuild.sh staging # app-expo/scripts/ios-prebuild.sh production # # 或通过 npm(在 app-expo 目录): # npm run ios:prebuild:staging # npm run ios:prebuild:production # # Xcode 内后续步骤(脚本不会自动执行): # 1. 选 Any iOS Device(或 Generic iOS Device) # 2. Product → Archive # 3. Distribute App → App Store Connect → Upload(进入 TestFlight) # # 可选:与 CI 对齐版本(默认读 package.json): # APP_VERSION=1.2.0 APP_BUILD_NUMBER=42 bash scripts/ios-prebuild.sh production set -euo pipefail ENV="${1:-}" if [[ -z "$ENV" ]]; then echo "Usage: $(basename "$0") " >&2 exit 1 fi case "$ENV" in staging | production | development) ;; *) echo "Unknown environment: $ENV (expected staging, production, or development)" >&2 exit 1 ;; esac ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT" echo "==> Switching to env/${ENV} → .env" npm run use-env -- "$ENV" # Release Archive 时 NODE_ENV=production,Expo 会加载根目录 .env.production 并覆盖 .env for legacy in .env.production .env.staging .env.development; do if [[ -f "$legacy" ]]; then echo "::error::Found legacy $legacy — it overrides use-env on Release builds. Use app-expo/env/ templates only." >&2 exit 1 fi done echo "==> expo prebuild --platform ios --clean" npx expo prebuild --platform ios --clean echo "==> ensure expo-sqlite native sources + pod install" node scripts/ensure-expo-sqlite-ios.js (cd ios && pod install) resolve_ios_workspace() { local preferred="ios/LifeEcho.xcworkspace" shopt -s nullglob local workspaces=(ios/*.xcworkspace) shopt -u nullglob if [[ ${#workspaces[@]} -eq 0 ]]; then echo "No ios/*.xcworkspace found after prebuild." >&2 exit 1 fi # Drop stale workspaces left by a previous variant prebuild. for ws in "${workspaces[@]}"; do local proj_ref proj_ref="$(sed -n 's/.*location = "group:\([^"]*\.xcodeproj\)".*/\1/p' "$ws/contents.xcworkspacedata" | head -n1)" if [[ -n "$proj_ref" && ! -d "ios/$proj_ref" ]]; then echo "==> Removing stale workspace (missing $proj_ref): $ws" rm -rf "$ws" fi done shopt -s nullglob workspaces=(ios/*.xcworkspace) shopt -u nullglob if [[ -d "$preferred" ]]; then echo "$preferred" return fi if [[ ${#workspaces[@]} -gt 1 ]]; then echo "Multiple workspaces found; opening the first: ${workspaces[0]}" >&2 fi echo "${workspaces[0]}" } WORKSPACE="$(resolve_ios_workspace)" echo "==> Opening ${WORKSPACE} (always use .xcworkspace, never .xcodeproj)" open "${WORKSPACE}" cat <