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

帮助程序的整个目的是在应用程序启动时加载kext,这是我的应用程序的重要组件。我已经看到了一些示例,这些示例表明尝试通过XPC连接到帮助程序将启动该帮助程序,但是我想保持我的帮助程序简单明了。

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

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

最佳答案

SMJobBless会将您的工作添加到启动的系统中。有关此操作,请参见SMJobBless示例代码。

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

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

内森·德弗里斯(Nathan de Vries)写了一篇非常好的文章和示例代码,介绍了如何使用SBJobBless以及如何使用XPC与特权作业进行通信。当然,导入的一个副作用是,尝试与启动的服务进行通信的行为将导致启动实际上启动您的服务,因此这可以解决您的问题。

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。这样,用户只需要对任何新版本进行身份验证即可。
  • 关于objective-c - 可以使用SMJobSubmit()执行由SMJobBless安装的特权帮助程序吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11699992/

    10-13 02:49