#!/bin/bash # usage: # ./scripts/build_ios.sh --output /absolute/path/to/output.ipa [extra flutter build args...] # ./scripts/build_ios.sh --output /absolute/path/to/dir [extra flutter build args...] set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" DEFAULT_OUTPUT_DIR="$PROJECT_ROOT/build/ios_release" OUTPUT_DIR="$DEFAULT_OUTPUT_DIR" EXTRA_ARGS=() while [[ $# -gt 0 ]]; do case "$1" in --output=*) OUTPUT_DIR="${1#*=}" shift ;; --output) if [[ $# -lt 2 ]]; then echo "参数错误: --output 需要一个路径" >&2 exit 1 fi OUTPUT_DIR="$2" shift 2 ;; *) EXTRA_ARGS+=("$1") shift ;; esac done mkdir -p "$OUTPUT_DIR" pushd "$PROJECT_ROOT" >/dev/null echo "📦 清理旧构建..." flutter clean echo "📚 获取依赖..." flutter pub get echo "🚀 开始构建 iOS IPA..." if [[ ${#EXTRA_ARGS[@]} -gt 0 ]]; then flutter build ipa --release "${EXTRA_ARGS[@]}" else flutter build ipa --release fi # IPA build output is typically in build/ios/ipa/ IPA_DIR="$PROJECT_ROOT/build/ios/ipa" BUILT_IPA="$(find "$IPA_DIR" -maxdepth 1 -name '*.ipa' -print | head -n 1)" if [[ -z "$BUILT_IPA" || ! -f "$BUILT_IPA" ]]; then echo "❌ 错误: 未找到构建出的 IPA 文件" >&2 echo "构建产物目录:$IPA_DIR" >&2 exit 1 fi # Determine target path if [[ "$OUTPUT_DIR" == *.ipa ]]; then # Output is a file path TARGET_PATH="$OUTPUT_DIR" mkdir -p "$(dirname "$TARGET_PATH")" else # Output is a directory mkdir -p "$OUTPUT_DIR" TARGET_PATH="$OUTPUT_DIR/$(basename "$BUILT_IPA")" fi cp "$BUILT_IPA" "$TARGET_PATH" echo "✅ 构建完成,IPA 已保存到:$TARGET_PATH" popd >/dev/null