gpt4 book ai didi

swift - 验证是否安装了帮助工具

转载 作者:搜寻专家 更新时间:2023-11-01 06:54:47 27 4
gpt4 key购买 nike

我正在用 Swift 编写一个需要特权帮助工具的 macOS 应用程序——希望提升不是必需的,但是 it looks like it is .

我找到了 this专为这种情况量身定制的优秀示例应用程序。我已经设法将它的代码移植到我自己的应用程序中,但我仍然需要检查是否安装了辅助工具,如果没有,请使用 SMJobBless()。和 friend 安装它。

运行示例应用时,如果没有安装辅助工具,应用会卡在以下界面:

enter image description here

明确地说,通过阅读代码,我认为它应该在某个时候将标签更新为“Helper Installed: No”,但这似乎没有发生。

如果我点击“安装助手”,这就是结果。

enter image description here

从现在开始,除非我手动删除助手工具,否则重新运行应用程序将显示此屏幕,其中显示“已安装助手:是”。

在用户必须手动单击“安装助手”按钮的示例情况下,此行为可能没问题。但是,在我的应用程序中,如果尚未安装,我希望它自动请求安装帮助工具。如果已经安装,我不想浪费用户的时间再次请求他们的密码。

我认为这很简单:如果辅助工具不可用,在连接到它的过程中某处会发生错误,这是我请求安装该工具的触发因素。如果没有错误发生,则认为该工具已经安装。

这是我编写的用于通过 XPC 连接到辅助工具的破解代码:

var helperConnection: NSXPCConnection?
var xpcErrorHandler: ((Error) -> Void)?
var helper: MyServiceProtocol?

// ...

helperConnection = NSXPCConnection(machServiceName: MyServiceName, options: .privileged)
helperConnection?.remoteObjectInterface = NSXPCInterface(with: MyServiceProtocol.self)
helperConnection?.resume()

helperConnection?.interruptionHandler = {
// Handle interruption
NSLog("interruptionHandler()")
}

helperConnection?.invalidationHandler = {
// Handle invalidation
NSLog("invalidationHandler()")
}

xpcErrorHandler = { error in
NSLog("xpcErrorHandler: \(error.localizedDescription)")
}

guard
let errorHandler = xpcErrorHandler,
let helperService = helperConnection?.remoteObjectProxyWithErrorHandler(errorHandler) as? MyServiceProtocol
else {
return
}

helper = helperService

如果未安装帮助工具,运行此代码不会产生错误或 NSLog()输出。如果之后,我通过 XPC 调用一个函数(使用 helper?.someFunction(...) ),什么也不会发生——我还不如与 /dev/null 交谈呢? .

现在,我正在绞尽脑汁寻找一种技术来检测该工具是否已安装。示例应用程序的问题解决方案是添加 getVersion()方法;如果它返回一些东西,“安装助手”会变灰并且标签会变为“已安装助手:是”。

我考虑通过在我的工具中编写一个立即返回的简单函数来稍微扩展这个想法,并在主应用程序中使用超时——如果我在代码超时之前没有得到结果,辅助工具很可能没有安装。我发现这是一个 hacky 解决方案——例如,如果辅助工具(按需启动)启动时间有点太长,比如因为计算机太旧并且用户正在运行 CPU 密集型程序怎么办?

我看到了其他替代方案,例如在预期位置(/Library/PrivilegedHelperTools/Library/LaunchDaemons)查看文件系统,但我还是觉得这个解决方案不能令人满意。

我的问题:有没有一种方法可以明确检测特权 XPC 帮助工具是否在另一端监听?

我的环境:macOS Mojave 10.14.2、Xcode 10.1、Swift 4.2。

最佳答案

我会检查文件系统是否存在二进制文件(在/Library/PrivilegedHelperTools 中,如果 plist 存在于/Library/LaunchDaemons 中)。然后您可能会联系 XPC 服务并调用某种 ping 功能,该功能会回答服务是否已启动并正在运行。

只是我的 2 克拉,

罗伯特

关于swift - 验证是否安装了帮助工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54264378/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com