feat: 添加打包脚本并优化指引窗口管理
添加 build_and_package.sh 脚本用于自动化构建和打包 在 MenuContent 中增加对指引窗口的引用管理,避免重复创建 更新 .gitignore 忽略构建产物 添加 ExportOptions.plist 文件用于构建配置
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -94,5 +94,6 @@ Temporary Items
|
|||||||
# PowerBar specific
|
# PowerBar specific
|
||||||
PowerBar.xcarchive/
|
PowerBar.xcarchive/
|
||||||
ExportedApp/
|
ExportedApp/
|
||||||
|
PowerBar.app
|
||||||
|
PowerBar-*.dmg
|
||||||
PowerBar.dmg
|
PowerBar.dmg
|
||||||
ExportOptions.plist
|
|
||||||
|
|||||||
20
ExportOptions.plist
Normal file
20
ExportOptions.plist
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>method</key>
|
||||||
|
<string>development</string>
|
||||||
|
<key>signingStyle</key>
|
||||||
|
<string>automatic</string>
|
||||||
|
<key>stripSwiftSymbols</key>
|
||||||
|
<true/>
|
||||||
|
<key>teamID</key>
|
||||||
|
<string>W9MA4VFH3F</string>
|
||||||
|
<key>destination</key>
|
||||||
|
<string>export</string>
|
||||||
|
<key>compileBitcode</key>
|
||||||
|
<false/>
|
||||||
|
<key>thinning</key>
|
||||||
|
<string><none></string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -32,6 +32,8 @@ struct PowerBarApp: App {
|
|||||||
// 菜单内容视图
|
// 菜单内容视图
|
||||||
struct MenuContent: View {
|
struct MenuContent: View {
|
||||||
@EnvironmentObject var appState: AppState
|
@EnvironmentObject var appState: AppState
|
||||||
|
// 保持对窗口的强引用,避免过早释放
|
||||||
|
@State private var guideWindow: NSWindow?
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .leading, spacing: 8) {
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
@@ -168,6 +170,13 @@ struct MenuContent: View {
|
|||||||
|
|
||||||
// 打开指引窗口
|
// 打开指引窗口
|
||||||
private func openGuideWindow() {
|
private func openGuideWindow() {
|
||||||
|
// 如果窗口已存在,直接显示
|
||||||
|
if let existingWindow = guideWindow {
|
||||||
|
existingWindow.makeKeyAndOrderFront(nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建新窗口
|
||||||
let window = NSWindow(
|
let window = NSWindow(
|
||||||
contentRect: NSRect(x: 0, y: 0, width: 400, height: 500),
|
contentRect: NSRect(x: 0, y: 0, width: 400, height: 500),
|
||||||
styleMask: [.titled, .closable, .resizable],
|
styleMask: [.titled, .closable, .resizable],
|
||||||
@@ -183,6 +192,19 @@ struct MenuContent: View {
|
|||||||
|
|
||||||
// 记录已显示指引
|
// 记录已显示指引
|
||||||
UserDefaults.standard.set(true, forKey: "hasShownGuide")
|
UserDefaults.standard.set(true, forKey: "hasShownGuide")
|
||||||
|
|
||||||
|
// 保存窗口引用
|
||||||
|
guideWindow = window
|
||||||
|
|
||||||
|
// 添加窗口关闭通知监听
|
||||||
|
NotificationCenter.default.addObserver(
|
||||||
|
forName: NSWindow.willCloseNotification,
|
||||||
|
object: window,
|
||||||
|
queue: nil
|
||||||
|
) { _ in
|
||||||
|
// 窗口关闭时清除引用
|
||||||
|
guideWindow = nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
75
build_and_package.sh
Executable file
75
build_and_package.sh
Executable file
@@ -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"
|
||||||
Reference in New Issue
Block a user