macOS Sonoma:出现 UI 时激活仅菜单栏的应用程序

Bry*_*yan 8 appkit nsstatusitem nsapplication swift macos-sonoma

语境

我有一个从状态栏运行的 Mac 应用程序。NSStatusItem单击an 时,我显示 anNSWindow而不是标准的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 图标和菜单栏),但问题仍然存在。

Law*_*and 1

我遇到了类似的问题,它 NSApplication.shared.activate(ignoringOtherApps: true)不能始终有效,但似乎确实NSRunningApplication.current.activate(options: .activateIgnoringOtherApps)有效