1
4

1 回答 1

1

在这里

我无法让它以简单的方式工作SMLoginItem,最终求助于极其繁琐的方法,即通过 NSTask 调用命令行工具 launchctl 来告诉launchd将我的帮助应用程序视为启动项。

基本上,您需要在适当的库文件夹(适当的文件夹)中创建和维护一个 helper.launchd.plist,其中包含您的助手应用程序的可执行文件的路径以及最重要的一些其他配置,这些配置KeepAlive将告诉 launchd 自动重新打开您的应用程序是否应该崩溃或被用户关闭,RunAtLoad这将导致您的应用程序在登录时启动。这就是我的 helper.launchd.plist 的样子:

然后,您可以通过终端使用以下命令注册您的助手应用程序:

launchctl bootstrap gui/$UID [path to your helper.launchd.plist]

将您的助手激活为登录项

launchctl bootout gui/$UID [path to your helper.launchd.plist]

停用您的助手作为登录项。

您可以在代码中使用这些终端命令。我是使用 NSTask 完成的,但我认为可能有更好的方法。


请注意, $UID 是一个internal variable,终端在将 gui/$UID 参数提供给 launchctl 命令行工具之前会自动将其扩展为当前用户的用户 ID。我的 UID 是 501,所以 launchctl 实际上得到的是输入“gui/501”,而不是“gui/$UID”。我使用[NSString stringWithFormat:@"gui/%d", geteuid()]Objective-C 为 launchctl 创建适当的用户域参数。


随机提示:

  • 请注意,my.prefpane 可以位于不同的位置,具体取决于 prefpane 是为所有人安装还是仅为特定用户安装。

  • 我建议您将 helper.launchd.plist 模板放入您的项目中。然后您只需要Program根据用户和 prefpane 的安装位置来编辑该字段,而不是以编程方式创建整个 plist 文件。

  • 我将 helper.launchd.plist 放入 /Users/[User]/Library/LaunchAgents 并且我注意到,该文件夹在全新安装时不存在,因此您可能需要检查库文件夹是否应该包含您的助手.launchd.plist 实际上存在并在必要时创建它。

  • Apple 在 macOS 10.10 Yosemite 中重写了 launchctl,他们添加了launchctl bootstraplaunchctl bootout作为现已弃用的launchctl loadlaunchctl unload. 如果你想向后兼容,你可能不得不回退到loadunload版本的 macOS

希望这对您的项目有所帮助并祝您好运!

于 2019-07-26T10:30:02.333 回答