快速构建ipa发包测试

37 阅读1分钟
#!/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"

##==================================检查 Payload 或生成==================================
echo "检查现有的 Payload 文件夹或触发 Flutter 构建"

##==================================输入更新内容==================================
while true; do
    read -p "请输入更新内容:" update_description
    if [ -n "$update_description" ]; then
        break
    else
        echo "更新内容不能为空,请重新输入"
    fi
done
#每次都重新打包新包
rm -rf "$payload_dir"

# 检查 Payload 文件夹是否存在
if [ -d "$payload_dir" ] && [ -d "$payload_dir/Runner.app" ]; then
    echo "找到现有 Payload 文件夹:$payload_dir"
    ls -ld "$payload_dir" "$payload_dir/Runner.app"
    # 检查 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

##==================================验证 Payload==================================
# 验证 Bundle Identifier
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

# 验证 Runner.app 是否为真机架构
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"
    # 可选:重新签名
    # codesign -f -s "iPhone Distribution: Your Team Name" "$payload_dir/Runner.app"
fi

##==================================打包 .ipa==================================
echo "开始从 Payload 生成 .ipa 包"
mkdir -p "$ipa_output_dir"
rm -f "$ipa_output_dir/$ipaName.ipa"
cd "$ipa_output_dir"
#-q 静默模式(quiet),不输出压缩过程的日志
#-r 递归压缩,将目录下所有子文件和子目录也一起压缩
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"