#!/bin/bash
SECONDS=0
buildName="3.0.99"
buildNumber="20230"
appEnv="dev"
ipaName="app_v${buildName}_${buildNumber}"
update_description="1.更新描述"
base_dir=$(pwd)
payload_dir="$base_dir/fast_ios_app/Payload"
ipa_output_dir="$base_dir/fast_ios_app"
flutter_build_path="$base_dir/build/ios/iphoneos/Runner.app"
echo "当前工作目录:$base_dir"
echo "Payload 路径:$payload_dir"
echo "IPA 输出路径:$ipa_output_dir"
echo "Flutter 构建路径:$flutter_build_path"
echo "检查现有的 Payload 文件夹或触发 Flutter 构建"
while true; do
read -p "请输入更新内容:" update_description
if [ -n "$update_description" ]; then
break
else
echo "更新内容不能为空,请重新输入"
fi
done
rm -rf "$payload_dir"
if [ -d "$payload_dir" ] && [ -d "$payload_dir/Runner.app" ]; then
echo "找到现有 Payload 文件夹:$payload_dir"
ls -ld "$payload_dir" "$payload_dir/Runner.app"
if [ -d "$flutter_build_path" ] && [ "$flutter_build_path" -nt "$payload_dir/Runner.app" ]; then
echo "检测到更新的 Runner.app,重新复制到 Payload..."
rm -rf "$payload_dir/Runner.app"
cp -r "$flutter_build_path" "$payload_dir/Runner.app"
else
echo "Payload 中的 Runner.app 已是最新,跳过 Flutter 构建"
fi
else
echo "未找到 Payload 文件夹或 Runner.app,触发 flutter build ios..."
flutter --version
flutter build ios --release --build-name="$buildName" --build-number="$buildNumber" --dart-define=APP_ENV="$appEnv" --dart-define=iOSDebug=ios
if [ $? -eq 0 ]; then
if [ -d "$flutter_build_path" ]; then
mkdir -p "$payload_dir"
cp -r "$flutter_build_path" "$payload_dir/Runner.app"
echo "成功生成 Payload 文件夹:$payload_dir"
ls -ld "$payload_dir/Runner.app"
else
echo "😭 错误:flutter build ios 未生成 Runner.app,请检查 Flutter 配置"
say "打包失败"
exit 1
fi
else
echo "😭 错误:flutter build ios 失败,请检查错误日志"
say "打包失败"
exit 1
fi
fi
info_plist="$payload_dir/Runner.app/Info.plist"
if [ -f "$info_plist" ]; then
bundle_id=$(/usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" "$info_plist" 2>/dev/null)
if [ -n "$bundle_id" ]; then
echo "Bundle Identifier: $bundle_id"
else
echo "😭 错误:Info.plist 中未找到 CFBundleIdentifier"
say "打包失败"
exit 1
fi
else
echo "😭 错误:未找到 Info.plist 文件:$info_plist"
say "打包失败"
exit 1
fi
binary_path=$(find "$payload_dir/Runner.app" -type f -name "Runner")
if [ -n "$binary_path" ]; then
archs=$(lipo -info "$binary_path" | grep -oE "architecture:.*" | awk '{print $2}')
if [[ "$archs" == *"arm64"* ]]; then
echo "Runner.app 是真机架构 (arm64),可以继续打包"
else
echo "😭 错误:Runner.app 是模拟器架构 ($archs),无法用于 .ipa 打包"
say "打包失败"
exit 1
fi
else
echo "😭 错误:未找到 Runner.app 中的可执行文件"
say "打包失败"
exit 1
fi
codesign_output=$(codesign -v "$payload_dir/Runner.app" 2>&1)
if [ $? -eq 0 ]; then
echo "Runner.app 已正确签名"
else
echo "⚠️ 警告:Runner.app 签名无效,可能需要重新签名:$codesign_output"
fi
echo "开始从 Payload 生成 .ipa 包"
mkdir -p "$ipa_output_dir"
rm -f "$ipa_output_dir/$ipaName.ipa"
cd "$ipa_output_dir"
zip -q -r "$ipaName.ipa" Payload
cd ..
if [ -f "$ipa_output_dir/$ipaName.ipa" ]; then
echo "🎉 打包成功!生成文件:$ipa_output_dir/$ipaName.ipa"
else
echo "😭 打包失败,请检查 Payload 文件夹内容"
say "打包失败"
exit 1
fi
API_KEY="xxxxxxxxxxxxxxxxxxx"
IPA_PATH="$ipa_output_dir/$ipaName.ipa"
echo "开始上传到蒲公英:$IPA_PATH"
UPLOAD_RESULT=$(curl -F "file=@$IPA_PATH" -F "_api_key=$API_KEY" -F "buildInstallType=1" -F "buildUpdateDescription=$update_description" https://www.pgyer.com/apiv2/app/upload)
echo "$UPLOAD_RESULT"
if [[ "$UPLOAD_RESULT" =~ \"code\":0 ]]; then
echo "🎉 蒲公英上传成功"
say "分发到蒲公英成功"
else
echo "😭 蒲公英上传失败:$UPLOAD_RESULT"
say "上传失败"
exit 1
fi
open "$ipa_output_dir"
echo "📅 Finished. Elapsed time: ${SECONDS}s"