Swift: Can I get information for an application which is not running?(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
,没有问题。launchDate
、isFinishedLaunching
、processIdentifier
、ownsMenuBar
没有意义,因为应用程序没有运行。
icon
和localizedName
。我提出的获得这些数据的方法不太可靠。若要获取icon
,请执行
NSWorkspace.shared.icon(forFile: bundleURL.path)
我确信这至少在99%的情况下会产生与NSRunningApplication.icon
相同的结果,但我不确定是否存在边缘情况...
获取localizedName
更不可靠。有两种方法,两种都不好。选择最适合您目的的
FileManager.default.displayName(atPath: bundleURL.path)
这将为您提供本地化名称,但如果用户重命名应用程序,它将返回新名称,而不是包名称从捆绑包的
localizedInfoDictionary
获取CFBundleDisplayName
,回退到CFBundleName
和infoDictionary
。由于某种原因,这并没有给出本地化名称,即使我说了localizedInfoDictionary
。let infoDict = (bundle.localizedInfoDictionary ?? bundle.infoDictionary) let localizedName = infoDict?["CFBundleDisplayName"] ?? infoDict?["CFBundleName"]
这篇关于SWIFT:我可以获取未运行的应用程序的信息吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!