# Android開発者ガイド ベータ機能 Mobile Pushは現在ベータ版です。機能、API、実装の詳細は正式リリース前に変更される可能性があります。 ## 概要 このガイドでは、Treasure Data Android SDKを使用してAndroidアプリにEngage Studio Mobile Push通知を統合するための実装要件を提供します。開発チームは次の機能を実装する必要があります: 1. **FCM連携**: Firebase Cloud Messaging経由でプッシュ通知を受信 2. **トークン管理**: デバイストークンをTreasure Dataに登録および更新 3. **通知表示**: 画像、アクションボタン、ディープリンクを含む通知を表示 4. **イベントトラッキング**: Treasure Data SDKを使用してユーザーインタラクション(配信、開封、削除、リンク)をトラッキング 5. **自動データアップロード**: Treasure Data SDKがイベントのTreasure Dataへのアップロードを自動的に処理 サンプル実装が利用可能 本番環境対応の完全なサンプルアプリケーションがGitHubで公開されています: **[Treasure Data Mobile Push - Androidサンプル](https://github.com/treasure-data/engage-push-notification-sample/tree/main/android)** サンプルに含まれる内容: - 完全なFirebase Messaging Service実装 - Treasure Data SDKを使用したイベントトラッキング - ディープリンクとWebリンク処理 - アクションボタンと画像を含む通知UI リポジトリをクローンして実装の参考にしてください。 ## 必要要件 | コンポーネント | 要件 | | --- | --- | | **最小Androidバージョン** | Android 8.0 (API 26) 以降 | | **言語** | Kotlin (推奨) または Java | | **必要な依存関係** | - Firebase Messaging SDK (Firebase BoM 34.7.0+経由) - Treasure Data Android SDK 1.1.0+ - WorkManager 2.9.1+ (バックグラウンドタスク用) - Chrome Custom Tabs 1.8.0+ (Webリンク処理用) | | **トラッキングイベント** | `delivery`, `open`, `dismiss`, `deeplink_open`, `link_open`, `token_register` | ## アーキテクチャ概要 ``` ┌─────────────────────┐ │ Engage Studio │ │ Campaign │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ Firebase Cloud │ │ Messaging (FCM) │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ Your Android App │ ├─────────────────────┤ │ MyFirebaseMessaging │ ← 通知を受信 │ Service │ ├─────────────────────┤ │ PushEventReceiver │ ← ユーザーアクションを処理 ├─────────────────────┤ │ Treasure Data SDK │ ← イベントをトラッキングしアップロード └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ Treasure Data │ │ Ingest API │ └─────────────────────┘ ``` ## 実装コンポーネント Androidアプリは以下のコンポーネントを実装する必要があります: ### 1. Firebase Messaging Service **目的:** FCMからプッシュ通知を受信し表示する **主な責務:** - 受信FCMメッセージをリッスン - 通知ペイロード(タイトル、本文、画像、リンク)を抽出 - アクションボタン付きの通知を表示 - 通知受信時に`delivery`イベントをトラッキング - FCMトークン更新を処理 **参照:** [サンプルリポジトリ](https://github.com/treasure-data/mobile-push-samples/tree/main/android)の`MyFirebaseMessagingService.kt`を参照してください ### 2. Push Event Receiver **目的:** 通知とのユーザーインタラクションを処理する **主な責務:** - 通知タップ(メインコンテンツ)を処理 - アクションボタンタップ(Webリンク、ディープリンク)を処理 - 通知削除を処理 - 対応するイベント(`open`, `dismiss`, `link_open`, `deeplink_open`)をトラッキング - Chrome Custom TabsでWeb URLを開く - アプリ内でディープリンクを開く **参照:** [サンプルリポジトリ](https://github.com/treasure-data/mobile-push-samples/tree/main/android)の`PushEventReceiver.kt`を参照してください ### 3. FCM Token Service **目的:** Treasure Dataとのデバイストークン登録を管理する **主な責務:** - 現在のFCMトークンを取得 - アプリ起動時にTreasure Dataにトークンを登録 - FCMによるトークン更新時に再登録 - ユーザーログイン時にトークンとユーザーIDを関連付け - `token_register`イベントをトラッキング **参照:** [サンプルリポジトリ](https://github.com/treasure-data/mobile-push-samples/tree/main/android)の`FcmTokenService.kt`を参照してください ### 4. Event Queue **目的:** Treasure Dataにアップロードする前にイベントをローカルに保存する **主な責務:** - SharedPreferencesにイベントを永続化 - 最大サイズ制限(1000イベント)でFIFOキューを実装 - アップロード用のバッチドレインをサポート - キューオーバーフローを適切に処理 **参照:** [サンプルリポジトリ](https://github.com/treasure-data/mobile-push-samples/tree/main/android)の`EventQueue.kt`を参照してください ### 5. Push Event Uploader **目的:** Treasure Data Ingest APIにイベントをアップロードする **主な責務:** - イベントをバッチアップロード(リクエストあたり最大500件) - 信頼性の高いバックグラウンド実行にWorkManagerを使用 - 指数バックオフを使用した再試行ロジックを実装 - Treasure Dataポストバック APIにイベントを送信 - アップロード失敗を適切に処理 **参照:** [サンプルリポジトリ](https://github.com/treasure-data/mobile-push-samples/tree/main/android)の`PushEventUploader.kt`を参照してください ### 6. MainActivity Integration **目的:** 通知タップとディープリンクを処理する **主な責務:** - 通知タップインテントを受信 - `open`イベントをトラッキング - ディープリンクに基づいて適切な画面に遷移 - 指定されたWeb URLを開く **参照:** [サンプルリポジトリ](https://github.com/treasure-data/mobile-push-samples/tree/main/android)の`MainActivity.kt`を参照してください ## データペイロードスキーマ アプリはFCM `data`ペイロードで以下のJSON構造を受信します: ```json { "td_campaign_id": "cmp_20251214_promo", "title": "Special Offer!", "body": "Get 20% off your next purchase", "image_url": "https://cdn.example.com/banner.png", "link": "https://example.com/promo" } ``` | フィールド | 型 | 必須 | 説明 | | --- | --- | --- | --- | | `td_campaign_id` | String | Yes | Engage Studioからの一意のキャンペーン識別子 | | `title` | String | Yes | 通知タイトル | | `body` | String | Yes | 通知本文テキスト | | `image_url` | String | No | リッチ通知画像のURL | | `link` | String | No | ブラウザで開くWeb URL | ## イベントトラッキング アプリは以下のイベントをトラッキングしTreasure Dataに送信する必要があります: | イベントタイプ | トラッキングタイミング | 必須フィールド | | --- | --- | --- | | `delivery` | 通知が受信され表示されたとき | `campaign_id`, `message_id`, `platform`, `time` | | `open` | ユーザーが通知をタップしたとき | `campaign_id`, `message_id`, `platform`, `time`, `user_id` | | `dismiss` | ユーザーが通知を削除したとき | `campaign_id`, `message_id`, `platform`, `time`, `user_id` | | `link_open` | ユーザーがWebリンクをタップしたとき | `campaign_id`, `message_id`, `platform`, `time`, `user_id`, `value` (URL) | | `deeplink_open` | ユーザーがディープリンクをタップしたとき | `campaign_id`, `message_id`, `platform`, `time`, `user_id`, `value` (URI) | | `token_register` | FCMトークンが取得または更新されたとき | `fcm_token`, `platform`, `time`, `user_id` (ログイン時) | すべてのイベントはTreasure Data Ingest APIエンドポイントに送信する必要があります: ``` POST https://in.treasuredata.com/postback/v3/event/{database}/{table} Header: X-TD-Write-Key: YOUR_WRITE_KEY ``` 完全なスキーマ詳細については[Push Events Table](/ja/products/marketing-cloud/engage-studio/channels/mobile-push/push-events-table)ドキュメントを参照してください。 ## 設定要件 ### AndroidManifest.xml アプリで以下を宣言する必要があります: - `INTERNET`パーミッション - `POST_NOTIFICATIONS`パーミッション(Android 13+) - Firebase Messaging Service - 通知アクション用のBroadcast Receiver - ディープリンクのインテントフィルター ### build.gradle.kts 必要な依存関係: - Firebase BoM: `34.7.0`以降 - Firebase Messaging (バージョンはBoMで管理) - Treasure Data Android SDK: `1.1.0`以降 - WorkManager: `2.9.1`以降 - Chrome Custom Tabs: `1.8.0`以降 依存関係の設定例: ```kotlin dependencies { // Firebase implementation(platform("com.google.firebase:firebase-bom:34.7.0")) implementation("com.google.firebase:firebase-messaging") implementation("com.google.firebase:firebase-analytics") // Treasure Data SDK implementation("com.treasuredata:td-android-sdk:1.1.0") // バックグラウンドタスク implementation("androidx.work:work-runtime-ktx:2.9.1") // Webリンク implementation("androidx.browser:browser:1.8.0") } ``` ### local.properties `local.properties`でTreasure Data設定を構成します(このファイルはバージョン管理から除外してください): ```properties TD_WRITE_KEY=your_write_api_key_here TD_DATABASE=mobile TD_TABLE=push_events TD_ENDPOINT=https://in.treasuredata.com ``` `build.gradle.kts`でこれらのプロパティにアクセス: ```kotlin val localProperties = Properties() localProperties.load(FileInputStream(rootProject.file("local.properties"))) android { defaultConfig { buildConfigField("String", "TD_WRITE_KEY", "\"${localProperties["TD_WRITE_KEY"]}\"") buildConfigField("String", "TD_DATABASE", "\"${localProperties["TD_DATABASE"]}\"") buildConfigField("String", "TD_TABLE", "\"${localProperties["TD_TABLE"]}\"") buildConfigField("String", "TD_ENDPOINT", "\"${localProperties["TD_ENDPOINT"]}\"") } } ``` ### 通知パーミッション Android 13+ (API 33)の場合、ランタイムで`POST_NOTIFICATIONS`パーミッションをリクエストします。 ## ユーザーID関連付け プッシュ通知イベントを特定のユーザーとリンクするには: 1. **ログインユーザー**: すべてのイベントに`user_id`(例: 顧客ID、メールハッシュ値)を含める 2. **匿名ユーザー**: イベントで`user_id`に`null`を渡す 3. **ログイン時**: `user_id`を含む新しい`token_register`イベントを送信してデバイスを関連付ける Treasure Dataは同じ`fcm_token`からのすべての以前のイベントをユーザーにリンクします。 ## テスト ### 通知配信のテスト 1. Google Play Servicesを搭載したデバイスでアプリを実行 2. logcatでFCMトークンを確認 3. Firebase Consoleからテスト通知を送信 4. デバイスに通知が表示されることを確認 ### イベントトラッキングの確認 Treasure Dataでクエリを実行してイベントがログに記録されていることを確認: ```sql SELECT time, type, campaign_id, message_id, platform FROM mobile.push_events WHERE platform = 'android' ORDER BY time DESC LIMIT 100 ``` ## セキュリティのベストプラクティス 1. **APIキー**: - `TD_WRITE_KEY`をソース管理にコミットしない - BuildConfigまたは環境変数を使用 - 書き込み専用キーを使用(マスターキーではない) 2. **ディープリンク**: - ディープリンクの宛先を常に検証 - 機密性の高いアクションにURL許可リストを実装 - ナビゲーション前にパラメータをサニタイズ 3. **イベントデータ**: - イベントペイロードにPIIを含めない - 可能な限りハッシュ化または匿名化されたユーザーIDを使用 4. **ネットワークセキュリティ**: - APIエンドポイントには常にHTTPSを使用 - 本番環境では証明書ピン留めを検討 ## トラブルシューティング ### 通知が受信されない - FCMトークンが生成されアップロードされたことを確認 - Google Play Servicesがインストールされ更新されていることを確認 - 通知パーミッションを確認(Android 13+) - `google-services.json`が`app/`ディレクトリにあることを確認 ### イベントがTreasure Dataに表示されない - `local.properties`の`TD_WRITE_KEY`が正しいことを確認 - `TD_ENDPOINT`がリージョンと一致することを確認 - Treasure Dataにデータベースとテーブルが存在することを確認 - `MyApplication`でTreasure Data SDKが適切に初期化されていることを確認 - デバッグログを有効化してSDKの動作を確認: `TreasureData.enableLogging()` ### ディープリンクが機能しない - AndroidManifest.xmlのインテントフィルターを確認 - 次のコマンドでテスト: `adb shell am start -W -a android.intent.action.VIEW -d "myapp://test"` - URI形式が登録されたスキームと一致することを確認 ## サンプルリポジトリ 完全な本番環境対応の実装: **[https://github.com/treasure-data/engage-push-notification-sample/tree/main/android](https://github.com/treasure-data/engage-push-notification-sample/tree/main/android)** リポジトリに含まれる内容: - インラインドキュメント付きの完全なソースコード - Treasure Data SDK連携を含むGradle設定 - AndroidManifest.xmlセットアップ - テスト手順 - セキュリティのベストプラクティス - 設定ファイルの例 ## 実装ガイド このセクションでは、サンプルアプリケーションのビルドとテストの詳細な手順を提供します。 ### プロジェクト構造 サンプルリポジトリは以下のディレクトリ構造に従います: ``` android/ ├── app/ │ ├── src/main/ │ │ ├── java/com/treasuredata/pushsample/ │ │ │ ├── MainActivity.kt # ディープリンクと通知処理 │ │ │ ├── MyApplication.kt # アプリ初期化 │ │ │ └── fcm/ │ │ │ ├── MyFirebaseMessagingService.kt # FCMメッセージ受信 │ │ │ ├── PushEventReceiver.kt # 通知アクション処理 │ │ │ ├── PushAction.kt # アクション定数 │ │ │ ├── FcmTokenService.kt # トークン管理 │ │ │ ├── EventQueue.kt # ローカルイベント保存 │ │ │ └── PushEventUploader.kt # TDへのバッチアップロード │ │ ├── res/ │ │ └── AndroidManifest.xml │ ├── build.gradle.kts │ └── google-services.json # Firebase設定 ├── gradle/ ├── build.gradle.kts └── settings.gradle.kts ``` ### ビルドと実行手順 #### 事前準備 - Android Studio Hedgehog (2023.1.1) 以降 - JDK 17 以降 - Android SDK 26 (Android 8.0) 以降 #### セットアップ手順 1. リポジトリをクローン: ```bash git clone https://github.com/treasure-data/engage-push-notification-sample.git cd engage-push-notification-sample/android ``` 1. Android Studioでプロジェクトを開く 2. Firebaseを設定: - `google-services.json`を自分のFirebase設定ファイルに置き換える - `app/build.gradle.kts`の`applicationId`をFirebaseアプリと一致するように更新 3. Treasure Dataを設定: - `local.properties.example`を`local.properties`にコピー - `local.properties`をTreasure Data設定で編集: ```properties TD_WRITE_KEY=your_write_api_key_here TD_DATABASE=mobile TD_TABLE=push_events TD_ENDPOINT=https://in.treasuredata.com ``` - **重要:** `local.properties`をバージョン管理にコミットしないでください 4. Gradleを同期してビルド: ```bash ./gradlew assembleDebug ``` ### テストワークフロー #### 事前準備 - [ ] Androidアプリが登録されたFirebaseプロジェクト - [ ] `app/`ディレクトリに配置された`google-services.json` - [ ] 作成されたTreasure Dataデータベースとテーブル - [ ] Google Play Services搭載のエミュレーターまたは実機 #### エミュレーターでのテスト 1. エミュレーターを起動: ```bash emulator -avd Pixel_5_API_34 ``` 1. アプリをインストールして実行: ```bash ./gradlew installDebug adb shell am start -n com.treasuredata.pushsample/.MainActivity ``` 1. FCMトークンをログで確認: ```bash adb logcat | grep -E "FCM token|FCMService" ``` 1. Firebase Consoleからテスト通知を送信して確認 #### イベントトラッキングの確認 ```sql SELECT time, type, campaign_id, message_id, platform, user_id FROM mobile.push_events WHERE platform = 'android' AND time > td_time_add(now(), '-1h', 'JST') ORDER BY time DESC LIMIT 20 ``` ### 実装チェックリスト #### フェーズ1: プロジェクトセットアップ - [ ] 最小SDK 26のAndroidプロジェクトを作成 - [ ] `build.gradle.kts`にFirebase依存関係を追加 - [ ] WorkManager、OkHttp、Chrome Custom Tabs依存関係を追加 - [ ] `google-services.json`をダウンロードして`app/`に配置 #### フェーズ2: Manifest設定 - [ ] `INTERNET`パーミッションを宣言 - [ ] `POST_NOTIFICATIONS`パーミッションを宣言(Android 13+) - [ ] `MyFirebaseMessagingService`を登録 - [ ] `PushEventReceiver` BroadcastReceiverを登録 - [ ] MainActivityにディープリンク用のインテントフィルターを追加 #### フェーズ3: コアコンポーネント - [ ] `MyApplication`クラスでFirebase初期化 - [ ] `MyFirebaseMessagingService`を実装 - [ ] `FcmTokenService`でトークン管理を実装 - [ ] SharedPreferences永続化を使用した`EventQueue`を実装 - [ ] WorkManager + OkHttpを使用した`PushEventUploader`を実装 #### フェーズ4: 通知表示 - [ ] 通知チャネルを作成(Android 8+) - [ ] タイトル、本文、アイコン付きの通知をビルド - [ ] 画像サポートを追加(`image_url`が存在する場合) - [ ] NotificationManagerで通知を表示 #### フェーズ5: イベントトラッキング - [ ] `onMessageReceived`で`delivery`イベントを追跡 - [ ] 通知タップ時に`open`イベントを追跡 - [ ] 通知削除時に`dismiss`イベントを追跡 - [ ] Webリンクタップ時に`link_open`イベントを追跡 - [ ] ディープリンクタップ時に`deeplink_open`イベントを追跡 #### フェーズ6: テスト - [ ] エミュレーターで通知配信をテスト - [ ] 実機で通知配信をテスト - [ ] 通知画像をテスト - [ ] ディープリンクナビゲーションをテスト - [ ] Chrome Custom TabsでWebリンク開封をテスト - [ ] Treasure Dataにイベントが表示されることを確認 ### ビルドトラブルシューティング #### "google-services.json is missing"エラー ```bash ls app/google-services.json ./gradlew --refresh-dependencies ``` #### WorkManagerジョブが実行されない ```bash # WorkManagerステータスを確認 adb shell dumpsys jobscheduler | grep PushEventUpload ``` #### 通知が表示されない - Google Play Servicesがインストールされていることを確認 - 通知パーミッションが許可されていることを確認(Android 13+) - logcatでFCMエラーを確認: `adb logcat | grep FCM` #### イベントがTreasure Dataにアップロードされない - `TD_WRITE_KEY`が正しいことを確認 - ネットワーク接続を確認 - エンドポイントURLがリージョンと一致することを確認 - WorkManagerログを確認: `adb logcat | grep WorkManager` ## 次のステップ 1. **サンプルリポジトリをクローン**して実装を確認 2. [Mobile Push Setup](/ja/products/marketing-cloud/engage-studio/channels/mobile-push/mobile-push-setup)ガイドに従って**Firebaseを設定** 3. Androidアプリに**コンポーネントを実装** 4. **通知配信とイベントトラッキングをテスト** 5. [Push Events Table](/ja/products/marketing-cloud/engage-studio/channels/mobile-push/push-events-table)で**イベントデータを確認** 6. [Engage Studio](/ja/products/marketing-cloud/engage-studio/channels/mobile-push)で**最初のキャンペーンを作成** ## 関連ドキュメント - [Mobile Push Setup](/ja/products/marketing-cloud/engage-studio/channels/mobile-push/mobile-push-setup) - FirebaseとTreasure Data設定 - [iOS Developer Guide](/ja/products/marketing-cloud/engage-studio/channels/mobile-push/developer-guide-ios) - iOS実装ガイド - [Push Events Table](/ja/products/marketing-cloud/engage-studio/channels/mobile-push/push-events-table) - イベントスキーマと分析クエリ - [Campaign Creation](/ja/products/marketing-cloud/engage-studio/channels/mobile-push) - Mobile Pushキャンペーンの作成