了解 OSX 中的特权帮助工具

Understanding Priviledged Helper Tools in OSX

在我的应用程序中的某个时刻,我需要一个提升的操作。为此,我找到了苹果的 SMJobBless 机制。我已经编写了一个简单的帮助工具并通过 SMJobBless 安装了它。到目前为止,这是有效的。但是我现在不明白的是:安装后如何启动该Helper工具?

通过阅读我找到的几乎所有相关文档,我现在使用 XPC Conenction 来激活辅助工具,然后在使用 SMBlessJob 安装后通过 launchd 按需启动。为此,您需要通过辅助工具的 plist 创建一个 MachService:

<key>MachServices</key>
<dict>
    <key>com.my.program.Helper</key>
    <true/>
</dict>

(这需要在您的助手的 launchd.plist 中完成,而不是 info.plist)。

在您的帮助工具中,您必须创建 Mach 服务:

@property (atomic, strong, readwrite) NSXPCListener *listener;

        self->_listener = [[NSXPCListener alloc] initWithMachServiceName:@"com.my.program.Helper"];
        self->_listener.delegate = self;

之后,您可以使用 XPC 进行连接。如果您需要这方面的更多信息,请参阅 Apple 的这个示例:https://developer.apple.com/library/content/samplecode/EvenBetterAuthorizationSample/Listings/Read_Me_About_EvenBetterAuthorizationSample_txt.html

不幸的是,Apple 几乎放弃了 Nidhoegger 引用的示例,并且从未在 Swift 中推出新示例。对于寻找如何在 Swift 中最好地解决这个问题的任何人,我将 SwiftAuthorizationSample which hopefully shows how to do this pretty simply. Since I also initially found this pretty confusing and concluded it's way more complicated than it ought to be, I made the SecureXPC framework 放在一起,这使得为这种情况创建服务器只是 XPCMachServer.forBlessedHelperTool() - 它会根据 [=17= 自动配置自己] 列出您必须为 SMJobBless.

创建的