プッシュ通知を受信する

🚧

このドキュメントは古いバージョンのAndroid SDK v1について記載しています

Android SDK v1は 2021/05/11でサポート終了となります。
SDK v1 からのアップグレードについては、まず SDK v1からv2のアップグレード方法 をご覧ください。

事前準備

KARTE のプッシュ通知では、バックエンドとして Firebase Cloud Messaging (以下 FCM)を利用しています。
そのため、事前に FCM SDK を導入する必要があります。

FCM SDK を導入することで、FCM の登録トークンの取得が可能となり、KARTE から FCM を経由してプッシュ通知を送ることが可能になります。
なお KARTE から FCM を経由してプッシュ通知を送信するために、KARTE の管理画面側でもいくつかの設定が必要になります。

設定方法については、以下のドキュメントをご覧ください。

FCM SDK の導入を行う

FCM SDK の導入に関しては、下記ドキュメントをご覧ください。

プッシュ通知の利用に必要な実装を行う

1. FCM トークンの送信

FirebaseMessagingService を継承したクラスを作成して、AndroidManifest.xml に追記してください。(既にある場合は追加は不要です。)
onNewToken()が実行されたタイミングで、Tracker.trackFcmToken()を呼び出してください。

class MyFirebaseMessagingService : FirebaseMessagingService {

    override fun onNewToken(token: String) {
        super.onNewToken(token)
        Tracker.getInstance(this, APP_KEY).trackFcmToken(token)
    }
}
public class MyFirebaseMessagingService extends FirebaseMessagingService {

  @Override
  public void onNewToken(String token) {
    super.onNewToken(token);
    Tracker.getInstance(this, APP_KEY).trackFcmToken(token);
  }
}

📘

古いfirebase-messaging SDKを利用している場合

v17.1.0未満のfirebase-messaging SDKを利用してる場合は、代わりにFirebaseInstanceIdServiceを使いonTokenRefresh()trackFcmToken()を呼び出してください。

また、トークンを常に最新に保つためアプリ起動時にも FCM トークンは自動で KARTE に送信されます。

2. 受信した通知メッセージのハンドリング

2-1. KARTE SDKで自動ハンドリング

通知ドロワーに通知を表示する

通知を表示するには、FirebaseMessagingService.onMessageReceived() 内で、MessageHandler クラスの handleMessage を呼び出す必要があります。

KARTEからプッシュ通知を送った場合 MessageHandler.handleMessage(this, remoteMessage) の返り値は true それ以外の方法で送る場合は false が返ります。

class MyFirebaseMessagingService : FirebaseMessagingService() {

  override fun onMessageReceived(remoteMessage: RemoteMessage?) {
    val handled = MessageHandler.handleMessage(this, remoteMessage)
    if (!handled) {
      // Custom action
    }
  }
}
public class MyFirebaseMessagingService extends FirebaseMessagingService {

  @Override
  public void onMessageReceived(RemoteMessage remoteMessage) {

    boolean handled = MessageHandler.handleMessage(this, remoteMessage);
    if (!handled) {
      // Custom action
    }
  }

📘

通知タップ時の遷移先について

handleMessage の第三引数に Intent 情報を含めることで、空もしくは不正なディープリンクが指定されていた場合のデフォルトの遷移先を指定できます。
第三引数を含めない場合は TOP の画面が表示されます。

開封イベントを送信する

通知メッセージを開いた際の開封イベントの送信は、KARTE SDK が自動で行います。
そのため、アプリケーション側で開封イベントの送信処理を実装する必要はありません。

2-2. 独自のハンドリング

🚧

サポート対象外

独自のハンドリングによる表示の変更は、接客のカスタマイズにあたるため、サポート対象外となります。必ずテスト配信等行った上でご活用ください。

通知の表示についてより詳細な制御を行いたい場合、アプリ側で任意の処理が可能です。
この場合はMessageHandler.handleMessageを呼び出さず、以下の実装をしてください。

  • RemoteMessageからデータを取り出して通知を表示する
    • MessageHandler.extractKarteAttribute()により、アクションに指定された変数を取得できます
  • 通知に設定するIntentをMessageHandler.copyInfoToIntent(Intent)に渡す
    • 接客効果測定用のデータがIntentに付加され、通知クリック時にmessage_clickイベントが計測されるようになります。
public class ExampleFirebaseMessagingService extends FirebaseMessagingService {

    fun onMessageReceived(remoteMessage: RemoteMessage) {
        val attr = MessageHandler.extractKarteAttributes(this, remoteMessage)
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse(attr!!.getLink()))
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
        MessageHandler.copyInfoToIntent(remoteMessage.getData(), intent)

        val builder = NotificationCompat.Builder(this, attr!!.getChannel())
                .setContentTitle(attr!!.getTitle())
                .setContentText(attr!!.getBody())
                .setContentIntent(PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT))

        if (attr!!.getBigImage() != null) {
            builder.setStyle(NotificationCompat.BigPictureStyle()
                    .bigPicture(attr!!.getBigImage())
                    .setBigContentTitle(attr!!.getTitle())
                    .setSummaryText(attr!!.getBody()))
        } else {
            builder.setStyle(NotificationCompat.BigTextStyle()
                    .setBigContentTitle(attr!!.getTitle())
                    .bigText(attr!!.getBody())
            )
        }
        val notificationManager = getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.notify("sample", 0, builder.build())
    }

}
public class MyFirebaseMessagingService extends FirebaseMessagingService {

  @Override
  public void onMessageReceived(RemoteMessage remoteMessage) {
    KarteAttributes attr = MessageHandler.extractKarteAttributes(this, remoteMessage);
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(attr.getLink()));
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    MessageHandler.copyInfoToIntent(remoteMessage.getData(), intent);
    
    NotificationCompat.Builder builder = new NotificationCompat
      .Builder(this, attr.getChannel())
      .setContentTitle(attr.getTitle())
      .setContentText(attr.getBody())
      .setContentIntent(PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT));

    if (attr.getBigImage() != null) {
      builder.setStyle(new NotificationCompat.BigPictureStyle()
        .bigPicture(attr.getBigImage())
        .setBigContentTitle(attr.getTitle())
        .setSummaryText(attr.getBody()));
    } else {
      builder.setStyle(new NotificationCompat.BigTextStyle()
        .setBigContentTitle(attr.getTitle())
        .bigText(attr.getBody())
      );
    }
    NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify("sample", 0, builder.build());
  }
}

🚧

注意

KarteAttributes の各値については、接客サービス上で値が指定されていな場合 null が返ってくるため、それらを許容した実装をする必要があります。

3. アイコン・アイコンカラーの設定

  1. 通知のアイコン・ラージアイコン・カスタムカラーを設定するには、次の行を AndroidManifest.xmlapplication タグに追加します
  • 上から setSmallIcon、setLargeIcon、setColor に対応しています
<meta-data
    android:name="io.karte.android.Tracker.notification_icon"
    android:resource="@drawable/ic_notification" />
<meta-data
    android:name="io.karte.android.Tracker.notification_large_icon"
    android:resource="@drawable/ic_notification_large" />
<meta-data
    android:name="io.karte.android.Tracker.notification_color"
    android:resource="@color/colorAccent" />
  1. src/drawable の中に対応する画像を用意します

🚧

通知アイコンのデフォルト画像について

notification_iconの設定を行わなかった場合、デフォルトではアプリのランチャーアイコンが挿入されます。
ただし、デフォルトのランチャーアイコンにアルファチャンネルが含まれない場合は、アイコンがグレーになってしまいます。

回避するには、アルファチャンネルを利用して描かれたアイコンを io.karte.android.Tracker.notification_icon に指定してもらうことで解決できます。

4. 通知チャンネルの作成

テンプレートにてチャンネルの指定を行う場合は、あらかじめチャンネルを作成しおく必要があります。

val channel = NotificationChannel("my_channel", "通知テストチャンネル", NotificationManager.IMPORTANCE_DEFAULT)
channel.description = "テストの説明です"
channel.setShowBadge(true)

// create or update the Notification channel
val notificationManager = applicationContext.getSystemService(Context.NOTIFICATION_SERVICE)
if (notificationManager is NotificationManager) {
  notificationManager.createNotificationChannel(channel)
}
NotificationChannel channel = new NotificationChannel("my_channel", "通知テストチャンネル", NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("テストの説明です");
channel.setShowBadge(true);

// create or update the Notification channel
final NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);

📘

指定されたチャンネルが存在しない場合

テンプレートにて指定されたチャンネルが存在しない場合は、SDK 内で作成したデフォルトチャンネル (krt_default_channel) を指定して通知を行います。

プッシュ通知機能を利用しない場合

プッシュ通知機能を利用せず FCM SDK に依存していなければ、ProGuard 時に警告が出る場合があります。
ProGuard ルールに下記を追加してください。
-dontwarn io.karte.android.tracker.firebase.**

テストメッセージを送信する

テストメッセージの送信方法については、以下のドキュメントをご覧ください。