89 lines
2.9 KiB
Bash
Executable File
89 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# 一键发布 TestFlight:archive → export → 上传 App Store Connect
|
|
# 用法:
|
|
# ./scripts/release-testflight.sh # 用当前 build 号
|
|
# BUMP=1 ./scripts/release-testflight.sh # 自动递增 build 号后再发布
|
|
# 认证:依赖 Xcode 已登录的 Apple ID(Xcode → Settings → Accounts)
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
PROJECT="${PROJECT:-$ROOT_DIR/康康.xcodeproj}"
|
|
SCHEME="${SCHEME:-康康}"
|
|
CONFIGURATION="${CONFIGURATION:-Release}"
|
|
BUILD_DIR="$ROOT_DIR/build/Release"
|
|
ARCHIVE_PATH="$BUILD_DIR/${SCHEME}.xcarchive"
|
|
EXPORT_PATH="$BUILD_DIR/export"
|
|
EXPORT_PLIST="$BUILD_DIR/ExportOptions.plist"
|
|
TEAM_ID="${TEAM_ID:-F2C8C774FG}"
|
|
|
|
require_full_xcode() {
|
|
local developer_dir
|
|
developer_dir="$(xcode-select -p 2>/dev/null || true)"
|
|
if [[ "$developer_dir" != *"/Xcode.app/Contents/Developer"* ]]; then
|
|
cat >&2 <<EOF
|
|
error: 当前 developer directory 不是完整 Xcode:
|
|
${developer_dir:-<unset>}
|
|
请先执行:
|
|
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
|
|
EOF
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
require_full_xcode
|
|
mkdir -p "$BUILD_DIR"
|
|
|
|
# 可选:递增 build 号
|
|
if [[ "${BUMP:-0}" == "1" ]]; then
|
|
CURRENT=$(sed -n 's/.*CURRENT_PROJECT_VERSION = \([0-9]*\);.*/\1/p' "$PROJECT/project.pbxproj" | head -1)
|
|
NEXT=$((CURRENT + 1))
|
|
sed -i '' "s/CURRENT_PROJECT_VERSION = $CURRENT;/CURRENT_PROJECT_VERSION = $NEXT;/g" "$PROJECT/project.pbxproj"
|
|
echo "==> Build 号: $CURRENT → $NEXT"
|
|
fi
|
|
|
|
BUILD_NUM=$(sed -n 's/.*CURRENT_PROJECT_VERSION = \([0-9]*\);.*/\1/p' "$PROJECT/project.pbxproj" | head -1)
|
|
VERSION=$(sed -n 's/.*MARKETING_VERSION = \([0-9.]*\);.*/\1/p' "$PROJECT/project.pbxproj" | head -1)
|
|
echo "==> 发布 v$VERSION ($BUILD_NUM)"
|
|
|
|
echo "==> [1/3] Archive..."
|
|
rm -rf "$ARCHIVE_PATH"
|
|
xcodebuild archive \
|
|
-project "$PROJECT" \
|
|
-scheme "$SCHEME" \
|
|
-configuration "$CONFIGURATION" \
|
|
-destination 'generic/platform=iOS' \
|
|
-archivePath "$ARCHIVE_PATH" \
|
|
-allowProvisioningUpdates
|
|
|
|
echo "==> [2/3] 生成 ExportOptions.plist..."
|
|
cat > "$EXPORT_PLIST" <<EOF
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>method</key>
|
|
<string>app-store-connect</string>
|
|
<key>destination</key>
|
|
<string>upload</string>
|
|
<key>teamID</key>
|
|
<string>$TEAM_ID</string>
|
|
<key>uploadSymbols</key>
|
|
<true/>
|
|
<key>manageAppVersionAndBuildNumber</key>
|
|
<false/>
|
|
</dict>
|
|
</plist>
|
|
EOF
|
|
|
|
echo "==> [3/3] Export 并上传 App Store Connect..."
|
|
rm -rf "$EXPORT_PATH"
|
|
xcodebuild -exportArchive \
|
|
-archivePath "$ARCHIVE_PATH" \
|
|
-exportOptionsPlist "$EXPORT_PLIST" \
|
|
-exportPath "$EXPORT_PATH" \
|
|
-allowProvisioningUpdates
|
|
|
|
echo ""
|
|
echo "✅ v$VERSION ($BUILD_NUM) 已上传。App Store Connect 处理完成后(约 5-15 分钟)即可在 TestFlight 分发。"
|
|
echo " https://appstoreconnect.apple.com/apps"
|