Android SDK - プッシュ通知のサポート

プッシュ通知のサポート

Firebase Cloud Messaging(FCM)を Singular SDK と統合することで、プッシュ通知に対するユーザーの操作を追跡し、 リエンゲージメントキャンペーンを測定してコンバージョンを正確にアトリビューションできます。

以下の実装ガイドに従い、通知データが正しく Singular SDK に渡されて適切にアトリビューションされるようにしてください。

プッシュ通知を追跡する理由: プッシュ通知はリエンゲージメントを促進しますが、追跡には正しい統合が必要です。Singular は 通知を操作したユーザーを適切にアトリビューションし、マーケティングキャンペーンとエンゲージメント戦略を最適化します。


実装ガイド

FCM 通知の処理

FirebaseMessagingService 内で onMessageReceived() メソッドをオーバーライドし、プッシュメッセージ受信時に通知データを取得します。

Kotlin Java
override fun onMessageReceived(message: RemoteMessage) {
    super.onMessageReceived(message)
    var title = ""
    var body = ""

    message.notification?.let {
        Log.d("singular-app", it.toString())
        title = it.title ?: ""
        body = it.body ?: ""
    }

    val data: Map<String, String> = message.data
    if (data.isNotEmpty()) {
        Log.d("singular-app", data.toString())
    }

    // Forward payload data to intent
    processNotification(title, body, data)
}

ベストプラクティス: 通知コンテンツ(title、body)とデータペイロードの両方を取得し、アトリビューションに必要な 完全な追跡情報を確保してください。


通知データの処理と転送

通知ペイロードを添付したインテントで MainActivity を起動し、Singular が追跡データを受け取れるようにします。

Kotlin Java
private fun processNotification(title: String, body: String, data: Map<String, String>) {
    val intent = Intent(this, MainActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

        // Attach notification data to the intent
        data.forEach { (key, value) ->
            putExtra(key, value)
        }
    }

    val pendingIntent = PendingIntent.getActivity(
        this,
        0,
        intent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )

    val notificationBuilder = NotificationCompat.Builder(this, "your_channel_id")
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle(title)
        .setContentText(body)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setAutoCancel(true)
        .setContentIntent(pendingIntent)

    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager
    notificationManager?.notify(0, notificationBuilder.build())
}

Android 12+ の要件: Android API 31+ のセキュリティ要件に準拠するため、 PendingIntent.FLAG_IMMUTABLE を使用してください。


プッシュペイロード用に SDK を構成

SDK 構成にプッシュ通知ペイロードのセレクターを追加し、Singular リンクが通知データ構造のどこに 配置されているかを指定します。

プッシュアトリビューションの仕組み。 SDK は onMessageReceived の内部で受信プッシュペイロードを解析しません。代わりに、通知からアクティビティが起動された時にリンクが抽出されます。OS が 通知データを起動インテントとして渡し、それを SingularConfig を介して Singular.init() に転送します。ライフサイクルは次の通りです:

  1. 通知が到着 → onMessageReceived がそれを表示(開発者のコード)。
  2. ユーザーが通知をタップ → Android が通知データをインテントに添付してアクティビティを起動。
  3. アクティビティが Singular.init(context, config) を呼び出し、 withPushNotificationPayload(intent, selectors) を通じてインテントを渡す。
  4. SDK がセレクターをたどって Singular リンクを見つけ、プッシュ起因のセッションを記録。

プッシュアトリビューションは、通知からアクティビティが起動された後に Singular.init() が到達することに依存します。 withPushNotificationPayload が構成されていないと、通知の構築方法にかかわらずリンクは抽出されません。 setFCMDeviceToken によるアンインストール計測は独立しており、プッシュアトリビューションには不要です。

Kotlin Java
val pushSelectors = arrayOf(
    arrayOf("sng_link"),
    arrayOf("rootObj", "nestedObj", "anotherNested", "singularLink")
)

val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withPushNotificationPayload(intent, pushSelectors)

Singular.init(applicationContext, config)

セレクターの構成:

  • シンプルなキー: ペイロード内の最上位キーには arrayOf("sng_link") を使用します。
  • ネストされたキー: ネストされた JSON 構造をたどるには arrayOf("rootObj", "nestedObj", "key") を使用します。
  • 複数のパス: 複数のセレクター配列を定義し、Singular リンクが配置されうる複数の場所を確認します。

検証ガイド

Start Session でのペイロード検証

Start Session の API 呼び出しを確認することで、プッシュ通知リンクが正しく Singular に渡されていることを検証します。

Singular SDK は、ユーザーが通知をタップした際の Start Session リクエストの singular_link パラメーターにプッシュ通知ペイロードを含めます。

Start Session リクエストの使用例:

https://sdk-api-v1.singular.net/api/v1/start?
a=<SDK-Key>
&singular_link=https://singularassist2.sng.link/C4nw9/r1m0?_dl=singular://test&_smtype=3
&i=net.singular.singularsampleapp
&s=1740905574084
&sdk=Singular/v12.6.2

別の検証方法: Singular SDK Console を使用してプッシュ通知の追跡を検証することもできます。 Deeplink URL フィールドで追跡リンクが正しく取得されていることを確認してください。


高度な構成

ESP ドメインの構成

Singular リンクをメールサービスプロバイダー(ESP)やその他のサードパーティドメインでラップしている場合は、外部ドメインを構成します。

Kotlin Java
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withESPDomains(listOf("sl.esp.link", "custom.domain.com"))

セキュリティに関する注意: デフォルトでは、Singular Manage Links ページに事前定義された sng.link ドメインのみが許可されます。ラップされたリンクを使用する場合は、ESP ドメインを明示的に構成してください。


動的ディープリンクのルーティング

1 つの Singular トラッキングリンクに動的なリダイレクトオーバーライドを構成することで、単一の通知から複数のディープリンク先を実現できます。

使用例: 複数のアクションオプションを含む速報通知

  • 最新ニュースを読む: newsapp://article?id=12345
  • トレンドのトピック: newsapp://trending
  • スポーツ: newsapp://sports

複数のトラッキングリンクを作成する代わりに、1 つの Singular リンクを使用し、ユーザーの選択に応じて動的にリダイレクトをオーバーライドしてください。実装の詳細は Singular トラッキングリンクでのリダイレクトのオーバーライド を参照してください。


重要な考慮事項

実装に関する注意事項

  • コールバックハンドラーなし: withSingularLink とは異なり、プッシュ通知機能はペイロードのコールバックを提供しません。アプリ内の特定のコンテンツにユーザーを誘導するための ディープリンクロジックは独自に実装してください。
  • アトリビューションフロー: ユーザーが通知をタップすると、Singular はペイロードを取得して Singular.init() によってトリガーされる Start Session イベントに含めます。バックエンドはこのデータを処理して プッシュ通知のタッチポイントをアトリビューションし、リエンゲージメントの追跡を登録します。
  • ドメイン制限: デフォルトでは Manage Links ページに登録された Singular リンクドメイン( sng.link )のみが許可されます。ラップされたリンクを使用する場合は withESPDomains() で ESP ドメインを明示的に構成してください。

完了: これらの手順に従うことで、アプリは Singular でプッシュ通知の操作を追跡できるようになり、 キャンペーンのパフォーマンスインサイトが向上し、正確なリエンゲージメントアトリビューションが可能になります。