sswg:graduated|94x20 Build Documentation

APNSwift

一个非阻塞的 Swift 模块,用于向 APNS 发送远程 Apple 推送通知请求,构建于 AsyncHttpClient 之上。

安装

要安装 APNSwift,只需将该包作为依赖项添加到您的 Package.swift 中。

dependencies: [
    .package(url: "https://github.com/swift-server-community/APNSwift.git", from: "6.0.0"),
]

开始使用

APNSwift 旨在为发送推送通知提供语义正确的结构。您首先需要设置一个 APNSClient。为此,您需要了解您的身份验证方法

let client = APNSClient(
    configuration: .init(
        authenticationMethod: .jwt(
            privateKey: try .init(pemRepresentation: privateKey),
            keyIdentifier: keyIdentifier,
            teamIdentifier: teamIdentifier
        ),
        environment: .development
    ),
    eventLoopGroupProvider: .createNew,
    responseDecoder: JSONDecoder(),
    requestEncoder: JSONEncoder()
)

// Shutdown the client when done
try await client.shutdown()

发送一个简单的通知

所有通知都需要一个 payload(负载),但该 payload 可以为空。Payload 只需要符合 Encodable 协议即可

struct Payload: Codable {}

try await client.sendAlertNotification(
    .init(
        alert: .init(
            title: .raw("Simple Alert"),
            subtitle: .raw("Subtitle"),
            body: .raw("Body"),
            launchImage: nil
        ),
        expiration: .immediately,
        priority: .immediately,
        topic: "com.app.bundle",
        payload: Payload()
    ),
    deviceToken: "device-token"
)

发送 Live Activity 更新/结束

它需要发送与 Live Activity 配置匹配的 ContentState 才能成功更新活动状态。ContentState 需要符合 EncodableSendable 协议。

try await client.sendLiveActivityNotification(
    .init(
          expiration: .immediately,
          priority: .immediately,
          appID: "com.app.bundle",
          contentState: ContentState,
          event: .update,
          timestamp: Int(Date().timeIntervalSince1970)
    ),
    deviceToken: activityPushToken
)
try await client.sendLiveActivityNotification(
    .init(
          expiration: .immediately,
          priority: .immediately,
          appID: "com.app.bundle",
          contentState: ContentState,
          event: .end,
          timestamp: Int(Date().timeIntervalSince1970),
          dismissalDate: .immediately // Optional to alter default behaviour
    ),
    deviceToken: activityPushToken
)

身份验证

APNSwift 提供了两种身份验证方法:jwtTLS

jwt 是 Apple 首选和推荐的方式。这些方式可以在您创建 APNSClientConfiguration 时进行配置。

注意:jwt 需要您的 .p8 文件的加密版本(来自 Apple),该文件以 pem 格式提供。如果您在密钥无效时遇到问题,请确认它是否是 PEM 文件。

openssl pkcs8 -nocrypt -in /path/to/my/key.p8 -out ~/Downloads/key.pem

日志记录

默认情况下,APNSwift 具有一个 no-op(空操作)记录器,它不会记录任何内容。但是,如果您传入一个记录器,您将看到日志。

目前有两种类型的记录器。

后台活动记录器

此记录器可以传递到 APNSClient 中,并将记录后台活动,例如连接池、身份验证令牌刷新等。

通知发送记录器

此记录器可以传递到任何 send: 方法中,并将记录与单个发送请求相关的所有内容。

服务器示例

请查看 Program.swift

iOS 示例

对于 iOS 示例,请打开此仓库中的示例项目。

进入后,配置您的 App Bundle ID 并分配您的开发团队。构建并运行 ExampleApp 到 iOS 模拟器,获取您的设备令牌,并将其插入到上面的服务器示例中。将应用程序置于后台并运行 Program.swift。

最初的提议和 API 讨论