| Выберите платформу: | iOS+ Android Веб Flutter Unity C++ |
В этом руководстве рассказывается, как начать работу с Firebase Cloud Messaging в клиентских приложениях Android, чтобы надежно отправлять сообщения.
Для клиентов FCM требуются устройства с Android 7.0 или более поздней версии, на которых также установлено приложение Google Play, или эмулятор с Android 7.0 и API Google. Обратите внимание, что вы не ограничены в развертывании приложений Android через Google Play Store.
Настройте SDK
Если вы ещё этого не сделали, добавьте Firebase в проект Android.
Чтобы использовать все возможности FCM, настоятельно рекомендуем включить Google Analytics в проекте. Google Analytics – это требование для отчетов о доставке сообщений в FCM.
Измените манифест приложения
Добавьте в манифест приложения следующий код:
- Сервис, расширяющий
FirebaseMessagingService. Это необходимо, если вы хотите выполнять какую-либо обработку сообщений, помимо получения уведомлений в приложениях в фоновом режиме. Чтобы получать уведомления в активных приложениях, принимать полезную нагрузку данных и выполнять другие действия, необходимо расширить этот сервис. - В компоненте приложения можно указать элементы метаданных, чтобы задать значок и цвет уведомления по умолчанию. Android использует эти значения, когда во входящих сообщениях не заданы значок или цвет.
- (Необязательно.) Начиная с Android 8.0 (уровень API 26) поддерживаются и рекомендуются
каналы уведомлений. FCM предоставляет канал уведомлений по умолчанию с базовыми настройками. Если вы хотите
создать и использовать собственный канал по умолчанию, задайте для
default_notification_channel_idидентификатор объекта канала уведомлений, как показано ниже. FCM будет использовать это значение, если для входящих сообщений не задан канал уведомлений. Подробнее о том, как управлять каналами уведомлений…
<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" />
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" />
Запрос разрешения на уведомления во время выполнения на Android 13 и более поздних версиях
В Android 13 появилось новое динамическое разрешение на показ уведомлений. Это изменение касается всех приложений, работающих на устройствах с Android 13 или более поздней версией и использующих уведомления FCM.
По умолчанию SDK FCM (версии 23.0.6 или более поздней) включает разрешение POST_NOTIFICATIONS, определенное в манифесте. Однако в приложении также нужно будет запрашивать динамическую версию этого разрешения, используя константу android.permission.POST_NOTIFICATIONS. Пока пользователь не предоставит это разрешение, приложение не сможет показывать уведомления.
Чтобы запросить новое динамическое разрешение:
Kotlin
// 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); } } }
Как правило, в интерфейсе должно быть объяснение, какие функции станут доступны, если пользователь разрешит приложению отправлять уведомления. В интерфейсе должны быть кнопки, позволяющие пользователю согласиться или отказаться, например ОК и Нет, спасибо. Если пользователь нажмет ОК, запросите разрешение напрямую. Если пользователь нажмет Нет, спасибо, разрешите ему продолжить без уведомлений.
Дополнительные рекомендации о том, когда приложение должно запрашивать у пользователя разрешение POST_NOTIFICATIONS, можно найти в статье Динамическое разрешение на показ уведомлений.
Разрешения на уведомления для приложений с целевым уровнем API 32 (Android 12L) или ниже
Android автоматически запрашивает у пользователя разрешение, когда приложение впервые создает канал уведомлений, если приложение находится на переднем плане. Однако есть важные нюансы, связанные со временем создания канала и запроса разрешений:
- Если приложение создает свой первый канал уведомлений, работая в фоновом режиме (именно так поступает SDK FCM при получении уведомления FCM), Android не разрешит показывать уведомление и не запросит у пользователя разрешение на уведомления до следующего открытия приложения. Это означает, что все уведомления, полученные до того, как пользователь откроет приложение и предоставит разрешение, будут потеряны.
- Мы настоятельно рекомендуем обновить приложение, чтобы оно поддерживало Android 13 или более поздней версии. Это позволит запрашивать разрешение с помощью API платформы. Если это невозможно, создайте каналы уведомлений до отправки уведомлений в приложение, чтобы вызвать диалоговое окно разрешения на уведомления и не потерять уведомления. Подробнее о рекомендациях по запросу разрешения на уведомления…
Необязательно: удалите разрешение POST_NOTIFICATIONS
По умолчанию SDK FCM включает разрешение POST_NOTIFICATIONS.
Если ваше приложение не использует уведомления (через FCM, другой SDK или напрямую) и вы не хотите включать в него разрешение, удалите его с помощью маркера remove объединения манифестов. Обратите внимание, что в этом случае вы не будете получать уведомления не только от приложения "FCM", но и от всех остальных. Добавьте в файл манифеста приложения следующий код:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>
Как получить доступ к идентификатору установки Firebase
При первом запуске приложения SDK FCM регистрирует экземпляр приложения в FCM и возвращает идентификатор экземпляра приложения. Если вы хотите настроить таргетинг на отдельные экземпляры приложения, вам потребуется получить доступ к этому идентификатору, расширив
FirebaseMessagingService и переопределив
onRegistered().
Рекомендуем получить последний обновленный идентификатор, поскольку он может измениться после первоначального запуска.
Включить регистрацию с помощью идентификатора установки Firebase
Чтобы включить регистрацию экземпляра приложения в FCM с помощью идентификатора установки Firebase (FID), добавьте в файлAndroidManifest.xml следующий флаг метаданных:
<meta-data android:name="firebase_messaging_installation_id_enabled" android:value="true" />
Реализуйте обратный вызов onRegistered()
Таргетинг на экземпляры приложений выполняется с помощью идентификатора установки Firebase (FID) после их регистрации в FCM. Чтобы получить FID при регистрации, реализуйте обратный вызов
onRegistered().
После регистрации экземпляра приложения SDK FCM автоматически отслеживает изменения FID и вызывает обратный вызов при обнаружении изменения.
Если автоматическая инициализация включена, SDK FCM автоматически синхронизируется с серверной частью FCM, чтобы поддерживать регистрацию в актуальном состоянии, и вызывает обратный вызов, чтобы у сервера приложений был текущий идентификатор. Чтобы защититься от потери или устаревания FID, отправляйте его на сервер приложения при каждом срабатывании обратного вызова.
Kotlin
/** * There are three scenarios when `onRegistered` is called: * 1) Every time a manual `register()` call finishes successfully * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID. * 3) Automatically on app startup or routine sync when auto-initialization is enabled. * Under #2, there are three scenarios when the existing FID is changed: * A) App is restored to a new device * B) User uninstalls/reinstalls the app * C) User clears app data */ override fun onRegistered(installationId: String) { Log.d(TAG, "Registered installation ID: $installationId") // Send the Firebase Installation ID to your app server. sendRegistrationToServer(installationId) }
Java
/** * There are three scenarios when `onRegistered` is called: * 1) Every time a manual `register()` call finishes successfully * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID * 3) Automatically on app startup or routine sync when auto-initialization is enabled. * Under #2, there are three scenarios when the existing FID is changed: * A) App is restored to a new device * B) User uninstalls/reinstalls the app * C) User clears app data */ @Override public void onRegistered(@NonNull String installationId) { Log.d(TAG, "Registered installation ID: " + installationId); // Send the Firebase Installation ID to your app server. sendRegistrationToServer(installationId); }
Как зарегистрировать приложение вручную, если автоматическая инициализация отключена
Если вы отключите автоматическую инициализацию, SDK FCM не будет автоматически синхронизировать или активировать обратный вызов
onRegistered() при запуске. Настоятельно рекомендуем повторно включить автоматическую инициализацию после предоставления разрешений на уведомления. Подробнее о том,
как повторно включить автоматическую инициализацию…
Если автоматическая инициализация должна оставаться отключенной, вызовите
FirebaseMessaging.getInstance().register() при запуске приложения, чтобы запустить регистрацию и доставку FID через обратный вызов
onRegistered(). Вызов можно выполнить в методе
onCreate() основного класса Activity.
Kotlin
// Trigger manual registration if auto-initialization is turned off. // Consider calling this every time the app starts to guarantee sync status. FirebaseMessaging.getInstance().register() .addOnCompleteListener(this) { task -> if (!task.isSuccessful()) { // Registration failed. Consider retrying the registration with exponential backoff. Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception) } // Success! The Firebase Installation ID can be used to target messages to this app // instance and will be delivered asynchronously to your `onRegistered()` callback. }
Java
// Trigger manual registration if auto-initialization is turned off. // Consider calling this every time the app starts to guarantee sync status. FirebaseMessaging.getInstance().register() .addOnCompleteListener(task -> { if (!task.isSuccessful()) { // Registration failed. Consider retrying the registration with exponential backoff. Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception) } // Success! The Firebase Installation ID can be used to target messages to this app // instance and will be delivered asynchronously to your `onRegistered()` callback. });
Доступ к токену регистрации FCM (поддержка прекращена)
При первом запуске приложения SDK FCM генерирует токен регистрации для экземпляра клиентского приложения. Если вы хотите настроить таргетинг на отдельные экземпляры приложения или создать группы устройств, вам потребуется получить доступ к этому токену, расширив
FirebaseMessagingService и переопределив onNewToken. Поскольку токен может быть изменен после первоначального запуска, настоятельно рекомендуется получить последний обновленный токен регистрации.
Токен регистрации может измениться в следующих случаях:
- Приложение восстанавливается на новом устройстве.
- Пользователь удаляет и заново устанавливает приложение.
- Пользователь удаляет данные приложения.
Как получить текущий токен регистрации
Если вам нужно получить текущий токен, вызовите
FirebaseMessaging.getInstance().getToken():
Kotlin
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
/** * 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 Services SDK, должны всегда проверять устройство на наличие совместимого APK-файла сервисов Google Play, прежде чем обращаться к их функциям. Подробнее о том, как настроить сервисы Google Play… Рекомендуется делать это в двух местах: в методе onCreate() основной операции и в ее методе onResume(). Проверка в onCreate() гарантирует, что приложение нельзя будет использовать, если она не будет пройдена. Проверка в onResume() гарантирует, что если пользователь вернется в запущенное приложение другим способом, например с помощью кнопки "Назад", проверка все равно будет выполнена.
Если на устройстве нет совместимой версии сервисов Google Play, ваше приложение может вызвать метод GoogleApiAvailability.makeGooglePlayServicesAvailable(), чтобы пользователи могли скачать сервисы Google Play из Google Play.
Как отключить автоматическую инициализацию
Когда создается регистрация FCM, библиотека загружает идентификатор и данные конфигурации в Firebase. Если вы хотите запретить автоматическую регистрацию, отключите сбор данных Аналитики и автоматическую инициализацию FCM (необходимо отключить и то, и другое), добавив следующие значения метаданных в файл AndroidManifest.xml:
<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
Firebase.messaging.isAutoInitEnabled = true
Java
FirebaseMessaging.getInstance().setAutoInitEnabled(true);
Чтобы вновь включить сбор данных Аналитики, вызовите метод setAnalyticsCollectionEnabled() класса FirebaseAnalytics. Пример:
setAnalyticsCollectionEnabled(true);
Эти значения сохраняются при перезапуске приложения.
Отправка уведомления
Чтобы убедиться, что клиент Android настроен правильно, отправьте тестовое уведомление, следуя инструкциям ниже.
Установите и запустите приложение на целевом устройстве.
Убедитесь, что приложение работает в фоновом режиме.
В консоли Firebase перейдите в раздел DevOps & Engagement (DevOps и взаимодействие) > Messaging (Обмен сообщениями).
Создать кампанию
Если это ваше первое сообщение:
Выберите Создать первую кампанию.
Выберите Уведомления Firebase и нажмите Создать.
Если у вас уже есть кампании:
На вкладке Кампании выберите Новая кампания.
Нажмите Уведомления.
Введите текст сообщения. Все остальные поля необязательны.
На панели справа выберите Отправить тестовое сообщение.
В поле Добавить токен регистрации FCM введите токен регистрации, полученный в предыдущем разделе этого руководства.
Нажмите Проверить.
Целевое клиентское устройство, на котором приложение работает в фоновом режиме, должно получить уведомление.
Чтобы узнать, как сообщения доставляются в ваше приложение, перейдите в раздел DevOps & Engagement (DevOps и вовлечение) > Messaging (Обмен сообщениями) > Reports (Отчеты) в консоли Firebase. На этой панели управления регистрируется количество сообщений, отправленных и открытых на устройствах Apple и Android, а также данные о показах (уведомлениях, увиденных пользователями) для приложений Android.
Дальнейшие действия
После завершения настройки вы можете выполнить следующие действия с FCM для Android:
- Как отправлять сообщения на устройства
- Как получать сообщения в приложении для Android
- Как отправлять сообщения в темы