Swift Package Index 的标志。Swift Package Index

跟踪 Swift 6 严格并发检查对数据竞争安全性的采用情况。有多少个 package 已准备好支持 Swift 6

在 Xcode 项目中使用

在 Swift Package Manager 清单中使用

选择 Package 版本

0.8.0

main


一个简单且安全的 Swift XPC 框架




使用纯 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()
    • 用于通过 SMAppServiceSMJobBless 辅助工具和 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 以获取您可能有的或甚至没有意识到自己想知道的问题的答案,包括诸如使用实时文件句柄、在进程之间共享内存以及在沙箱限制内工作等主题。