// PangolinLoginHelper — 无界面登录项 helper(学 Tailscale 的 LoginItemHelper)。 // // 由 SMAppService.loginItem 在用户登录时拉起;它唯一的活儿:带 --autostart 启动主 app // (让主 app 隐藏到托盘,见主 app main.dart / MainFlutterWindow),然后自己退出。 // 打进主 app 的 Contents/Library/LoginItems/PangolinLoginHelper.app(见 build_login_helper.sh)。 import AppKit // helper 位于 .app/Contents/Library/LoginItems/PangolinLoginHelper.app // 主 app = helper bundle 上溯 4 级(LoginItems → Library → Contents → .app)。 let helperURL = Bundle.main.bundleURL let mainAppURL = helperURL .deletingLastPathComponent() // LoginItems .deletingLastPathComponent() // Library .deletingLastPathComponent() // Contents .deletingLastPathComponent() // .app let config = NSWorkspace.OpenConfiguration() config.arguments = ["--autostart"] // 主 app 据此隐藏到托盘 config.activates = false // 不抢焦点 config.addsToRecentItems = false let done = DispatchSemaphore(value: 0) NSWorkspace.shared.openApplication(at: mainAppURL, configuration: config) { _, _ in done.signal() } // 等启动请求发出(最多 10s)再退出,避免 helper 过早结束导致启动被取消。 _ = done.wait(timeout: .now() + 10)