# Mobile Pushのデバイストークン登録

プレビュー版Engage Mobile SDKは、APNsとFCMのデバイストークンを登録する共通APIを提供します。アプリがプラットフォームからトークンを取得し、そのトークンをSDKへ渡すことで、Engage Studioがインストールを配信対象にできます。

プレビュー
SDKのトークン登録APIは、プレビュー版Mobile SDK連携の一部です。一般提供前に、イベント名、フィールド名、パッケージ配布方法、Push処理APIが変更される場合があります。

## SDKが担当する処理

SDKは、設定されたRecordsエンドポイントへトークン登録イベントを送信します。Pushのライフサイクルは引き続きアプリが担当します。

| 責務 | アプリ | SDK |
|  --- | --- | --- |
| 通知権限をリクエストする | ✓ |  |
| APNsまたはFCMトークンを取得する | ✓ |  |
| トークンをTreasure AIへ登録する | SDKを呼び出す | ✓ |
| Push通知を受信する | ✓ |  |
| システム通知を表示する | ✓ |  |
| 通知タップを処理する | ✓ |  |
| タップ後にURLをHosted Pagesとして表示する | `openUrl`を呼び出す | WebViewを表示する |


SDKは現在、APNsまたはFCMの受信サービスを管理しません。トークン登録だけでPush通知の受信・表示まで完了すると説明しないでください。

## iOSでトークンを登録する

アプリでAPNsトークンを取得し、Providerと送信先テーブルを指定してSDKへ渡します。

```swift
func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken token: Data
) {
    TreasureData.sharedInstance().registerDeviceToken(
        token,
        provider: .apns,
        table: "device_tokens"
    )
}
```

通知権限のリクエストとリモート通知の登録は、別途アプリで実装する必要があります。

## Androidでトークンを登録する

FirebaseからFCMトークンを取得し、`TDPushProvider.FCM`を指定してSDKへ渡します。

```kotlin
override fun onNewToken(token: String) {
    TreasureData.sharedInstance().registerDeviceToken(
        token,
        TDPushProvider.FCM,
        "device_tokens"
    )
}
```

FCMがトークンを更新した場合は、メソッドを再度呼び出します。Firebaseの設定と通知権限の処理はアプリが担当します。

## プレビュー版のレコードスキーマ

プレビューSDKはトークンをイベントとして登録し、イベントを即時にフラッシュします。Android M2実装では、次のフィールドを使用します。

```json
{
  "td_device_token": "<TOKEN>",
  "td_push_provider": "fcm"
}
```

Providerの値は`apns`または`fcm`です。レコードに`event`名のフィールドはありません。SDK APIを通じてアプリから任意のパラメーターを追加できます。

プレビュー版スキーマと既存のPushイベント
既存のPush Events Tableでは、`token_register`イベントと`fcm_token`フィールドを説明しています。プレビューSDKのレコードは`td_device_token`と`td_push_provider`を使用し、`event`名のフィールドは付与しません。標準Mobile Pushイベントスキーマが確定するまでは、これらを同じ連携契約として扱わないでください。

## PushからHosted Pagesを開く

Push payloadにURLが含まれている場合、アプリはURLをSDKへ渡せます。

```swift
TreasureData.sharedInstance().openUrl(
    URL(string: "https://example.com/coupon")!,
    context: ["coupon_id": "abc123"]
)
```

```kotlin
TreasureData.sharedInstance().openUrl(
    "https://example.com/coupon",
    mapOf("coupon_id" to "abc123")
)
```

この直接URL経路にはキャンペーンオファーのIDがありません。Hosted PagesのWebViewには表示されますが、キャンペーンの`impression`、`click`、`dismiss`イベントは作成されません。

## セキュリティとプライバシー

- イベント送信には書き込み専用APIキーを使用します。
- 本番ログにAPNsまたはFCMトークンを出力しないでください。
- APIキーやPersonalization tokenをPush payloadに含めないでください。
- Hosted Pagesとして開くURLを検証してください。
- Deep Linkとアプリ所有のルートを遷移前に検証してください。
- トークンや関連イベントデータを送信する前に、同意とプライバシーポリシーを適用してください。


## 関連ドキュメント

- [Mobile Pushキャンペーン](/ja/products/marketing-cloud/engage-studio/channels/mobile-push)
- [モバイルIn-AppメッセージングのAndroid SDK連携](/ja/products/marketing-cloud/engage-studio/channels/mobile-inapp/developer-guide-android)
- [モバイルIn-AppメッセージングのiOS SDK連携](/ja/products/marketing-cloud/engage-studio/channels/mobile-inapp/developer-guide-ios)
- [Push Eventsテーブル](/ja/products/marketing-cloud/engage-studio/channels/mobile-push/push-events-table)