[NSWorkspace runningApplications]
除了手动检查每个应用程序的 plist 是否有 UIAgent 键之外,有没有办法过滤由提供的应用程序列表以隐藏所有守护程序等?如果应用程序没有显示在 Dock 中,我对此不感兴趣。
1 回答
更新:如果您使用的是 Objective-C,我在下面的原始答案仍然适用,但如果您使用的是 Swift,这可以很容易地更干净地执行,这要归功于 Swift 的filter
集合类型函数。
let workspace = NSWorkspace.sharedWorkspace()
let apps = workspace.runningApplications.filter { (app) -> Bool in
return app.activationPolicy == .Regular
};
在 Objective-C 中,类似的事情可以用 NSArray 的各种基于谓词和枚举的方法来完成,但它们会比它们的 Swift 对应物更冗长一些。
经过一番搜索,我找到了答案,但这可能不会立即显而易见。
仅抓取在 Dock 中有图标的进程的一种简单方法是执行简单的快速枚举循环并检查每个NSRunningApplication
's activationPolicy
,如下所示:
NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
NSArray *apps = [workspace runningApplications];
for (NSRunningApplication *a in apps) {
if (a.activationPolicy == NSApplicationActivationPolicyRegular) {
// Do stuff here
}
}
通常,具有普通窗口和停靠图标的应用程序使用NSApplicationActivationPolicyRegular
. 菜单附加功能和 Alfred 类型的应用程序使用NSApplicationActivationPolicyAccessory
. 没有任何用户可见性的守护进程等使用NSApplicationActivationPolicyProhibited
. 这些常量与每个应用程序的 Info.plist 中的 LSUIElement 和 LSBackgroundOnly 键对应。
这种方法应该捕获具有允许用户通过动态设置来切换应用程序停靠图标的存在的设置的应用程序activationPolicy
。