从首选项窗格注册登录项目的最佳方法?

时间:2018-10-23 01:29:34

标签: objective-c macos service-management nspreferencepane

我正在尝试创建一个将助手应用程序注册为登录项的首选项窗格。

我在同一个项目中都拥有两个应用程序,并且设法将 helper.app 添加到 my.prefpane 的应用程序包中,但是我不知道如何启用 helper.app 作为登录项...


我尝试使用SMLoginItemSetEnabled,因为它似乎是最优雅的解决方案-但我无法使其正常工作...

我收到此错误:

“无法在呼叫者的捆绑包中找到登录项目 [捆绑包标识符]

我认为问题在于,如果 helper.app 位于主应用程序捆绑包的“Contents/Library/LoginItems”目录中,而该“主应用程序” ”调用此功能的似乎是 System Preferences.app ,而不是 my.prefpane ,其中包含 helper.app 。我无法将 helper.app 写入 System Preferences.app 的捆绑软件中……


是否有解决方法?您可以扩展SMLoginItemSetEnabled函数的功能还是类似的功能?还是应该使用完全不同的方法?

编辑;是否有用于登录项目的标签?我觉得我的标签真的不好。.

1 个答案:

答案 0 :(得分:1)

在这里

我无法使用SMLoginItem来使其简单地工作,最终只能通过NSTask调用命令行工具launchctl来告诉launchd对待我的助手,这非常繁琐的方法应用作为启动项。

基本上,您需要在适当的库文件夹(appropriate folders)中创建和维护helper.launchd.plist,其中包含您的助手应用程序的可执行文件的路径以及其他一些最重要的配置{{ 1}}会告诉启动的应用程序崩溃或被用户关闭时会自动重新打开您的应用程序,而KeepAlive会导致您的应用程序在登录时启动。 This is what my helper.launchd.plist looks like:

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

RunAtLoad

激活您的助手作为登录项

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

停用助手作为登录项。

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


请注意,$ UID是一个launchctl bootout gui/$UID [path to your helper.launchd.plist] ,在将gui / $ UID参数提供给launchctl命令行工具之前,终端会自动将其扩展为当前用户的用户ID。我的UID是501,因此launchctl实际上获得输入“ gui / 501”,而不是“ gui / $ UID”。我使用internal variable为带有Objective-C的launchctl创建了一个合适的用户域参数。


随机提示:

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

  • 我建议您将helper.launchd.plist模板放入您的 项目。然后,您只需要根据以下内容编辑[NSString stringWithFormat:@"gui/%d", geteuid()]字段 用户以及预安装面板的位置,而不是创建整个面板 通过程序plist文件。

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

  • Apple在macOS 10.10 Yosemite中重写了launchctl,他们添加了Programlaunchctl bootstrap来替代现在已弃用的launchctl bootoutlaunchctl load。如果要向后兼容,则可能必须在旧版本的macOS上回退到launchctl unloadload

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