Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

AndroidでFirebaseCloudMessagingクライアントアプリを設定する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

FCM クライアントには、Google Play ストア アプリもインストールされている Android 4.4 以降を実行するデバイス、または Google API を使用して Android 4.4 を実行するエミュレータが必要です。 Android アプリの展開は Google Play ストアに限定されないことに注意してください。

SDK をセットアップする

このセクションでは、アプリで他の Firebase 機能を既に有効にしている場合に完了できるタスクについて説明します。まだ行っていない場合は、 Firebase を Android プロジェクトに追加します

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

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

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

Android 13 以降でランタイム通知許可をリクエストする

Android 13 では、通知を表示するための新しいランタイム アクセス許可が導入されています。これは、FCM 通知を使用する Android 13 以降で実行されているすべてのアプリに影響します。

デフォルトでは、FCM SDK (バージョン 23.0.6 以降) には、マニフェストで定義されたPOST_NOTIFICATIONS権限が含まれています。ただし、アプリは、定数android.permission.POST_NOTIFICATIONSを介して、このパーミッションのランタイム バージョンもリクエストする必要があります。ユーザーがこの権限を付与するまで、アプリは通知を表示できません。

新しいランタイム権限をリクエストするには:

Java

// Declare the launcher at the top of your Activity/Fragment:
private final ActivityResultLauncher<String> requestPermissionLauncher =
        registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                // FCM SDK (and your app) can post notifications.
            } else {
                // TODO: Inform user that that your app will not show notifications.
            }
        });

private void askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
                PackageManager.PERMISSION_GRANTED) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
        }
    }
}

Kotlin+KTX

// Declare the launcher at the top of your Activity/Fragment:
private val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
    if (isGranted) {
        // FCM SDK (and your app) can post notifications.
    } else {
        // TODO: Inform user that that your app will not show notifications.
    }
}

private fun askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
        }
    }
}

一般に、ユーザーがアプリに通知を投稿する権限を付与した場合に有効になる機能をユーザーに説明する UI を表示する必要があります。この UI は、[ OK ] ボタンや [いいえ]ボタンなど、同意または拒否するためのユーザー オプションを提供する必要があります。ユーザーが [ OK ] を選択した場合は、アクセス許可を直接要求します。ユーザーが [いいえ]を選択した場合は、ユーザーが通知なしで続行できるようにします。

アプリがユーザーにPOST_NOTIFICATIONSパーミッションを要求する必要がある場合のベスト プラクティスについては、「通知のランタイム パーミッション」を参照してください。

Android 12L (API レベル 32) 以下を対象とするアプリの通知権限

Android は、アプリがフォアグラウンドにある限り、アプリが初めて通知チャネルを作成するときにユーザーに自動的に許可を求めます。ただし、チャネルの作成と許可リクエストのタイミングに関して重要な注意事項があります。

  • アプリがバックグラウンドで実行されているときに最初の通知チャネルを作成する場合 (FCM 通知を受信するときに FCM SDK が行う)、Android は通知の表示を許可せず、次の通知までユーザーに通知許可を求めません。アプリが開かれた時間。これは、アプリが開かれ、ユーザーが許可を受け入れる前に受信した通知が失われることを意味します。
  • Android 13 以降を対象とするようにアプリを更新して、プラットフォームの API を利用して権限を要求することを強くお勧めします。それが不可能な場合は、アプリに通知を送信する前に通知チャネルを作成して、通知許可ダイアログをトリガーし、通知が失われないようにする必要があります。詳細については、通知許可のベスト プラクティスを参照してください。

オプション: POST_NOTIFICATIONS権限を削除する

デフォルトでは、FCM SDK にはPOST_NOTIFICATIONS権限が含まれています。アプリが通知メッセージを使用しておらず (FCM 通知、別の SDK、またはアプリによって直接投稿されたものであっても)、アプリに許可を含めたくない場合は、マニフェスト マージャーのremoveマーカーを使用して削除できます。この権限を削除すると、FCM 通知だけでなく、すべての通知が表示されなくなることに注意してください。アプリのマニフェスト ファイルに次を追加します。

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>

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

アプリの最初の起動時に、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(@NonNull 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()を呼び出して、ユーザーが Play ストアから Google Play サービスをダウンロードできるようにすることができます。

自動初期化を防ぐ

FCM 登録トークンが生成されると、ライブラリは識別子と構成データを Firebase にアップロードします。トークンの自動生成を回避したい場合は、次のメタデータ値をAndroidManifest.xmlに追加して、Analytics コレクションと 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

Analytics コレクションを再度有効にするには、 FirebaseAnalyticsクラスのsetAnalyticsCollectionEnabled()メソッドを呼び出します。例えば:

setAnalyticsCollectionEnabled(true);

これらの値は、一度設定するとアプリを再起動しても保持されます。

次のステップ

クライアント アプリをセットアップしたら、 Notifications composerを使用してダウンストリーム メッセージの送信を開始できます。この機能は、ダウンロード、実行、および確認できるクイックスタート サンプルで実証されています。

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

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