#if os(macOS) import SwiftUI // 原生 macOS 客户端入口。单窗口 + 菜单栏常驻。桌面壳(MacRootView)替代 iOS 的标签栏。引擎(离屏 // WKWebView 跑 JS 引擎 + 原生 libwebrtc 数据面)与鉴权(Broker 登录)由 App 级 MacBackgroundController // 持有并驱动后台续跑——引擎 WebView 挂常驻隐藏窗口,关主窗口仍在菜单栏后台同步(见 MacAppDelegate / // MacBackgroundController)。iOS 入口另见 CDropApp。 @main struct CommilitiaDropMacApp: App { @NSApplicationDelegateAdaptor(MacAppDelegate.self) private var appDelegate // engine / auth 由 App 级 MacBackgroundController 持有(生命周期与 App 一致、不随窗口显隐,以支持 // 关窗后台续跑);此处仅引用、经 .environment 注入视图观察。 private var engine: EngineController { MacBackgroundController.shared.engine } private var auth: AuthManager { MacBackgroundController.shared.auth } 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) } } // 登录门:有会话进桌面壳,无会话进原生 Broker 登录页。引擎的启停 / 记录加载 / 后台常驻由 // MacBackgroundController 统一管(观察 auth.session),故本视图只做界面切换、不挂引擎生命周期。 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) } } } } #endif