#!/bin/bash set -e # ╔═══════════════════════════════════════════════════════════════════════════╗ # ║ HiFastVPN macOS DMG 打包脚本 ║ # ║ ║ # ║ 使用方法: ║ # ║ 1. 确保已经运行 sign_and_notarize.sh 生成签名的 .app ║ # ║ 2. chmod +x build_dmg.sh ║ # ║ 3. ./build_dmg.sh ║ # ╚═══════════════════════════════════════════════════════════════════════════╝ # ======================== 路径配置 ======================== SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" APP_PATH="${PROJECT_DIR}/build/macos/Build/Products/Debug/HiFastVPN.app" BACKGROUND_IMAGE="${SCRIPT_DIR}/assets/dmg_bg.png" # ======================== 提取版本号 ======================== echo "╔═══════════════════════════════════════════════════════════════════╗" echo "║ HiFastVPN macOS DMG 打包脚本 ║" echo "╚═══════════════════════════════════════════════════════════════════╝" echo "" PUBSPEC_PATH="${PROJECT_DIR}/pubspec.yaml" if [ ! -f "${PUBSPEC_PATH}" ]; then echo "❌ 错误: 找不到 pubspec.yaml" exit 1 fi VERSION=$(grep "^version:" "${PUBSPEC_PATH}" | sed 's/version: *//' | tr -d ' ') if [ -z "${VERSION}" ]; then echo "❌ 错误: 无法提取版本号" exit 1 fi echo "📦 版本号: ${VERSION}" echo "📁 项目目录: ${PROJECT_DIR}" echo "📦 应用路径: ${APP_PATH}" echo "🖼️ 背景图: ${BACKGROUND_IMAGE}" echo "" # ======================== 检查依赖 ======================== if ! command -v create-dmg >/dev/null 2>&1; then echo "❌ 错误: create-dmg 未安装(brew install create-dmg)" exit 1 fi if [ ! -d "${APP_PATH}" ]; then echo "❌ 错误: HiFastVPN.app 不存在" exit 1 fi if [ ! -f "${BACKGROUND_IMAGE}" ]; then echo "❌ 错误: 背景图不存在" exit 1 fi # ======================== 校验背景图尺寸 ======================== BG_INFO=$(sips -g pixelWidth -g pixelHeight "${BACKGROUND_IMAGE}") BG_W=$(echo "$BG_INFO" | awk '/pixelWidth/ {print $2}') BG_H=$(echo "$BG_INFO" | awk '/pixelHeight/ {print $2}') if [ "$BG_W" != "1200" ] || [ "$BG_H" != "800" ]; then echo "❌ 背景图必须是 1200x800,当前是 ${BG_W}x${BG_H}" exit 1 fi # ======================== 输出目录 ======================== OUTPUT_DIR="${PROJECT_DIR}/dist/${VERSION}" mkdir -p "${OUTPUT_DIR}" DMG_NAME="HiFastVPN-${VERSION}.dmg" DMG_PATH="${OUTPUT_DIR}/${DMG_NAME}" echo "📂 输出目录: ${OUTPUT_DIR}" echo "💿 DMG 文件: ${DMG_NAME}" echo "" rm -f "${DMG_PATH}" # ======================== 创建 DMG ======================== echo "💿 开始创建 DMG..." echo "" TEMP_DIR=$(mktemp -d) cp -R "${APP_PATH}" "${TEMP_DIR}/" # ======================== Finder 坐标(左上原点,中心点对齐) ======================== # 背景:1200 × 800 # HiFastVPN.app 中心:左 228, 上 418, 尺寸 168×168 APP_CENTER_X=236 APP_CENTER_Y=428 APP_ICON_SIZE=152 APP_X=$((APP_CENTER_X + APP_ICON_SIZE / 2)) # 左上角坐标 APP_Y=$((APP_CENTER_Y + APP_ICON_SIZE / 2)) # Applications 图标中心:左 742, 上 372, 尺寸 259×259 DROP_CENTER_X=702 DROP_CENTER_Y=372 DROP_ICON_SIZE=259 DROP_X=$((DROP_CENTER_X + DROP_ICON_SIZE / 2)) DROP_Y=$((DROP_CENTER_Y + DROP_ICON_SIZE / 2)) # ======================== 打包 ======================== create-dmg \ --volname "HiFastVPN Installation" \ --background "${BACKGROUND_IMAGE}" \ --window-size 1200 800 \ --icon-size "${APP_ICON_SIZE}" \ --icon "HiFastVPN.app" "${APP_X}" "${APP_Y}" \ --app-drop-link "${DROP_X}" "${DROP_Y}" \ --hide-extension "HiFastVPN.app" \ --no-internet-enable \ "${DMG_PATH}" \ "${TEMP_DIR}" # 清理临时目录 rm -rf "${TEMP_DIR}" # ======================== 完成 ======================== echo "" echo "╔═══════════════════════════════════════════════════════════════════╗" echo "║ 🎉 DMG 创建完成! ║" echo "╚═══════════════════════════════════════════════════════════════════╝" echo "" echo "输出文件:" echo " 💿 ${DMG_PATH}" echo "" echo "📝 注意事项:" echo " • DMG 已保存到 dist/${VERSION}/ 目录" echo " • 图标和 Applications 已按设计稿中心点对齐" echo " • 此 DMG 包含已签名和公证的 .app" echo " • 可以直接分发给用户使用" echo ""