Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

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

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

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

SDK を設定する

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

準備

  • Android Studio の最新バージョンをインストールするか、更新してください。

  • プロジェクトが次の要件を満たしていることを確認します。

    • API レベル 16(Jelly Bean)以降が対象です。
    • Gradle 4.1 以降を使用します。
    • Jetpack(AndroidX)を使用します。また、次のバージョン要件を満たしている必要があります。
      • com.android.tools.build:gradle v3.2.1 以降
      • compileSdkVersion 28 以降
  • 実機を設定するか、エミュレータを使用してアプリを実行します。
    Google Play 開発者サービスに依存している Firebase SDK を使用する場合、デバイスまたはエミュレータに Google Play 開発者サービスがインストールされている必要があります。

  • Google アカウントを使用して Firebase にログインします。

Android プロジェクトがない場合、Firebase プロダクトを試してみるだけであれば、クイックスタート サンプルをダウンロードしてお使いいただけます。

Firebase プロジェクトを作成する

Android アプリに Firebase を追加する前に、Android アプリに接続するための Firebase プロジェクトを作成します。Firebase プロジェクトの詳細については、Firebase プロジェクトについて理解するをご覧ください。

Firebase を使用してアプリを登録する

Android アプリで Firebase を使用するには、アプリを Firebase プロジェクトに登録する必要があります。アプリの登録は、プロジェクトへのアプリの「追加」と呼ばれることがよくあります。

  1. Firebase コンソールに移動します。

  2. プロジェクトの概要ページの中央で、Android アイコン()または [アプリを追加] をクリックして、設定ワークフローを起動します。

  3. [Android パッケージ名] フィールドにアプリのパッケージ名を入力します。

  4. (省略可)その他のアプリ情報(アプリのニックネームデバッグ用の署名証明書 SHA-1)を入力します。

  5. [アプリを登録] をクリックします。

Firebase 構成ファイルを追加する

  1. Firebase Android 構成ファイルをアプリに追加します。

    1. google-services.json のダウンロード ボタン をクリックして、Firebase Android 構成ファイル(google-services.json)を取得します。

    2. 構成ファイルをアプリのモジュール(アプリレベル)ディレクトリに移動します。

  2. アプリで Firebase プロダクトを有効にするには、Gradle ファイルに google-services プラグインを追加します。

    1. ルートレベル(プロジェクト レベル)の Gradle ファイル(build.gradle)に、Google サービス プラグインを含めるためのルールを追加します。Google の Maven リポジトリがあることも確認してください。

      buildscript {
      
        repositories {
          // Check that you have the following line (if not, add it):
          google()  // Google's Maven repository
        }
      
        dependencies {
          // ...
      
          // Add the following line:
          classpath 'com.google.gms:google-services:4.3.8'  // Google Services plugin
        }
      }
      
      allprojects {
        // ...
      
        repositories {
          // Check that you have the following line (if not, add it):
          google()  // Google's Maven repository
          // ...
        }
      }
      
    2. モジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle)で、Google サービスの Gradle プラグインを適用します。

      apply plugin: 'com.android.application'
      // Add the following line:
      apply plugin: 'com.google.gms.google-services'  // Google Services plugin
      
      android {
        // ...
      }
      

アプリに Firebase SDK を追加する

  1. モジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle)内で、Firebase Android BoM を使用して、Firebase Cloud Messaging の Android ライブラリの依存関係を宣言します。

    Firebase Cloud Messaging でのエクスペリエンスを最適化するために、Firebase プロジェクトで Google アナリティクスを有効にして、Google アナリティクス用の Firebase SDK をアプリに追加することをおすすめします。

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.0.1')
    
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging'
        implementation 'com.google.firebase:firebase-analytics'
    }
    

    Firebase Android BoM を使用すると、アプリは常に互換性のあるバージョンの Firebase Android ライブラリを使用します。

    (別の方法)BoM を使用せずに Firebase ライブラリの依存関係を宣言する

    Firebase BoM を使用しない場合は、依存関係の行でそれぞれの Firebase ライブラリのバージョンを指定する必要があります。

    アプリで複数の Firebase ライブラリを使用する場合は、すべてのバージョンの互換性を確保するため、ライブラリのバージョンの管理に BoM を使用することを強くおすすめします。

    dependencies {
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging:22.0.0'
        implementation 'com.google.firebase:firebase-analytics:19.0.0'
    }
    

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.0.1')
    
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging-ktx'
        implementation 'com.google.firebase:firebase-analytics-ktx'
    }
    

    Firebase Android BoM を使用すると、アプリは常に互換性のあるバージョンの Firebase Android ライブラリを使用します。

    (別の方法)BoM を使用せずに Firebase ライブラリの依存関係を宣言する

    Firebase BoM を使用しない場合は、依存関係の行でそれぞれの Firebase ライブラリのバージョンを指定する必要があります。

    アプリで複数の Firebase ライブラリを使用する場合は、すべてのバージョンの互換性を確保するため、BoM を使用してライブラリのバージョンを管理することを強くおすすめします。

    dependencies {
        // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-messaging-ktx:22.0.0'
        implementation 'com.google.firebase:firebase-analytics-ktx:19.0.0'
    }
    

  2. アプリを同期して、すべての依存関係に必要なバージョンがあることを確認します。

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

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

  • 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 をオーバーライドすることで、このトークンにアクセスする必要があります。

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

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

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

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

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

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // 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+KTX

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // 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

/**
 * There are two scenarios when onNewToken is called:
 * 1) When a new token is generated on initial app startup
 * 2) Whenever an existing token is changed
 * Under #2, there are three scenarios when the existing token is changed:
 * A) App is restored to a new device
 * B) User uninstalls/reinstalls the app
 * C) User clears app data
 */
@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
    // FCM registration token to your app server.
    sendRegistrationToServer(token);
}

Kotlin+KTX

/**
 * Called if the FCM registration token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the
 * FCM registration 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
    // FCM registration token to your app server.
    sendRegistrationToServer(token)
}

トークンの取得後は、それをアプリサーバーに送信し、適切な方法で保管できます。

Google Play 開発者サービスをチェックする

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

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

自動初期化を禁止する

FCM 登録トークンが生成されると、ライブラリでは、その ID と構成データが Firebase にアップロードされます。トークンの自動生成を禁止するには、次のようにメタデータ値を 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+KTX

Firebase.messaging.isAutoInitEnabled = true

アナリティクスの収集を再度有効にするには、FirebaseAnalytics クラスの setAnalyticsCollectionEnabled() メソッドを呼び出します。次に例を示します。

setAnalyticsCollectionEnabled(true);

これらの値をいったん設定すると、アプリを再起動しても維持されます。

次のステップ

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

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

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