如何在 macOS Big Sur 上从 LoginItem 运行主应用程序

ine*_*tus 3 cocoa swift macos-big-sur

我想发布 macOS 应用程序的更新。我有一个自动启动应用程序的登录项。我在助手应用程序中使用了以下代码:

if !alreadyRunning
{
    DistributedNotificationCenter.default().addObserver(self, selector: #selector(AppDelegate.terminate), name: NSNotification.Name("killme"), object: mainIdentifier)
            
    let path = Bundle.main.bundlePath as NSString
    var components = path.pathComponents
    components.removeLast()
    components.removeLast()
    components.removeLast()
    components.append("MacOS")
    components.append("MyAppName")
            
    let newPath = NSString.path(withComponents: components)
            
    NSWorkspace.shared.launchApplication(newPath)
}
else
{
    self.terminate()
}
Run Code Online (Sandbox Code Playgroud)

已经工作三年了。然而,在 macOS Big Sur 中,该launchApplication函数现已被弃用,它表示我应该使用该openApplication函数。

我将应用程序的下部更改为:

let url = URL(fileURLWithPath: newPath)
let configuration = NSWorkspace.OpenConfiguration()
configuration.promptsUserIfNeeded = true
configuration.allowsRunningApplicationSubstitution = true
            
NSWorkspace.shared.openApplication(at: url, configuration: configuration, completionHandler: nil)
Run Code Online (Sandbox Code Playgroud)

事实上,我已经尝试了配置上可用的所有标志。会抛出几个不同的错误。它要么说不允许启动器应用程序启动我的主应用程序,要么说辅助​​应用程序无法运行终端命令。

一个简单的解决方法是忽略弃用警告,我想避免这种情况。我的 LoginItem 应用程序如何在 Big Sur 上运行我的主应用程序?

小智 5

openApplication需要 MyAppName.app 文件夹的 URL,而不是二进制文件。

再尝试removeLast()一次删除“Contents”,并且不要添加“MacOS”或“MyAppName”。

let path = Bundle.main.bundlePath as NSString
var components = path.pathComponents
components.removeLast()
components.removeLast()
components.removeLast()
components.removeLast()

let newPath = NSString.path(withComponents: components)
let url = URL(fileURLWithPath: newPath)
let configuration = NSWorkspace.OpenConfiguration()
            
NSWorkspace.shared.openApplication(at: url, configuration: configuration, completionHandler: nil)
Run Code Online (Sandbox Code Playgroud)