#if os(macOS) import SwiftUI // 原生 macOS 客户端入口。单窗口 + 菜单栏常驻,桌面壳(MacRootView)替代 iOS 的标签栏。复用 iOS 引擎 // (EngineController:离屏 WKWebView 跑 JS 引擎 + 原生 libwebrtc 数据面)与鉴权(AuthManager:Broker // 登录);引擎 WebView 挂在 MacRootView 背景保活(登录后才启)。iOS 入口另见 CDropApp。桌面专属功能 // (剪贴板自动同步 / 全局热键 / 原生通知)随后续阶段并入。 @main struct CommilitiaDropMacApp: App { @State private var auth = AuthManager() @State private var engine = EngineController() var body: some Scene { Window("Commilitia Drop", id: "main") { MacAppRoot(auth: auth, engine: engine) .frame(minWidth: 820, minHeight: 560) } .defaultLaunchBehavior(.presented) .windowResizability(.contentMinSize) .commands { // 单窗口应用:移除「新建」(⌘N),对本应用无意义。 CommandGroup(replacing: .newItem) {} } MenuBarExtra { MacMenuContent() .environment(engine) .environment(auth) } label: { Image(systemName: "paperplane") } .menuBarExtraStyle(.window) } } // 登录门:有会话进桌面壳(引擎随 MacRootView 背景 WebView 启动),无会话进原生 Broker 登录页。逻辑 // 对齐 iOS 的 AppRoot(CDropApp):注入 auth 源、会话激活即按 userId 加载持久记录。 struct MacAppRoot: View { let auth: AuthManager let engine: EngineController var body: some View { Group { if auth.session != nil { MacRootView() .environment(engine) .environment(auth) } else { MacLoginView() .environment(auth) } } .onAppear { engine.auth = auth // 冷启已有会话:立即按 userId 加载该用户的持久记录(reset 只清内存不动盘)。 if let uid = auth.session?.user.id { engine.activateRecords(userId: uid) } } .onChange(of: auth.session?.user.id) { _, uid in if let uid { engine.activateRecords(userId: uid) } } } } #endif