| Выберите платформу: | 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
Разрешения на уведомления для приложений, предназначенных для Android 12L (уровень API 32) или более ранних версий
Android автоматически запрашивает у пользователя разрешение при первом создании каналов уведомлений в приложении, если оно работает на переднем плане. Однако есть важные нюансы, связанные со временем создания канала и запроса разрешений:
- Если приложение создает первый канал уведомлений, когда оно работает в фоновом режиме (а именно так поступает SDK FCM при получении уведомления FCM), Android не разрешит показ уведомления и не запросит у пользователя разрешение на уведомления до следующего запуска приложения. Это означает, что все уведомления, полученные до того, как пользователь откроет приложение и предоставит разрешение, будут потеряны.
- Мы настоятельно рекомендуем обновить приложение, чтобы оно поддерживало Android 13 и более поздние версии. Это позволит вам использовать API платформы для запроса разрешений. Если это невозможно, создайте каналы уведомлений до отправки уведомлений в приложение, чтобы вызвать диалоговое окно разрешения на уведомления и не потерять уведомления. Подробнее о запросах разрешений на отправку уведомлений…
Необязательно: удалите разрешение POST_NOTIFICATIONS
По умолчанию SDK FCM включает разрешение POST_NOTIFICATIONS.
Если ваше приложение не использует уведомления (ни через FCMnotifications, ни через другой 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. Подробнее о том, как настроить сервисы 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
- Как отправлять сообщения в темы