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"