7

我一直在阅读文档和 SMJobBless 示例以及 Internet 上的各种讨论。我的应用程序现在使用 安装特权助手SMJobBless(),但助手根本不运行。

帮助程序的全部目的是在应用程序启动时加载一个 kext,这是我的应用程序的一个重要组件。我已经看到示例显示尝试通过 XPC 连接到帮助程序将启动帮助程序,但我想让我的帮助程序保持简单和愚蠢。

API 文档显示有一个SMJobSubmit()函数。它究竟是做什么的?我可以用它来启动以前安装的特权助手SMJobBless()吗?

我对周围的所有术语感到困惑,launchd例如Service Management Framework,“RunAtLoad”plist 选项控制“您的作业是否在加载作业时启动一次”。“加载”和“启动”到底是什么,它们与“祝福/安装”和“提交”有什么关系?

4

1 回答 1

10

SMJobBless 会将您的工作添加到 launchd 的系统中。请参阅 SMJobBless 示例代码以执行此操作。

http://developer.apple.com/library/mac/#samplecode/SMJobBless/Introduction/Intro.html

但是,launchd 的全部目的是控制作业的启动方式和时间,并且默认情况下(在示例代码中),实际上没有指定作业应该何时启动,因此该作业实际上永远不会启动.

Nathan de Vries 写了一篇非常好的文章和示例代码,用于使用 SBJobBless 和使用 XPC 与特权作业进行通信。当然,一个重要的副作用是,尝试与 launchd 服务通信的行为将导致 launchd 实际启动您的服务,因此这将解决您的问题。

http://atnan.com/blog/2012/02/29/modern-privileged-helper-tools-using-smjobbless-plus-xpc/

为了具体回答您的问题,SMJobSubmit 可以执行特权助手。我花了很长时间才弄清楚,但两者之间的区别在于 SMJobSubmit 将允许您使用 launchd 运行具有权限的可执行文件,而 SMJobBless 将永久添加一个 LaunchDaemon。SMJobBless 已安装的可执行文件将保持有效,而 SMJobSubmit 将要求您每次都重新进行身份验证。

请注意,在这两种情况下,您都必须 SMJobRemove 前一个以确保使用新版本。

所以,我认为你需要:

  • SMJobRemove, SMJobSubmit 每次启动应用程序时,每次都提示用户进行身份验证。使用您构建的字典中的 RunAtLoad 属性让帮助程序立即执行。

或者

  • 使用Nathan的代码,XPC连接,询问它的版本号,如果它没有更新,让它退出,然后SMJobRemove,SMJobBless一个新版本,然后XPC连接并要求它安装你的kext。这样,用户只需对任何新版本进行身份验证。
于 2012-08-06T03:57:03.443 回答