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>
<!-- 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" />
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
を介して、このパーミッションのランタイム バージョンもリクエストする必要があります。ユーザーがこの権限を付与するまで、アプリは通知を表示できません。
新しいランタイム権限をリクエストするには:
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) } } }
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); } } }
一般に、ユーザーがアプリに通知を投稿する権限を付与した場合に有効になる機能をユーザーに説明する 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()
を呼び出します。
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() })
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(); } });
トークン生成の監視
onNewToken
コールバックは、新しいトークンが生成されるたびに発生します。
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) }
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); }
トークンを取得したら、それをアプリ サーバーに送信し、任意の方法で保存できます。
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 自動初期化を再度有効にするには、ランタイム呼び出しを行います。
Kotlin+KTX
Firebase.messaging.isAutoInitEnabled = true
Java
FirebaseMessaging.getInstance().setAutoInitEnabled(true);
Analytics コレクションを再度有効にするには、 FirebaseAnalytics
クラスのsetAnalyticsCollectionEnabled()
メソッドを呼び出します。例えば:
setAnalyticsCollectionEnabled(true);
これらの値は、一度設定するとアプリを再起動しても保持されます。
次のステップ
クライアント アプリをセットアップしたら、 Notifications composerを使用してダウンストリーム メッセージの送信を開始できます。この機能は、ダウンロード、実行、および確認できるクイックスタート サンプルで実証されています。
他のより高度な動作をアプリに追加するには、インテント フィルターを宣言し、受信メッセージに応答するアクティビティを実装します。詳細については、アプリ サーバーからメッセージを送信するためのガイドを参照してください。
これらの機能を利用するには、サーバーの実装とサーバー プロトコル (HTTP または XMPP)、またはAdmin SDKの実装が必要になることに注意してください。