コンソールへ移動

Android で Firebase Cloud Messaging クライアント アプリを設定する

Firebase Cloud Messaging Android クライアント アプリを作成するには、FirebaseMessaging API と Android Studio 1.4 以降を Gradle とともに使用します。このページの説明では、Firebase を Android プロジェクトに追加する手順がすでに完了済みであることを前提としています。

FCM クライアントには Android 4.1 以降を実行しているデバイスが必要です。またそのデバイスには、Google Play ストア アプリがインストールされているか、Google API を使用して Android 4.1 が動作しているエミュレータが搭載されている必要があります。ただし、開発した Android アプリは Google Play ストア経由以外の手段でもデプロイできます。

Firebase と FCM SDK を設定する

  1. まだ追加していない場合は、Firebase を Android プロジェクトに追加します
  2. プロジェクト レベルの build.gradle ファイルで、buildscript セクションと allprojects セクションの両方に Google の Maven リポジトリを含めます。
  3. Cloud Messaging Android ライブラリの依存関係をモジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle)に追加します。
    implementation 'com.google.firebase:firebase-messaging:19.0.1'

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

アプリのマニフェストに次の追加を行います。

  • FirebaseMessagingService を継承したサービス。これは、バックグラウンド時にアプリで通知を受け取る処理よりも高度なメッセージ処理を行う場合に必要になります。フォアグラウンド時のアプリで通知を受け取る、データ ペイロードを受信する、アップストリーム メッセージを送信するなどの場合は、このサービスを継承する必要があります。
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (オプション)通知のデフォルトのアイコンと色を設定する、アプリケーション コンポーネント内のメタデータ要素。着信メッセージでアイコンや色が明示的に設定されていない場合、Android ではこれらの値を使用します。
  • <!-- 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 8.0(API レベル 26)以降では、通知チャンネルがサポートされ、推奨されています。FCM には、基本設定付きのデフォルト通知チャネルがあります。独自のデフォルト チャネルを作成して使用する場合は、default_notification_channel_id を通知チャネル オブジェクトの ID に設定します(下記を参照)。受信メッセージで通知チャネルが明示的に設定されていない場合、FCM では常にこの値が使用されます。詳細については、通知チャネルの管理をご覧ください。
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

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

アプリを初めて起動すると、クライアント アプリのインスタンスの登録トークンが FCM SDK によって生成されます。単一のデバイスを対象にする場合、またはデバイス グループを作成する場合は、FirebaseMessagingService を拡張して onNewToken をオーバーライドすることで、このトークンにアクセスする必要があります。

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

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

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

現在の登録トークンの取得

現在のトークンを取得する必要がある場合は、FirebaseInstanceId.getInstance().getInstanceId() を呼び出します。

Java

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String token = task.getResult().getToken();

                // Log and toast
                String msg = getString(R.string.msg_token_fmt, token);
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

Kotlin

FirebaseInstanceId.getInstance().instanceId
        .addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful) {
                Log.w(TAG, "getInstanceId failed", task.exception)
                return@OnCompleteListener
            }

            // Get new Instance ID token
            val token = task.result?.token

            // Log and toast
            val msg = getString(R.string.msg_token_fmt, token)
            Log.d(TAG, msg)
            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
        })

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

onNewToken コールバックは、新しいトークンが生成されるたびに呼び出されます。

Java

/**
 * Called if InstanceID token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the InstanceID token
 * is initially generated so this is where you would retrieve the token.
 */
@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // 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(token);
}

Kotlin

/**
 * Called if InstanceID token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the InstanceID token
 * is initially generated so this is where you would retrieve the token.
 */
override fun onNewToken(token: String?) {
    Log.d(TAG, "Refreshed token: $token")

    // 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(token)
}

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

Google Play 開発者サービスのチェック

Play 開発者サービスの SDK に依存するアプリについては、Google Play 開発者サービス機能にアクセスする前に、互換性のある Google Play 開発者サービスの APK がデバイスにインストールされているかどうかをアプリが必ずチェックする必要があります。このチェックは、メイン アクティビティの onCreate() メソッドと onResume() メソッドの 2 か所で行うことをおすすめします。onCreate() では、チェックにパスしないとアプリを使用できないようにします。onResume() では、ユーザーが [戻る] ボタンなどの他の手段を使って実行中のアプリに戻った場合にもチェックされるようにします。

互換性のあるバージョンの Google Play 開発者サービスがデバイスにインストールされていない場合は、アプリで GoogleApiAvailability.makeGooglePlayServicesAvailable() を呼び出すと、ユーザーが Google Play ストアから Google Play 開発者サービスをダウンロードできます。

自動初期化を禁止する

FCM は、Firebase が生成するインスタンス ID を使用して登録トークンを生成します。また、アナリティクスは、この ID を使用してデータを収集します。インスタンス ID が生成されると、ライブラリではその ID と構成データが Firebase にアップロードされます。インスタンス ID の自動生成を禁止するには、次のようにメタデータ値を AndroidManifest.xml に追加して、FCM とアナリティクスで自動初期化を無効にします(両方で無効にする必要があります)。

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

FCM をもう一度有効にするには、ランタイム コールを行います。

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Kotlin

FirebaseMessaging.getInstance().isAutoInitEnabled = true
この値をいったん設定すると、アプリを再起動しても維持されます。

次のステップ

クライアント アプリの設定が完了すると、Notifications Composer でダウンストリーム メッセージを送信できるようになります。この機能は、ダウンロードして実行可能なクイックスタート サンプルで確認できます。

その他のより高度な動作をアプリに追加するには、インテント フィルタを宣言して、受信メッセージに応答するアクティビティを実装します。詳細については、アプリサーバーからメッセージを送信するためのガイドをご覧ください。

これらの機能を利用するには、サーバーの実装とサーバー プロトコル(HTTP または XMPP)、あるいは Admin SDK の実装が必要になることに注意してください。