过滤 [NSWorkspace runningApplications] 以仅包含用户应用程序(无守护程序/UIAgents)

Joh*_*lls 4 macos cocoa objective-c nsworkspace nsrunningapplication

有没有办法过滤由 给出的应用程序列表[NSWorkspace runningApplications]以隐藏所有守护进程等,而无需手动检查每个应用程序的 plist 中的 UIAgent 密钥?如果应用程序没有显示在扩展坞中,则我对它不感兴趣。

Joh*_*lls 9

更新:如果你\xe2\x80\x99使用Objective-C,我下面的原始答案仍然适用,但是如果你\xe2\x80\x99使用Swift,这可以很容易地更干净地执行,这要归功于Swift\xe2\x80\filter用于集合类型的x99s函数。

\n\n
let workspace = NSWorkspace.sharedWorkspace()\nlet apps = workspace.runningApplications.filter { (app) -> Bool in\n    return app.activationPolicy == .Regular\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Objective-C 中,可以使用 NSArray\xe2\x80\x99 的各种基于谓词和枚举的方法来完成类似的操作,但它们\xe2\x80\x99 会比 Swift 对应的方法更冗长一些。

\n\n
\n\n

经过一番搜索后,我找到了答案,但这可能不会立即显而易见。

\n\n

仅获取 Dock 中具有图标的进程的一种简单方法是执行简单的快速枚举循环并检查每个NSRunningApplication's activationPolicy,如下所示:

\n\n
NSWorkspace *workspace = [NSWorkspace sharedWorkspace];\nNSArray *apps = [workspace runningApplications];\n\nfor (NSRunningApplication *a in apps) {\n    if (a.activationPolicy == NSApplicationActivationPolicyRegular) {\n        // Do stuff here\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

通常,具有普通窗口和停靠栏图标的应用程序使用NSApplicationActivationPolicyRegular. 菜单附加功能和 Alfred 类型的应用程序使用NSApplicationActivationPolicyAccessory. 没有用户可见性的守护进程等NSApplicationActivationPolicyProhibited. 这些常量与每个应用程序的 Info.plist 中的 LSUIElement 和 LSBackgroundOnly 键相对应。

\n\n

此方法应该捕获具有允许用户通过activationPolicy动态设置来切换应用程序停靠图标的存在的设置的应用程序。

\n