mirror of https://github.com/vapor/docs.git
148 lines
5.5 KiB
Markdown
148 lines
5.5 KiB
Markdown
# APNS
|
|
|
|
VaporのApple Push Notification Service (APNS) APIを使用すると、Appleデバイスへのプッシュ通知の認証と送信が簡単になります。これは[APNSwift](https://github.com/swift-server-community/APNSwift)の上に構築されています。
|
|
|
|
## はじめに {#getting-started}
|
|
|
|
APNSの使用を開始する方法を見てみましょう。
|
|
|
|
### パッケージ {#package}
|
|
|
|
APNSを使用する最初のステップは、依存関係にパッケージを追加することです。
|
|
|
|
```swift
|
|
// swift-tools-version:5.8
|
|
import PackageDescription
|
|
|
|
let package = Package(
|
|
name: "my-app",
|
|
dependencies: [
|
|
// Other dependencies...
|
|
.package(url: "https://github.com/vapor/apns.git", from: "4.0.0"),
|
|
],
|
|
targets: [
|
|
.target(name: "App", dependencies: [
|
|
// Other dependencies...
|
|
.product(name: "VaporAPNS", package: "apns")
|
|
]),
|
|
// Other targets...
|
|
]
|
|
)
|
|
```
|
|
|
|
Xcode内で直接マニフェストを編集すると、ファイルが保存されたときに自動的に変更を検出し、新しい依存関係を取得します。それ以外の場合は、ターミナルから`swift package resolve`を実行して新しい依存関係を取得してください。
|
|
|
|
### 設定 {#configuration}
|
|
|
|
APNSモジュールは`Application`に新しいプロパティ`apns`を追加します。プッシュ通知を送信するには、認証情報を使用して`configuration`プロパティを設定する必要があります。
|
|
|
|
```swift
|
|
import APNS
|
|
import VaporAPNS
|
|
import APNSCore
|
|
|
|
// JWT認証を使用してAPNSを設定します。
|
|
let apnsConfig = APNSClientConfiguration(
|
|
authenticationMethod: .jwt(
|
|
privateKey: try .loadFrom(string: "<#key.p8 content#>"),
|
|
keyIdentifier: "<#key identifier#>",
|
|
teamIdentifier: "<#team identifier#>"
|
|
),
|
|
environment: .development
|
|
)
|
|
app.apns.containers.use(
|
|
apnsConfig,
|
|
eventLoopGroupProvider: .shared(app.eventLoopGroup),
|
|
responseDecoder: JSONDecoder(),
|
|
requestEncoder: JSONEncoder(),
|
|
as: .default
|
|
)
|
|
```
|
|
|
|
プレースホルダーを認証情報で置き換えてください。上記の例は、Appleの開発者ポータルから取得した`.p8`キーを使用した[JWTベースの認証](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns)を示しています。証明書を使用した[TLSベースの認証](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns)の場合は、`.tls`認証方法を使用してください:
|
|
|
|
```swift
|
|
authenticationMethod: .tls(
|
|
privateKeyPath: <#path to private key#>,
|
|
pemPath: <#path to pem file#>,
|
|
pemPassword: <#optional pem password#>
|
|
)
|
|
```
|
|
|
|
### 送信 {#send}
|
|
|
|
APNSが設定されたら、`Application`または`Request`の`apns.send`メソッドを使用してプッシュ通知を送信できます。
|
|
|
|
```swift
|
|
// カスタムCodableペイロード
|
|
struct Payload: Codable {
|
|
let acme1: String
|
|
let acme2: Int
|
|
}
|
|
// プッシュ通知アラートを作成
|
|
let dt = "70075697aa918ebddd64efb165f5b9cb92ce095f1c4c76d995b384c623a258bb"
|
|
let payload = Payload(acme1: "hey", acme2: 2)
|
|
let alert = APNSAlertNotification(
|
|
alert: .init(
|
|
title: .raw("Hello"),
|
|
subtitle: .raw("This is a test from vapor/apns")
|
|
),
|
|
expiration: .immediately,
|
|
priority: .immediately,
|
|
topic: "<#my topic#>",
|
|
payload: payload
|
|
)
|
|
// 通知を送信
|
|
try! await req.apns.client.sendAlertNotification(
|
|
alert,
|
|
deviceToken: dt,
|
|
deadline: .distantFuture
|
|
)
|
|
```
|
|
|
|
ルートハンドラー内にいる場合は、`req.apns`を使用してください。
|
|
|
|
```swift
|
|
// プッシュ通知を送信します。
|
|
app.get("test-push") { req async throws -> HTTPStatus in
|
|
try await req.apns.client.send(...)
|
|
return .ok
|
|
}
|
|
```
|
|
|
|
最初のパラメータはプッシュ通知アラートを受け取り、2番目のパラメータはターゲットデバイストークンです。
|
|
|
|
## アラート {#alert}
|
|
|
|
`APNSAlertNotification`は、送信するプッシュ通知アラートの実際のメタデータです。各プロパティの詳細については[こちら](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/PayloadKeyReference.html)で提供されています。これらはAppleのドキュメントに記載されている1対1の命名規則に従っています。
|
|
|
|
```swift
|
|
let alert = APNSAlertNotification(
|
|
alert: .init(
|
|
title: .raw("Hello"),
|
|
subtitle: .raw("This is a test from vapor/apns")
|
|
),
|
|
expiration: .immediately,
|
|
priority: .immediately,
|
|
topic: "<#my topic#>",
|
|
payload: payload
|
|
)
|
|
```
|
|
|
|
このタイプは`send`メソッドに直接渡すことができます。
|
|
|
|
### カスタム通知データ {#custom-notification-data}
|
|
|
|
Appleは、各通知にカスタムペイロードデータを追加する機能をエンジニアに提供しています。これを容易にするために、すべての`send` APIのペイロードパラメータに`Codable`準拠を受け入れています。
|
|
|
|
```swift
|
|
// カスタムCodableペイロード
|
|
struct Payload: Codable {
|
|
let acme1: String
|
|
let acme2: Int
|
|
}
|
|
```
|
|
|
|
## 詳細情報 {#more-information}
|
|
|
|
利用可能なメソッドの詳細については、[APNSwiftのREADME](https://github.com/swift-server-community/APNSwift)を参照してください。 |