我有一个从状态栏运行的 Mac 应用程序。单击
NSStatusItem
时,我会显示 NSWindow
而不是标准的 NSMenu
。
在 Sonoma 之前,当单击
NSStatusItem
时,我使用了 activate(ignoringOtherApps: true)
API(现已弃用)以确保我的应用程序成为活动应用程序。这非常有效,所以苹果决定用核武器攻击它。
在 Sonoma 上,macOS 现在显示我的窗口,但不激活应用程序,这意味着用户必须单击
NSStatusItem
,然后再次单击窗口,然后才能与我的 UI 交互。当用户“点击”窗口时,它还会产生非常不和谐的体验,因为活动应用程序最终会切换,但不是在用户期望的时候切换。我的窗口和之前活动的应用程序突然以不同的状态重绘。真丑。
最糟糕的是,该问题仅在大约 85% 的时间内发生。 15% 的情况下,系统会在显示 UI 时激活我的应用程序。我还无法确定它的模式,但这与 AppKit 发行说明相吻合,表明系统“可能”激活我的应用程序。 (毫无疑问,如果一些愚蠢的、过度设计的、机器学习的官样文章认为这是值得做的。)
问题
在单击我的 NSStatusItem 时变为活动状态,因为 (A) 这是用户所期望的,(B) 替代方案看起来 macOS 已损坏? 尝试
NSApplication.shared.setActivationPolicy()
甚至
.accessory
设置 .regular
(即使这会添加 Dock 图标和菜单栏),但问题仍然存在。NSApplication.shared.activate(ignoringOtherApps: true)
不能始终如一地工作,但似乎
NSRunningApplication.current.activate(options: .activateIgnoringOtherApps)
可以