gpt4 book ai didi

Swift:我可以获取未运行的应用程序的信息吗?

转载 作者:行者123 更新时间:2023-12-04 08:45:03 25 4
gpt4 key购买 nike

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

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)!
获得 bundle 后,您可以获得大部分可以从 NSRunningApplication 获得的东西。 :
  • bundleIdentifier你已经知道了。
  • bundleURL你刚刚得到了上面的代码。
  • executableArchitecture现在是 bundle.executableArchitectures ,带复数。因为它没有运行,所以你会得到它可以运行的所有架构,而不是它正在运行的特定架构。
  • executableURL您可以通过 bundle.executableURL 获得,没有问题。
  • launchDate , isFinishedLaunching , processIdentifier , ownsMenuBar获取是无意义的,因为应用程序没有运行。

  • 现在我们只剩下 iconlocalizedName .我建议的获得这些的方法不太可靠。获取 icon , 做
    NSWorkspace.shared.icon(forFile: bundleURL.path)
    我确定这会产生与 NSRunningApplication.icon 相同的结果至少 99% 的时间,但我不确定是否存在边缘情况......
    获取 localizedName更不可靠。有2种方式,都不好。选择最适合您的目的的一个
  • FileManager.default.displayName(atPath: bundleURL.path)这为您提供本地化名称,但如果用户重命名应用程序,它将返回新名称,而不是包名称
  • 获取 CFBundleDisplayName来自 bundle 的 localizedInfoDictionary , 回到 CFBundleNameinfoDictionary .这出于某种原因没有给出本地化名称,即使我说 localizedInfoDictionary .
    let infoDict = (bundle.localizedInfoDictionary ?? bundle.infoDictionary)
    let localizedName = infoDict?["CFBundleDisplayName"] ?? infoDict?["CFBundleName"]
  • 关于Swift:我可以获取未运行的应用程序的信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64366869/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com