一个非阻塞的 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 配置匹配的 ContentState
才能成功更新活动状态。ContentState
需要符合 Encodable
和 Sendable
协议。
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
提供了两种身份验证方法:jwt
和 TLS
。
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 示例,请打开此仓库中的示例项目。
进入后,配置您的 App Bundle ID 并分配您的开发团队。构建并运行 ExampleApp 到 iOS 模拟器,获取您的设备令牌,并将其插入到上面的服务器示例中。将应用程序置于后台并运行 Program.swift。