使用纯 Swift 轻松安全地与 XPC 服务和 Mach 服务通信。客户端-服务器模型使您可以使用自己符合 Codable
协议的类型,向您定义的路由发送请求并接收响应。
SecureXPC 在 macOS 10.15 及更高版本上使用 Swift concurrency,允许客户端向服务器发出非阻塞的异步请求。也提供基于闭包的 API,以实现向后兼容 OS X 10.10。
此软件包可用于与任何类型的 XPC 服务或 Mach 服务通信,并为以下类型提供定制化支持:
它在构建时考虑了安全性,最大限度地减少了 漏洞利用 的机会。安全检查是针对实际调用进程执行的,而不是依赖已知 不安全 的 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()
- 用于 XPC 服务,这是一种私有辅助工具,仅适用于包含它的主应用程序
XPCServer.forMachService()
- 用于通过
SMAppService
、SMJobBless
辅助工具和 SMLoginItemSetEnabled
登录项注册的代理和守护进程
XPCServer.forMachService(withCriteria:)
- 用于任何类型的 Mach 服务,包括“经典”代理和守护进程;详情请参阅文档
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:)
- 用于与 XPC 服务通信
- 这对应于使用
XPCServer.forThisXPCService()
创建的服务器
XPCClient.forMachService(named:withServerRequirement:)
- 用于与 Mach 服务通信
- 这对应于使用
XPCServer.forMachService()
或 XPCServer.forMachService(withCriteria:)
创建的服务器
XPCClient.forEndpoint(_:withServerRequirement:)
- 这是与匿名服务器通信的唯一方法
- 这对应于使用
XPCServer.makeAnonymous()
或 XPCServer.makeAnonymous(withClientRequirements:)
创建的服务器
- 这种类型的客户端也可以用于通过其
endpoint
属性与任何服务器通信
请参阅 FAQ 以获取您可能有的或甚至没有意识到自己想知道的问题的答案,包括诸如使用实时文件句柄、在进程之间共享内存以及在沙箱限制内工作等主题。