为什么我的应用程序在其他Mac上重新启动?

时间:2016-12-07 18:51:10

标签: swift xcode macos

我在按钮下方使用此功能重新启动应用程序。

func relaunchApp() {    
let url = URL(fileURLWithPath: Bundle.main.resourcePath!)
let path = url.deletingLastPathComponent().deletingLastPathComponent().absoluteString
let task = Process()
task.launchPath = "/usr/bin/open"
task.arguments = [path]
task.launch()
exit(0) }

这完全适用于我的Macbook Air 2015型号。但是,当我将此文件发送给具有完全相同型号的任何其他人(或Mac Mini我也试过这个)时,按下按钮后没有任何反应。这是在完全编译和只是从Xcode运行的两个条件下,或者在我这边工作。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

也许这是一个时间问题...如果open命令在您的应用完全消失之前运行,open可能会认为它无关。无论如何,您使用open的方法似乎不必要地复杂化。试试这个(原谅我的Objective-C,我不知道Swift):

NSError* err = nil;
[[NSWorkspace sharedWorkspace]
    launchApplicationAtURL: [[NSBundle mainBundle] bundleURL]]
    options: NSWorkspaceLaunchAsync | NSWorkspaceLaunchNewInstance
    configuration: nil
    error: &err ];
[NSApp terminate: NSApp];

答案 1 :(得分:0)

我能够通过在/的开头添加resourcepath并使用path而不是absoluteString来解决此问题。

func relaunchApp() {
     let fullUrl = "/" + Bundle.main.resourcePath!
     let url = URL(fileURLWithPath: fullUrl)
     let path = url.deletingLastPathComponent().deletingLastPathComponent().path
     let task = Process()
     task.launchPath = "/usr/bin/open"
     task.arguments = [path]
     task.launch()
     exit(0) }

当我正在使用的另一个函数直接打开文件/System/Library/PreferencePanes/Bluetooth.prefPane时,我发现了这个问题,而在Xcode中输出了以下内容:

2016-12-09 11:51:56.749 Application[90077:1633677] launch path not accessible

现在,这个函数在Xcode之外工作但不在其中,并且在研究了这个错误之后,我找到了这个answer。只需添加正斜杠并使用path而不是absoluteString修复问题。

我要感谢@MartinR提及pathabsoluteString,@ ddd和@JWWalker之间的区别,感谢他们提供的帮助。