プッシュ通知のサポート
Firebase Cloud Messaging(FCM)を Singular SDK と統合することで、プッシュ通知に対するユーザーの操作を追跡し、 リエンゲージメントキャンペーンを測定してコンバージョンを正確にアトリビューションできます。
以下の実装ガイドに従い、通知データが正しく Singular SDK に渡されて適切にアトリビューションされるようにしてください。
プッシュ通知を追跡する理由: プッシュ通知はリエンゲージメントを促進しますが、追跡には正しい統合が必要です。Singular は 通知を操作したユーザーを適切にアトリビューションし、マーケティングキャンペーンとエンゲージメント戦略を最適化します。
実装ガイド
FCM 通知の処理
FirebaseMessagingService 内で
onMessageReceived()
メソッドをオーバーライドし、プッシュメッセージ受信時に通知データを取得します。
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)
}
@Override
public void onMessageReceived(@NonNull RemoteMessage message) {
super.onMessageReceived(message);
String title = "";
String body = "";
if (message.getNotification() != null) {
Log.d("singular-app", message.getNotification().toString());
title = message.getNotification().getTitle();
body = message.getNotification().getBody();
}
Map<String, String> data = message.getData();
if (!data.isEmpty()) {
Log.d("singular-app", data.toString());
}
// Forward payload data to intent
processNotification(title, body, data);
}
ベストプラクティス: 通知コンテンツ(title、body)とデータペイロードの両方を取得し、アトリビューションに必要な 完全な追跡情報を確保してください。
通知データの処理と転送
通知ペイロードを添付したインテントで MainActivity を起動し、Singular が追跡データを受け取れるようにします。
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())
}
private void processNotification(String title, String body, Map<String, String> data) {
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
// Attach notification data to the intent
for (Map.Entry<String, String> entry : data.entrySet()) {
intent.putExtra(entry.getKey(), entry.getValue());
}
PendingIntent pendingIntent = PendingIntent.getActivity(
this,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "your_channel_id")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(title)
.setContentText(body)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager != null) {
notificationManager.notify(0, notificationBuilder.build());
}
}
Android 12+ の要件:
Android API 31+ のセキュリティ要件に準拠するため、
PendingIntent.FLAG_IMMUTABLE
を使用してください。
プッシュペイロード用に SDK を構成
SDK 構成にプッシュ通知ペイロードのセレクターを追加し、Singular リンクが通知データ構造のどこに 配置されているかを指定します。
プッシュアトリビューションの仕組み。
SDK は
onMessageReceived
の内部で受信プッシュペイロードを解析しません。代わりに、通知からアクティビティが起動された時にリンクが抽出されます。OS が
通知データを起動インテントとして渡し、それを
SingularConfig
を介して
Singular.init()
に転送します。ライフサイクルは次の通りです:
-
通知が到着 →
onMessageReceivedがそれを表示(開発者のコード)。 - ユーザーが通知をタップ → Android が通知データをインテントに添付してアクティビティを起動。
-
アクティビティが
Singular.init(context, config)を呼び出し、withPushNotificationPayload(intent, selectors)を通じてインテントを渡す。 - SDK がセレクターをたどって Singular リンクを見つけ、プッシュ起因のセッションを記録。
プッシュアトリビューションは、通知からアクティビティが起動された後に
Singular.init()
が到達することに依存します。
withPushNotificationPayload
が構成されていないと、通知の構築方法にかかわらずリンクは抽出されません。
setFCMDeviceToken
によるアンインストール計測は独立しており、プッシュアトリビューションには不要です。
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)
String[][] pushSelectors = {
{"sng_link"},
{"rootObj", "nestedObj", "anotherNested", "singularLink"}
};
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withPushNotificationPayload(getIntent(), pushSelectors);
Singular.init(getApplicationContext(), 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)やその他のサードパーティドメインでラップしている場合は、外部ドメインを構成します。
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withESPDomains(listOf("sl.esp.link", "custom.domain.com"))
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withESPDomains(Arrays.asList("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 でプッシュ通知の操作を追跡できるようになり、 キャンペーンのパフォーマンスインサイトが向上し、正確なリエンゲージメントアトリビューションが可能になります。