首页 > 解决方案 > 如何使用 execl("/usr/bin/open"...) 在 macOS 中重新启动当前程序?

问题描述

我可以成功启动一个应用程序

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

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

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

谢谢!

标签: cobjective-cmacosexec

解决方案


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

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

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

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

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

首先,你不能“检测到崩溃并采取一些行动”——根据定义——你的应用程序已经崩溃了。有一些软件包可以检测崩溃并记录有关它的信息;寻找这样的解决方案来重新启动您的应用程序。

至于更新,我再次引导您使用Sparkle等第三方解决方案。它处理退出旧应用程序,替换它,然后以理智的方式启动新应用程序。

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


推荐阅读