c - 如何使用 execl("/usr/bin/open"...) 在 macOS 中重新启动当前程序?
问题描述
我可以成功启动一个应用程序
execl("/usr/bin/open", "open", "/Applications/Foo.app", 0);
但是当我在 Foo.app 中调用它时这不起作用
我希望我的应用程序在崩溃和自动更新时重新启动。
谢谢!
解决方案
open
如果您的应用程序已经在运行,则不会启动您的应用程序的第二个实例,它只会使其成为活动应用程序。
您可以通过执行应用程序包的可执行文件来启动应用程序的第二个实例:
excel("/Applications/Foo.app/Contents/MacOS/Foo", ...
虽然不是推荐的启动 Cocoa 应用程序的方法,但 Apple 工程师向我保证,这将起作用。但是请注意,您现在有两个正在运行的应用程序实例,它们共享相同NSUserDefaults
的 和其他资源,因此可能会出现一些奇怪的行为(或通过 立即终止第一个应用程序exit()
)。
话虽如此,这可能不是你想要做的。
首先,你不能“检测到崩溃并采取一些行动”——根据定义——你的应用程序已经崩溃了。有一些软件包可以检测崩溃并记录有关它的信息;寻找这样的解决方案来重新启动您的应用程序。
至于更新,我再次引导您使用Sparkle等第三方解决方案。它处理退出旧应用程序,替换它,然后以理智的方式启动新应用程序。
最后,您可以将您的应用程序注册为“用户代理”,launchd
以便在退出时自动重新启动。
推荐阅读
- javascript - 在 React 中使用带有 useEffect 的 querySelectors 来修改 HTML 元素
- javascript - 如何在执行ajax函数的循环结束后运行函数?
- java - 在 Flink 中使用 mysql-connector-java:连接到 mysql >= 8.0.16 时找不到合适的驱动程序
- javascript - 为什么在对象数组中搜索不起作用?
- android - 如何将 contentDescription 提供给 SwitchPreference 以进行 Accessibilty/Talkback?
- regex - Google Sheets RegEx:在不允许字母的情况下设置数字范围
- python - 我正在尝试在 django 中创建登录/注销功能,但出现以下错误
- angular6-json-schema-form - 光标在 Angular6 Json Schema Form 输入字段中跳转到末尾
- java - 在 AWS 中,如何在 describe-image api 中指定区域以获取该区域的 AMI Id
- python - PySpark:对于每一行,根据条件计算另一个表