Macos Mac OSX获取与强制退出应用程序类似的应用程序列表

Macos Mac OSX获取与强制退出应用程序类似的应用程序列表,macos,Macos,我想知道是否有一种方法可以获得类似于强制退出应用程序列表的应用程序列表 我不知道到目前为止我写的东西是否能让我得到这样的信息 extension ViewController: NSTableViewDelegate { fileprivate enum CellIdentifiers { static let NameCell = "cell" } func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTa

我想知道是否有一种方法可以获得类似于强制退出应用程序列表的应用程序列表

我不知道到目前为止我写的东西是否能让我得到这样的信息

extension ViewController: NSTableViewDelegate {

fileprivate enum CellIdentifiers {
    static let NameCell = "cell"
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

    var appName: String = ""
    var appIcon: NSImage?

    appName = applications[row].localizedName!
    appIcon = applications[row].icon

    if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "applicationCell"), owner: nil) as? NSTableCellView {

        cell.textField?.stringValue = appName
        cell.imageView?.image = appIcon ?? nil
        print("created")

        return cell
    }
    return nil
}
当我调试时,我会得到所有进程,但我只希望得到一个应用程序列表。这是我得到的结果的一个例子:


我们可以看到有应用程序,但也有所有进程(我不希望有)。

您的代码没有解释从哪里获得
应用程序[]
数组,但我假设它是一个
NSRunningApplication
对象数组,这些对象是通过
runningApplications()
获得的

如果您只需要“常规”应用程序,即用户启动并出现在dock中的应用程序,您可能需要进行一些挖掘

首先,检查应用程序是否有
bundleURL
。常规应用程序总是在一个捆绑包中,没有捆绑包的任何进程都可以忽略

然后可以使用
NSBundle
读取捆绑包的
Info.plist
文件(请参见
infoDictionary
)。使用此词典,您可以判断它是否是常规应用程序(
CFBundlePackageType
is
APPL
)。该测试将从列表中排除服务、插件等

您还可以通过查看它是否将
LSUIElement
属性设置为
1
来判断它是否是“后台”应用程序(未出现在dock中的应用程序)


这应该将列表缩小到用户通常会与之交互的那些应用。

如何获得另一个应用程序的捆绑包(如第4段所述),您可以根据其URL为任何捆绑包/包创建捆绑包对象。请参阅
Bundle(url:)