プッシュ通知の実装ヒント

ここでは、Android でプッシュ通知を実装する場合にヒントとなる技術情報をご紹介します。

ここで紹介する技術は、Kii Cloud 外の情報が主体です。これらの API の詳細は、Android のドキュメントや一般の技術系 Web サイトをご覧ください。

ステータスバーへの表示

Android 上でのプッシュ通知では、メッセージを受信してもプログラムのメソッドが呼び出されるだけで、画面上は何も起こりません。プッシュ通知が届いたとき、次の画面のようにステータスバーにメッセージを出力したい場合は、アプリ側で出力するようにプログラムを用意する必要があります(ステータスバーのデザインは機種によって異なります)。

以下は Direct Push を受信したときに、メッセージをステータスバーに表示する例です。Direct Push で利用できるカスタムのキーと値のペアからメッセージを取得して表示しています。

なお、このサンプルコードは、Google のサンプルコード https://github.com/googlesamples/google-services.git からステータスバーの処理部分を抜粋し、Kii Cloud 用にアレンジしたものです。

private static final String CHANNEL_ID = "my_channel";

private void displayNotification(Context context, DirectPushMessage directMessage) {
  Intent intent = new Intent(context, MainActivity.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent,
          PendingIntent.FLAG_ONE_SHOT);

  String title = directMessage.getMessage().getString("title", "");
  String message = directMessage.getMessage().getString("message", "");
  Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
  NotificationCompat.Builder builder;
  if (Build.VERSION.SDK_INT >= 26) {  // 26: Build.VERSION_CODES.O
      builder = new NotificationCompat.Builder(context, CHANNEL_ID);
  } else {
      builder = new NotificationCompat.Builder(context);
  }
  builder.setSmallIcon(R.drawable.ic_launcher)
         .setContentTitle(title)
         .setContentText(message)
         .setAutoCancel(true)
         .setSound(defaultSoundUri)
         .setContentIntent(pendingIntent);

  NotificationManager notificationManager = (NotificationManager)
          context.getSystemService(Context.NOTIFICATION_SERVICE);
  notificationManager.notify(0, builder.build());
}

ここでは、プッシュメッセージに含まれる titlemessage を使ってステータスバーのメッセージとタイトルの文字列を指定しています。Push to User でも同様のカスタムフィールドを使用できますが、Push to App では固定文字列を使うか、イベントの内容から間接的にメッセージを用意します。なお、FCM ではペイロードのサイズ全体で 4 KB までの制限があるため、長いメッセージを扱う場合はご注意ください。

さらに、Android の PendingIntent により、ステータスバーがクリックされたときに、アプリの MainActivity が呼び出されるようにしています。

サンプルコードでは、Android 8.0 以前かどうかによって NotificationCompat.Builder の初期化方法を分岐しています。build.gradle で targetSdkVersion を 26 未満(Android 8.0 未満)を指定する場合は、CHANNEL_ID のあるコンストラクタがエラーとなるため、else 側の初期化方法を使用してください。また、targetSdkVersion を 26 以上にする場合、Builder クラスは android.support.v4.app.NotificationCompat パッケージを使用します(v7 ではエラーになります)。

Android 8.0 以降でステータスバーにメッセージを表示する場合は注意が必要です。下記 通知チャンネルの指定 を参照してください。

ステータスバーの使用方法は、Android のドキュメント をご覧ください。

Direct Push のメッセージを送信する際は、Kii Cloud の開発者ポータルからメッセージを指定します。このサンプルコードでは、次のようにカスタムフィールドの titlemessage を指定すると、冒頭に示したようなメッセージがステータスバーに表示されます。

通知チャンネルの指定

Android 8.0 以降では、ステータスバーにメッセージを表示する際、通知チャンネル を指定する機能をサポートしています。

build.gradle の targetSdkVersion に 26 以上(Android 8.0 以上)を指定した場合、通知チャンネルを指定しないとステータスバーにメッセージが表示されません。

targetSdkVersion 実行する OS メッセージの表示
25 以下 Android 7.1 以下 通知チャンネルがなくても表示されます。
25 以下 Android 8.0 以上 通知チャンネルがなくても表示されます。
26 以上 Android 7.1 以下 通知チャンネルがなくても表示されます。
26 以上 Android 8.0 以上 通知チャンネルを指定しないと表示されません。

通知チャンネルは、モバイルアプリの仕様にあわせて通知をグループ分けする機能です。たとえば、ステータスバーに表示される内容を「お知らせ」「セール情報」などの通知チャンネルにグループ化できます。ユーザーは通知チャンネルごとに通知のオン、オフを切り替えられる他、モバイルアプリでは通知チャンネルごとに LED の色やバイブレーションのパターンを指定できます。

以下は Android の設定から、"KiiTest" アプリの通知チャンネルを選択している例です。

通知チャンネルは以下のように初期化します。

final String CHANNEL_ID = "my_channel";
final String CHANNEL_ID2 = "my_channel2";

if (Build.VERSION.SDK_INT >= 26) {  // 26: Build.VERSION_CODES.O
  NotificationChannel channel1 = new NotificationChannel(
          CHANNEL_ID,
          getString(R.id.notification_channel_information),
          NotificationManager.IMPORTANCE_DEFAULT
  );
  notificationManager.createNotificationChannel(channel1);

  NotificationChannel channel2 = new NotificationChannel(
          CHANNEL_ID2,
          getString(R.id.notification_channel_sales),
          NotificationManager.IMPORTANCE_DEFAULT
  );

  NotificationManager notificationManager = (NotificationManager)
          context.getSystemService(Context.NOTIFICATION_SERVICE);
  notificationManager.createNotificationChannel(channel2);
}

ここでは、2 つの通知チャンネルを初期化して NotificationManager に登録しています。

NotificationChannel のコンストラクタでは、ID として "my_channel" と "my_channel2" を指定しています。これらの ID は、NotificationCompat.Builder のコンストラクタで指定することで、ステータスバーに表示するメッセージの通知チャンネルを識別します。

第 2 引数では、設定画面に表示される文字列をしています。getString() メソッドで「お知らせ」「セール情報」などを指定する想定です。

その他、NotificationChannel インスタンスに用意されているセッターメソッドを使用すると、LED の色やバイブレーションのパターンも指定できます。