异常描述
macOS 26(Tahoe)上,一个 SwiftUI 菜单栏应用(MenuBarExtra + Window)启动即消失,控制台刷出大量错误:
1 | Unable to get synchronousRemoteObjectProxy, error: Error Domain=NSCocoaErrorDomain |
关键特征:
- 直接运行二进制,进程约 0.3 秒退出,exit code 0
- DiagnosticReports / Sentry 均无崩溃报告
- 应用在启动时调用了
NSApp.setActivationPolicy(.accessory)(程序坞隐藏模式) - 菜单栏图标恰好被系统隐藏
异常分析
- 刷屏的
linkd.autoShortcut错误是干扰项,每次启动都有,与退出无因果关系。 - exit 0 说明不是 crash,而是进程被优雅终止。
log stream捕获的临终序列:
1 | No windows open yet |
- 这是 macOS 26 的 SwiftUI 缺陷:
MenuBarExtra把「图标可见」绑进了 scene 生命周期。三个条件同时满足时,应用没有任何可见 UI 锚点,被 Automatic Termination 回收:
| 条件 | 说明 |
|---|---|
MenuBarExtra scene |
图标被隐藏后该 scene 失效 |
.accessory 激活策略 |
无程序坞图标 |
| 菜单栏图标被系统隐藏 | 控制中心写入,应用不可控 |
验证方法:
1 | defaults read <bundle-id> | grep NSStatusItem |
解决办法
只在菜单栏图标可见时才允许 .accessory,否则回退 .regular 保留程序坞图标。所有策略切换统一收口:
1 | /// 菜单栏图标是否被系统隐藏(控制中心写入的可见性缓存) |
系统在运行期间仍可能随时隐藏图标,补一个每秒重评的守护(图标恢复可见后会自动切回 accessory):
1 | Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in |
修复后验证(原必死组合 = accessory 开关开启 + 图标被隐藏):
| 组合 | 修复前 | 修复后 |
|---|---|---|
| accessory + 图标隐藏 | ❌ 0.3s 退出 | ✅ 存活,图标恢复可见后自动切回 accessory |
| accessory + 图标可见 | ✅ | ✅ |
| 非 accessory | ✅ | ✅ |