From 693e4966d490d968f7895e5be9f811d595d32844 Mon Sep 17 00:00:00 2001 From: leo12025 Date: Sat, 27 Dec 2025 19:43:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=89=93=E5=8C=85?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E5=B9=B6=E4=BC=98=E5=8C=96=E6=8C=87=E5=BC=95?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 build_and_package.sh 脚本用于自动化构建和打包 在 MenuContent 中增加对指引窗口的引用管理,避免重复创建 更新 .gitignore 忽略构建产物 添加 ExportOptions.plist 文件用于构建配置 --- .gitignore | 3 +- ExportOptions.plist | 20 ++++++++++ PowerBar/PowerBarApp.swift | 22 +++++++++++ build_and_package.sh | 75 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 ExportOptions.plist create mode 100755 build_and_package.sh diff --git a/.gitignore b/.gitignore index 2e27e60..86debfc 100644 --- a/.gitignore +++ b/.gitignore @@ -94,5 +94,6 @@ Temporary Items # PowerBar specific PowerBar.xcarchive/ ExportedApp/ +PowerBar.app +PowerBar-*.dmg PowerBar.dmg -ExportOptions.plist diff --git a/ExportOptions.plist b/ExportOptions.plist new file mode 100644 index 0000000..11aa6b8 --- /dev/null +++ b/ExportOptions.plist @@ -0,0 +1,20 @@ + + + + + method + development + signingStyle + automatic + stripSwiftSymbols + + teamID + W9MA4VFH3F + destination + export + compileBitcode + + thinning + <none> + + \ No newline at end of file diff --git a/PowerBar/PowerBarApp.swift b/PowerBar/PowerBarApp.swift index cb35be1..9826c7b 100644 --- a/PowerBar/PowerBarApp.swift +++ b/PowerBar/PowerBarApp.swift @@ -32,6 +32,8 @@ struct PowerBarApp: App { // 菜单内容视图 struct MenuContent: View { @EnvironmentObject var appState: AppState + // 保持对窗口的强引用,避免过早释放 + @State private var guideWindow: NSWindow? var body: some View { VStack(alignment: .leading, spacing: 8) { @@ -168,6 +170,13 @@ struct MenuContent: View { // 打开指引窗口 private func openGuideWindow() { + // 如果窗口已存在,直接显示 + if let existingWindow = guideWindow { + existingWindow.makeKeyAndOrderFront(nil) + return + } + + // 创建新窗口 let window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 400, height: 500), styleMask: [.titled, .closable, .resizable], @@ -183,6 +192,19 @@ struct MenuContent: View { // 记录已显示指引 UserDefaults.standard.set(true, forKey: "hasShownGuide") + + // 保存窗口引用 + guideWindow = window + + // 添加窗口关闭通知监听 + NotificationCenter.default.addObserver( + forName: NSWindow.willCloseNotification, + object: window, + queue: nil + ) { _ in + // 窗口关闭时清除引用 + guideWindow = nil + } } } diff --git a/build_and_package.sh b/build_and_package.sh new file mode 100755 index 0000000..0c31237 --- /dev/null +++ b/build_and_package.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +# PowerBar 打包脚本 +# 用于构建应用程序并创建DMG安装包 + +# 设置变量 +PROJECT_NAME="PowerBar" +SCHEME="PowerBar" +CONFIGURATION="Release" +VERSION="1.0.0" + +echo "=== PowerBar 打包脚本 v$VERSION ===" + +# 1. 清理之前的构建产物 +echo "\n1. 清理之前的构建产物..." +rm -rf "$PROJECT_NAME.app" +rm -rf "$PROJECT_NAME-$VERSION.dmg" + +# 2. 直接构建应用程序 +echo "\n2. 构建应用程序..." +xcodebuild -scheme "$SCHEME" -configuration "$CONFIGURATION" -derivedDataPath "build" build + +if [ $? -ne 0 ]; then + echo "构建失败!" + exit 1 +fi + +# 3. 复制应用程序到当前目录 +echo "\n3. 复制应用程序到当前目录..." +cp -R "build/Build/Products/$CONFIGURATION/$PROJECT_NAME.app" . + +# 4. 验证应用程序 +echo "\n4. 验证应用程序..." +if [ -d "$PROJECT_NAME.app" ]; then + echo "应用程序构建成功:$PROJECT_NAME.app" +else + echo "应用程序构建失败!" + exit 1 +fi + +# 5. 创建DMG安装包 +echo "\n5. 创建DMG安装包..." + +# 创建临时目录用于构建DMG +temp_dmg_dir="temp_dmg" +rm -rf "$temp_dmg_dir" +mkdir -p "$temp_dmg_dir" + +# 复制应用程序到临时目录 +cp -R "$PROJECT_NAME.app" "$temp_dmg_dir/" + +# 创建Applications快捷方式 +ln -s /Applications "$temp_dmg_dir/Applications" + +# 创建DMG +hdiutil create -volname "$PROJECT_NAME-$VERSION" -srcfolder "$temp_dmg_dir" -ov -format UDZO "$PROJECT_NAME-$VERSION.dmg" + +# 6. 清理临时文件 +echo "\n6. 清理临时文件..." +rm -rf "$temp_dmg_dir" +rm -rf "build" + +# 7. 验证DMG +echo "\n7. 验证DMG..." +if [ -f "$PROJECT_NAME-$VERSION.dmg" ]; then + echo "DMG创建成功:$PROJECT_NAME-$VERSION.dmg" + echo "文件大小:$(du -h "$PROJECT_NAME-$VERSION.dmg" | cut -f1)" +else + echo "DMG创建失败!" + exit 1 +fi + +echo "\n=== 打包完成! ===" +echo "应用程序:$PROJECT_NAME.app" +echo "安装包:$PROJECT_NAME-$VERSION.dmg"