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

时间:2014-09-23 05:12:10

标签: objective-c macos cocoa nsworkspace nsrunningapplication

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

1 个答案:

答案 0 :(得分:3)

更新:如果您正在使用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 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来切换应用程序的停靠图标的存在。