如何阻止macOS应用残留于Dock的「最近使用」区域
问题解答
1. 区域确认
你观察到的无运行状态指示器、关闭窗口后依然停留的图标,确实属于Dock的最近使用应用区域。该区域是macOS的默认功能,会自动记录用户近期打开过的应用,条目存在性和应用当前是否正在运行没有关联。
2. 残留原因
当你调用NSApp.setActivationPolicy(.regular)时,系统会判定应用进入普通应用的激活状态,自动将应用加入「最近使用应用」列表,后续切换回.accessory模式的操作不会自动清除这个历史记录,因此会出现残留图标。
注意:你无法强制修改用户的系统Dock配置,下述方案均为应用层面的适配,不会影响用户其他应用的Dock使用习惯。
3. 可用解决方案
方案1(兼容性最好,支持App Store提交)
在应用的Info.plist中添加两个配置项:LSUIElement:值设为YES,标记应用为Agent类型,和你现有基础逻辑一致LSDoNotRegisterUserActivity:值设为YES,阻止系统将应用的激活行为记录到用户活动历史,从根源避免被加入最近使用列表
这个方案不会影响你现有切换activationPolicy的逻辑,窗口弹出时Dock正常展示图标,关闭后隐藏,不会产生残留条目。
方案2(适配macOS 10.15+)
将窗口显示前调用的激活策略从.regular替换为.provisional:
NSApp.setActivationPolicy(.provisional)
这个模式下应用会正常显示Dock图标、出现在Cmd+Tab切换列表,但如果用户没有主动点击Dock图标或者和应用做深度交互,应用不会被计入最近使用列表,窗口关闭切换回.accessory后不会有残留。
- 方案3(仅适合非App Store分发场景)
如果前两种方案不适用,你可以在切换回.accessory模式后,执行AppleScript命令移除对应最近使用条目并重启Dock:
tell application "Dock" to delete (every item of recent applications where bundle identifier is "替换为你的应用bundle ID") tell application "Dock" to restart
注意该方案需要申请沙箱临时例外权限,无法通过App Store审核。
内容的提问来源于stack exchange,提问作者Ruzard
相关产品推荐
相关产品推荐

