【问题标题】:Swift: Can I get information for an application which is not running?Swift:我可以获取未运行的应用程序的信息吗?
【发布时间】:2021-10-11 15:58:39
【问题描述】:

我正在编写一个存储有关其他应用程序的数据的应用程序。我可以很容易地找到当前最前面的应用程序及其信息:

let frontApp = NSWorkspace.shared.frontmostApplication!

从那里我可以得到:

let currentAppName = currentApp.localizedName ?? "Dunno"
let currentAppIcon = currentApp.icon

如果应用程序不在前台,我知道我可以遍历其他正在运行的应用程序:

let apps = NSWorkspace.shared.runningApplications
for app in apps as [NSRunningApplication] {
    print(app.localizedName ?? "whatever")
    print(app.bundleIdentifier ?? "bundle")
}

我想获得有关当前未运行但我确实拥有捆绑标识符的应用程序的相同信息。我怎样才能得到这个?

【问题讨论】:

    标签: swift macos bundle


    【解决方案1】:

    首先,使用获取应用程序的包

    let bundleURL = NSWorkspace.shared.urlForApplication(withBundleIdentifier: someBundleID)!
    let bundle = Bundle(url: bundleURL)!
    

    获得捆绑包后,您可以从NSRunningApplication 获得大部分内容:

    • bundleIdentifier你已经知道了。
    • bundleURL 你刚刚得到了上面的代码。
    • executableArchitecture 现在是 bundle.executableArchitectures,带有复数形式。因为它没有运行,所以你会得到它可以运行的所有架构,而不是运行它的特定架构。
    • executableURL 可以通过bundle.executableURL 获取,没有问题。
    • launchDateisFinishedLaunchingprocessIdentifierownsMenuBar 是无意义的,因为应用程序没有运行。

    现在我们剩下iconlocalizedName。我提出的获得这些的方法不太可靠。要获取icon,请执行

    NSWorkspace.shared.icon(forFile: bundleURL.path)
    

    我确信这至少在 99% 的情况下会产生与 NSRunningApplication.icon 相同的结果,但我不确定是否存在极端情况......

    获取localizedName 更不靠谱。有2种方法,都不好。选择最适合您目的的一种

    • FileManager.default.displayName(atPath: bundleURL.path) 这会为您提供本地化名称,但如果用户重命名应用程序,它将返回新名称,而不是包名称

    • 从捆绑包的localizedInfoDictionary 获取CFBundleDisplayName,然后使用CFBundleNameinfoDictionary。出于某种原因,这并没有给出本地化名称,即使我说的是localizedInfoDictionary

      let infoDict = (bundle.localizedInfoDictionary ?? bundle.infoDictionary)
      let localizedName = infoDict?["CFBundleDisplayName"] ?? infoDict?["CFBundleName"]
      

    【讨论】:

    • 感谢您的回答。那完成了工作。但是,我确实发现获取名称的第一个选项确实在名称的末尾有.app。我知道删除它并不难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2015-08-07
    • 2012-11-09
    相关资源
    最近更新 更多