我一直在阅读文档和 SMJobBless 示例以及互联网上的各种讨论。我的应用程序现在使用安装特权助手SMJobBless()
,但助手根本不运行。
帮助程序的全部目的是在应用程序启动时加载 kext,这是我的应用程序的重要组件。我看到的例子表明,尝试通过 XPC 连接到助手将启动助手,但我想让我的助手保持简单和愚蠢。
API 文档显示有一个SMJobSubmit()
功能。它到底有什么作用?我可以用它来启动之前安装的特权助手吗SMJobBless()
?
我对周围的所有术语感到困惑launchd
和Service Management Framework
- 例如,“RunAtLoad”plist 选项控制“您的作业是否在加载作业时启动一次”。 “加载”和“启动”到底是什么?它们与“bless/install”和“提交”有何关系?
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 属性让帮助器立即执行。
OR
- 使用Nathan的代码,XPC连接,询问它的版本号,如果没有更新,让它退出,然后SMJobRemove,SMJobBless一个新版本,然后XPC连接并要求它安装你的kext。这样用户只需针对任何新版本进行身份验证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)