使用纯 Swift 轻松安全地与 XPC 服务和 Mach 服务通信。客户端-服务器模型使您可以使用自己符合 Codable
协议的类型,向您定义的路由发送请求并接收响应。
SecureXPC 在 macOS 10.15 及更高版本上使用 Swift concurrency,允许客户端向服务器发出非阻塞的异步请求。也提供基于闭包的 API,以实现向后兼容 OS X 10.10。
此软件包可用于与任何类型的 XPC 服务或 Mach 服务通信,并为以下类型提供定制化支持:
SMJobBless
安装的辅助工具SMLoginItemSetEnabled
启用的登录项SMAppService.daemon(plistName:)
注册的守护进程SMAppService.agent(plistName:)
注册的代理它在构建时考虑了安全性,最大限度地减少了 漏洞利用 的机会。安全检查是针对实际调用进程执行的,而不是依赖已知 不安全 的 PID。
使用此软件包的预期模式是在共享文件中定义路由,在一个程序(例如辅助工具)中创建服务器并注册这些路由,然后在另一个程序(例如应用程序)中创建客户端并向这些路由发送请求。
在客户端和服务器共享的文件中定义一个或多个路由
let route = XPCRoute.named("bedazzle")
.withMessageType(String.self)
.withReplyType(Bool.self)
在一个程序中检索服务器,注册这些路由,然后启动服务器
...
let server = <# server retrieval here #>
server.registerRoute(route, handler: bedazzle)
server.startAndBlock()
}
private func bedazzle(message: String) throws -> Bool {
<# implementation here #>
}
在 macOS 10.15 及更高版本上,async
函数和闭包也可以注册为路由的处理程序。
可以检索多种类型的服务器
XPCServer.forThisXPCService()
XPCServer.forMachService()
SMAppService
、SMJobBless
辅助工具和 SMLoginItemSetEnabled
登录项注册的代理和守护进程XPCServer.forMachService(withCriteria:)
XPCServer.makeAnonymous()
XPCServer.makeAnonymous(withClientRequirements:)
在另一个程序中检索客户端,然后向已注册的路由发送请求
let client = <# client retrieval here #>
let reply = try await client.sendMessage("Get Schwifty", to: route)
基于闭包的变体可用于 macOS 10.14 及更早版本
let client = <# client retrieval here #>
client.sendMessage("Get Schwifty", to: route, withResponse: { result in
switch result {
case .success(let reply):
<# use the reply #>
case .failure(let error):
<# handle the error #>
}
})
可以检索三种类型的客户端
XPCClient.forXPCService(named:)
XPCServer.forThisXPCService()
创建的服务器XPCClient.forMachService(named:withServerRequirement:)
XPCServer.forMachService()
或 XPCServer.forMachService(withCriteria:)
创建的服务器XPCClient.forEndpoint(_:withServerRequirement:)
XPCServer.makeAnonymous()
或 XPCServer.makeAnonymous(withClientRequirements:)
创建的服务器endpoint
属性与任何服务器通信请参阅 FAQ 以获取您可能有的或甚至没有意识到自己想知道的问题的答案,包括诸如使用实时文件句柄、在进程之间共享内存以及在沙箱限制内工作等主题。