Android 端末に通知を送信する

Firebase Notifications を使用すると、単一の特定の端末に通知を送信できます。Notifications コンソールで通知を作成して送信するときにトークンを提供するには、その端末上のアプリ インスタンスの登録トークンにアクセスする必要があります。

SDK を設定する

このセクションで説明しているタスクは、アプリの他の Firebase 機能を既に有効にしている場合は完了済みの可能性があります。

事前準備

  • Android 2.3(Gingerbread)以降、および Google Play 開発者サービス 10.0.1 以降が搭載された端末
  • Android SDK マネージャーで利用可能な Google リポジトリにある Google Play 開発者サービス SDK
  • Android Studio の最新バージョン(バージョン 1.5 以降)

Android Studio プロジェクトをまだ用意していない場合、Firebase 機能を試すだけであれば、クイックスタート サンプルをダウンロードしてご利用いただけます。クイックスタートを使用する場合は、プロジェクトのモジュール フォルダ(通常は app/)内の build.gradle ファイルからアプリケーション ID を取得してください。このパッケージ名が次のステップで必要になるからです。

アプリに Firebase を追加する

アプリに Firebase を追加するには、Firebase プロジェクトと、アプリ用の Firebase 設定ファイルが必要です。

  1. Firebase プロジェクトをまだ用意していない場合は、Firebase console で Firebase プロジェクトを作成します。モバイルアプリと関連付けられた既存の Google プロジェクトがある場合は、[Google プロジェクトをインポート] をクリックします。それ以外の場合は、[新規プロジェクトを作成] をクリックします。
  2. [Android アプリに Firebase を追加] をクリックし、設定手順に沿って操作します。既存の Google プロジェクトをインポートする場合、このステップは自動的に実行されることがあります。その場合は、設定ファイルをダウンロードするだけでかまいません。
  3. プロンプトが表示されたら、アプリのパッケージ名を入力します。必ずアプリで使用しているパッケージ名を入力してください。パッケージ名を設定できるのは、アプリを Firebase プロジェクトに追加するときだけです。
  4. google-services.json ファイルをダウンロードします。このファイルはいつでももう一度ダウンロードできます。
  5. このファイルをプロジェクトのモジュール フォルダ(通常は app/)にコピーしていない場合は、コピーします。

SDK を追加する

Firebase ライブラリをプロジェクトに統合する場合は、Android Studio プロジェクトを準備するためのいくつかの基本タスクを実行する必要があります。ただし、アプリに Firebase を追加するときに、既にこの手順を完了している可能性があります。

まず、google-services プラグインを含めるように、ルートレベルの build.gradle ファイルにルールを追加します。

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

次に、モジュールの Gradle ファイル(通常は app/build.gradle)の末尾に apply plugin 行を追加して、Gradle プラグインを有効にします。

apply plugin: 'com.android.application'

android {
  // ...
}

dependencies {
  // ...
  compile 'com.google.firebase:firebase-core:10.0.1'

  // Getting a "Could not find" error? Make sure you have
  // the latest Google Repository in the Android SDK manager
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

また、使用する Firebase SDK の依存関係も追加する必要があります。はじめに、Firebase Analytics 機能を提供する com.google.firebase:firebase-core から開始することをおすすめします。使用可能なライブラリの一覧をご覧ください。

登録トークンにアクセスする

アプリを初めて起動すると、クライアント アプリのインスタンスの登録トークンが FCM SDK によって生成されます。1 種類の端末を対象とするか、端末グループを作成する場合は、FirebaseInstanceIdService を拡張してこのトークンにアクセスする必要があります。

このセクションでは、トークンを取得する方法、およびトークンに対する変更をモニタリングする方法について説明します。トークンは最初の起動後にローテーションされている可能性があるため、更新された最新の登録トークンを取得することを強くおすすめします。

登録トークンは次のような場合に変更されることがあります。

  • アプリによってインスタンス ID が削除される場合
  • アプリが新しい端末で復元される場合
  • ユーザーがアプリをアンインストール / 再インストールする場合
  • ユーザーがアプリのデータを消去する場合

最新の登録トークンの取得

最新のトークンを取得する必要がある場合は、FirebaseInstanceID.getToken() を呼び出します。トークンがまだ生成されていない場合、このメソッドは null を返します。

トークンの生成のモニタリング

新しいトークンが生成されるたびに onTokenRefresh コールバックが呼び出されるため、そのコンテキストで getToken を呼び出すことにより、利用可能な最新の登録トークンに確実にアクセスできます。このサービスをマニフェストに追加してから、次の例のように onTokenRefresh のコンテキスト内で getToken を呼び出し、値をログに記録します。

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    sendRegistrationToServer(refreshedToken);
}

トークンを取得したら、それをアプリサーバーに送信して、適切な方法で保管できます。API の詳細については、インスタンス ID API リファレンスをご覧ください。

メッセージの受信と処理

アプリをフォアグラウンドで実行しているときに通知を受信するには、メッセージを処理するロジックを追加する必要があります。

メッセージを受信するには、FirebaseMessagingService を拡張したサービスを使用します。サービスでは onMessageReceived コールバックをオーバーライドする必要があります。このコールバックは次の例外を除いて、ほとんどのメッセージ タイプに利用できます。

  • アプリがバックグラウンドで動作しているときに配信される通知。この場合、通知は端末のシステムトレイに配信されます。通知をユーザーがタップすると、デフォルトではアプリのランチャーが開きます。

  • 通知とデータ ペイロードの両方を含む、バックグラウンドおよびフォアグラウンドのメッセージ。この場合、通知は端末の通知領域(システムトレイ)に配信され、データ ペイロードはランチャー アクティビティのインテントの追加部分で配信されます。

要約:

アプリの状態 通知 データ ペイロード 両方
フォアグラウンド onMessageReceived onMessageReceived onMessageReceived
バックグラウンド システムトレイ onMessageReceived 通知: システムトレイ
インテントの追加部分にあるデータ
メッセージ タイプについて詳しくは、通知とデータ メッセージをご覧ください。

アプリのマニフェストの編集

FirebaseMessagingService を使用するには、アプリのマニフェストに次の設定を追加する必要があります。

<service
    android:name=".MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

通知の外観をカスタマイズするためのデフォルト値を設定することもお勧めします。通知ペイロード内に同等の値が設定されていなかった場合に適用されるカスタム デフォルト アイコンとカスタム デフォルト カラーを指定できます。

カスタム デフォルト アイコンとカスタムカラーを設定するには、次の行を application タグに追加します。

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

Android には、以下の場合にカスタム デフォルト アイコンが表示されます。

  • Notifications コンソールから送信されたすべての通知メッセージ。
  • 通知ペイロード内にアイコンが明示的に設定されていない通知メッセージ。

Android では、以下の場合にカスタム デフォルト カラーが使用されます。

  • Notifications コンソールから送信されたすべての通知メッセージ。
  • 通知ペイロード内にカラーが明示的に設定されていない通知メッセージ。

カスタム デフォルト アイコンが設定されず、通知ペイロード内にもアイコンが設定されていない場合は、Android では白色でレンダリングされたアプリケーション アイコンが表示されます。

onMessageReceived のオーバーライド

FirebaseMessagingService.onMessageReceived メソッドをオーバーライドすると、受信した RemoteMessage オブジェクトに基づいて操作を行い、メッセージ データを取得できます。

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // ...

    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

バックグラウンド アプリの通知メッセージの処理

アプリがバックグラウンドで動作しているとき、Android ではシステムトレイに通知メッセージが送られます。ユーザーが通知をタップすると、デフォルトでアプリ ランチャーが開きます。

通知とデータ ペイロードの両方を含むメッセージ(および Notifications コンソールから送信されたすべてのメッセージ)がここに含まれます。この場合、通知は端末のシステムトレイに配信され、データ ペイロードはランチャー アクティビティのインテントの追加部分で配信されます。

Notifications コンソールからメッセージを送信する

  1. ターゲット端末でアプリをインストールして実行します。

  2. アプリが端末のバックグラウンドで動作していることを確認します。

  3. Firebase console の [Notifications] タブを開き、[新しいメッセージ] を選択します。

  4. メッセージテキストを入力します。

  5. メッセージのターゲットとして [単一の端末] を選択します。

  6. [FCM 登録トークン] というラベルの付いたフィールドに、このガイドの前のセクションで取得した登録トークンを入力します。

[メッセージを送信] をクリックすると、アプリをバックグラウンドで実行しているターゲット クライアント端末のシステム通知トレイに通知が届きます。

コンソールのフィールドとメッセージ ペイロード

Notifications コンソールからメッセージを送信する場合、Google は Composer で入力されたフィールドを次の 2 つの方法で使用します。

  1. [ユーザー セグメント] や [有効期限] などのフィールドによってメッセージのターゲットと配信オプションを決定します。
  2. [メッセージ文] や [カスタムデータ] などのフィールドは、Key-Value ペアで構成されたペイロードでクライアントに送信されます。

後者のキーの一部は FCM サーバー API を通じても利用できます。 たとえば、[カスタムデータ] に入力された Key-Value ペアは通知のデータ ペイロードとして処理されます。他のフィールドは FCM 通知ペイロードのキーに直接マッピングされます。

Notifications コンソールの一部のフィールドは FCM サーバーの API では使用できないことに注意してください。たとえば、アプリ、アプリ バージョン、言語に基づいてユーザー セグメントをターゲット設定できても、サーバー API で to フィールドを使用する場合は利用できない可能性があります。

Notifications コンソールからクライアントに送信されるキーには次のものがあります。

キー コンソール フィールドのラベル 説明
notification.title メッセージ タイトル 通知のタイトルを示します。
notification.body メッセージ文 通知の本文テキストを示します。
data カスタムデータ 定義した Key-Value ペア。これらのペアは、処理するアプリのデータ ペイロードとして配信されます。

メッセージの配信を決定するキーには次のものが含まれます。

キー コンソール フィールドのラベル 説明
priority 優先度

メッセージの優先度を設定します。

詳細については、メッセージの優先順位の設定をご覧ください。

sound 通知音

端末が通知を受信したときに再生する通知音を示します。

time_to_live 有効期限

このパラメータでは、端末がオフラインの場合にメッセージを FCM のストレージに保持する期間(秒単位)を指定します。詳細については、メッセージの有効期間の設定をご覧ください。

フィードバックを送信...