如何使用execl(“ / usr / bin / open” ...)在macOS中重新启动当前程序?

时间:2019-02-15 15:11:25

标签: c objective-c macos exec

我可以使用以下命令成功启动应用程序

execl("/usr/bin/open", "open", "/Applications/Foo.app", 0);

但是当我在Foo.app中调用它时,这不起作用

我希望我的应用在崩溃和自动更新时重新启动。

谢谢!

1 个答案:

答案 0 :(得分:1)

open将不会启动您的应用程序的第二个实例(如果已在运行),只会使其成为活动应用程序。

您可以通过执行应用程序捆绑包的可执行文件来启动应用程序的第二个实例:

excel("/Applications/Foo.app/Contents/MacOS/Foo", ...

虽然不是推荐的启动Cocoa应用程序的方法,但Apple工程师向我保证,这可以正常工作。但请注意,您现在有两个正在运行的应用程序实例,共享相同的NSUserDefaults和其他资源,因此请期待一些奇怪的行为(或立即通过exit()终止第一个应用程序)。

话虽如此,这可能不是您想要的。

首先,您不能“检测到崩溃并采取措施”,因为按照定义,您的应用已崩溃。有一些可以检测到崩溃并记录有关崩溃的信息的软件包。寻找类似的解决方案来重新启动您的应用。

关于更新,我再次将您引向Sparkle之类的第三方解决方案。它可以处理退出旧应用程序,替换它,然后以理智的方式启动新应用程序的过程。

最后,您可以使用launchd将应用程序注册为“用户代理”,以便退出后自动重启。