SWIFT:我可以获取未运行的应用程序的信息吗? [英] Swift: Can I get information for an application which is not running?

查看:30
本文介绍了SWIFT:我可以获取未运行的应用程序的信息吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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")
}
我希望获得有关当前未运行的应用程序的相同信息,但我确实知道该应用程序的捆绑包标识符。我怎样才能得到这个?

推荐答案

首先,使用

获取应用程序的捆绑包
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更不可靠。有两种方法,两种都不好。选择最适合您目的的

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

  • 从捆绑包的localizedInfoDictionary获取CFBundleDisplayName,回退到CFBundleNameinfoDictionary。由于某种原因,这并没有给出本地化名称,即使我说了localizedInfoDictionary

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

这篇关于SWIFT:我可以获取未运行的应用程序的信息吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆