This commit is contained in:
anlicheng 2026-03-23 16:05:46 +08:00
parent 03a26b2f31
commit aca4bf1ec2
6 changed files with 71 additions and 16 deletions

View File

@ -0,0 +1,38 @@
//
// LaunchManager.swift
// punchnet
//
// Created by on 2026/3/23.
//
import ServiceManagement
import Observation
@Observable
class LaunchManager {
// App
private let service = SMAppService.mainApp
//
var launchAtLogin: Bool
init() {
self.launchAtLogin = (service.status == .enabled)
}
func toggleLaunchAtLogin(enabled: Bool) throws {
if enabled {
try service.register()
} else {
try service.unregister()
}
// 3. View
self.launchAtLogin = (service.status == .enabled)
}
// 4.
func refreshLaunchStatus() {
self.launchAtLogin = (service.status == .enabled)
}
}

View File

@ -29,22 +29,18 @@ extension SDLAPIClient {
let hasUpdate: Bool let hasUpdate: Bool
let latestVersion: String let latestVersion: String
let latestBuild: Int let latestBuild: Int
// url let forceUpdate: Bool
let forceUpdateUrl: String? let downloadUrl: String
let releaseNotes: String let releaseNotes: String
let minSupportedVersion: String let minSupportedVersion: String
let publishTime: Int let publishTime: Int
//
var forceUpdate: Bool {
return forceUpdateUrl != nil
}
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case hasUpdate = "has_update" case hasUpdate = "has_update"
case latestVersion = "latest_version" case latestVersion = "latest_version"
case latestBuild = "latest_build" case latestBuild = "latest_build"
case forceUpdateUrl = "force_update" case forceUpdate = "force_update"
case downloadUrl = "download_url"
case releaseNotes = "release_notes" case releaseNotes = "release_notes"
case minSupportedVersion = "min_supported_version" case minSupportedVersion = "min_supported_version"
case publishTime = "publish_time" case publishTime = "publish_time"

View File

@ -7,11 +7,14 @@
import SwiftUI import SwiftUI
struct SettingsSystemView: View { struct SettingsSystemView: View {
//
@State private var launchManager = LaunchManager()
// //
@State private var launchAtLogin: Bool = false @AppStorage("autoConnect") private var autoConnect: Bool = false
@State private var autoConnect: Bool = false @AppStorage("autoUpdate") private var autoUpdate: Bool = true
@State private var showMainUI: Bool = true @State private var showMainUI: Bool = true
@State private var autoUpdate: Bool = true
var body: some View { var body: some View {
ScrollView(.vertical, showsIndicators: false) { ScrollView(.vertical, showsIndicators: false) {
@ -21,13 +24,26 @@ struct SettingsSystemView: View {
systemSectionHeader(title: "启动与运行", icon: "power.circle.fill") systemSectionHeader(title: "启动与运行", icon: "power.circle.fill")
VStack(spacing: 0) { VStack(spacing: 0) {
ToggleRow(icon: "macwindow.badge.plus", title: "开机时自动启动", isOn: $launchAtLogin) ToggleRow(icon: "macwindow.badge.plus", title: "开机时自动启动", isOn: Binding(
get: {
launchManager.launchAtLogin
},
set: { newValue in
do {
try launchManager.toggleLaunchAtLogin(enabled: newValue)
} catch let err {
NSLog("toggle get error: \(err)")
}
}
))
Divider().padding(.leading, 48) // Divider()
.padding(.leading, 48) //
ToggleRow(icon: "bolt.horizontal.icloud.fill", title: "应用启动后自动连接", isOn: $autoConnect) ToggleRow(icon: "bolt.horizontal.icloud.fill", title: "应用启动后自动连接", isOn: $autoConnect)
Divider().padding(.leading, 48) Divider()
.padding(.leading, 48)
ToggleRow(icon: "macwindow", title: "启动时显示主界面", isOn: $showMainUI) ToggleRow(icon: "macwindow", title: "启动时显示主界面", isOn: $showMainUI)
} }
@ -56,6 +72,9 @@ struct SettingsSystemView: View {
.padding(32) .padding(32)
.frame(maxWidth: 600, alignment: .leading) .frame(maxWidth: 600, alignment: .leading)
} }
.onAppear {
}
} }
// //

View File

@ -38,6 +38,7 @@ class AppUpdateManager {
} catch { } catch {
print("Update check failed: \(error)") print("Update check failed: \(error)")
} }
return false return false
} }
} }

View File

@ -55,7 +55,7 @@ struct AppUpdateView: View {
} }
Button { Button {
if let forceUpdateUrl = info.forceUpdateUrl, let url = URL(string: forceUpdateUrl) { if let url = URL(string: info.downloadUrl) {
NSWorkspace.shared.open(url) NSWorkspace.shared.open(url)
} }
} label: { } label: {

View File

@ -45,7 +45,8 @@ struct punchnetApp: App {
var body: some Scene { var body: some Scene {
WindowGroup(id: "main") { WindowGroup(id: "main") {
RootView() // RootView()
SettingsView()
.navigationTitle("") .navigationTitle("")
.environment(self.appContext) .environment(self.appContext)
.environment(self.userContext) .environment(self.userContext)