macOS - 无法启动具有本地化名称和 space 的应用程序

macOS - Impossible to launch an app with localized name and space

我有这个在登录时启动的 macOS 应用程序。此应用的名称 "My App.app" 中有一个 space。

就此而言,我创建了一个辅助应用程序,它在登录时加载并启动主应用程序。

我在这个帮助程序中,正在尝试启动主应用程序。

出于这个原因,我需要获取主应用程序路径。所以,我这样做:

let appName = "My App.app"
let path = "/Applications/" + appName 
let newURL = NSURL.fileURL(withPath: path)

当我尝试使用它时

let app = try NSWorkspace.shared.launchApplication(at: newURL,
                                                   options:[.withErrorPresentation, .inhibitingBackgroundOnly, .async],
                                                   configuration: [:])

我收到一个错误 "APPLICATION NOT FOUND"。

其中一个问题是应用程序的名称 "My App.app" 中包含一个 space。我删除了应用程序名称中的 space,此命令成功启动了应用程序。

但是我需要名字中的space。

然后我尝试使用包标识符启动应用程序。

NSWorkspace.shared.launchApplication(withBundleIdentifier: mainAppBundleIdentifier,
options: [.withErrorPresentation, .inhibitingBackgroundOnly, .async],
additionalEventParamDescriptor: nil,
launchIdentifier: nil)

然后我得到另一个错误,

MyApp can’t be opened. Move “My App” to the Applications folder and try again.

问题是应用程序 已经 在“应用程序”文件夹中。

然后我用这个,只是为了检查

let path = NSWorkspace.shared.absolutePathForApplication(withBundleIdentifier: mainBundleId)

我明白了

"/Users/myself/Library/Mail/V6/0982138471-EA33/[Gmail].mbox/All Mail.mbox/871628745618726547816A/Data/2/8/5/Attachments/582584/2/MyAppMac.app"

卧槽!!??

这里有两处错误:

  1. 这是一封 link 我昨天发给测试人员的电子邮件,向他发送了申请。
  2. link中提到的应用是MyAppMac.app,即Xcode目标名称,没有本地化。

当应用名称中包含 space 并且已本地化时,我如何从另一个应用启动该应用?

如何获取目标名称?

启动主应用程序的通常方法是首先检查它是否已经 运行ning 如果没有 运行 则 可执行文件 并传递一个变量通知主应用程序它是由 helper

启动的

例如

func applicationDidFinishLaunching(_ aNotification: Notification) {
    let appName = "Foo"
    let bundleIdentifier = "com.spacedog.foo"

    if NSRunningApplication.runningApplications(withBundleIdentifier: bundleIdentifier).isEmpty {
        let bundleURL = Bundle.main.bundleURL
        var pathComponents = bundleURL.pathComponents
        pathComponents.removeLast(3)
        pathComponents.append(contentsOf: ["MacOS", appName])
        let mainAppURL = NSURL.fileURL(withPathComponents:pathComponents)!
        let options = [NSWorkspace.LaunchConfigurationKey.arguments : ["launchedAtLogin"]]
        _ = try? NSWorkspace.shared.launchApplication(at: mainAppURL as URL, options: .withoutActivation, configuration: options)
    }
    NSApp.terminate(nil)
}