SMJobBless()
简短版本:删除应用程序时是否可以删除应用程序(等)设置的帮助工具?如果是这样,怎么做?
长版:
不幸的是,我们正在开发的 Mac 应用程序需要管理员权限才能执行偶尔的操作,并且即使应用程序本身没有运行,它也需要后台任务才能连接到其他应用程序的插件(这个可以是非特权的) . 该应用程序将使用 Developer ID 证书进行签名,并且仅在 App Store 之外分发。
我们希望该应用程序尽可能成为“好公民”,即使在卸载时也是如此。
对于后台任务,我们使用了一个登录项,使用SMLoginItemSetEnabled()
. 这并不令人惊讶,因为 XPC 消息传递似乎不起作用(我们正在使用CFMessagePort
- 欢迎替代建议),但如果用户删除应用程序,登录项至少在下次登录时不再加载。我怀疑系统中的某个地方仍然存在它的痕迹,但是使用了 .app 包中的可执行文件,当它消失时,登录项不再运行。
对于偶尔需要管理员权限的操作,我们有一个特权帮助工具,我们的应用程序使用它安装SMJobBless()
,它实现了一个命名的 XPC 服务,因此当它收到来自主应用程序的消息时,任务会按需启动。这是 Apple 在其Even Better Authorization Sample中推荐和描述的内容。
助手可执行文件被复制到/Library/PrivilegedHelperTools/
by SMJobBless()
,嵌入的 launchd.plist 最终在/Library/LaunchDaemons/
. 即使操作系统有关于哪个应用程序“拥有”助手的信息,但当用户删除应用程序时,它似乎并没有卸载它。Apple 的示例对卸载保持沉默,除了uninstall.sh
显然仅打算在开发期间使用的脚本。当应用程序没有运行时,我们不需要这个帮助程序,所以将它安装为一个成熟的启动守护进程有点过分,但我们也想避免重复地用密码提示来烦扰用户。此外,Apple 建议不要使用其他形式的具有管理员权限的运行代码,SMJobBless()
例如SMJobSubmit()
标记为已弃用。
那么我们如何清理自己呢?
我找到SMJobRemove()
了,但是(a)在我们的情况下,我们什么时候会调用它 - 你不能在 .app 包删除时运行代码,或者你可以吗?(b)它实际上似乎并没有清理干净。
我能想到的唯一两件事并不是非常令人满意:
- 某种卸载程序或脚本。但这似乎也很丑陋。
- 不用担心,当用户删除我们的应用程序时留下一团糟。