Начните работу с Firebase Cloud Messaging в приложениях Android.

Выберите платформу: iOS+ Android Web Flutter Unity C++


В этом руководстве описано, как начать работу с Firebase Cloud Messaging в ваших Android-приложениях, чтобы вы могли надежно отправлять сообщения.

Для работы FCM клиентов требуются устройства под управлением Android 6.0 или выше, на которых также установлено приложение Google Play Store, или эмулятор Android 6.0 с API Google. Обратите внимание, что вы не ограничены развертыванием своих Android-приложений только через Google Play Store.

Настройка SDK

Если вы еще этого не сделали, добавьте Firebase в свой Android-проект .

Для оптимальной работы с FCM мы настоятельно рекомендуем включить Google Analytics в вашем проекте. Google Analytics необходим для формирования отчетов о доставке сообщений в FCM .

Отредактируйте манифест вашего приложения.

Добавьте следующее в манифест вашего приложения:

  • Сервис, расширяющий класс 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 равным идентификатору объекта вашего канала уведомлений, как показано; FCM будет использовать это значение всякий раз, когда входящие сообщения явно не указывают канал уведомлений. Для получения дополнительной информации см. раздел «Управление каналами уведомлений» .
  • <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 . Если ваше приложение не использует уведомления (ни через уведомления FCM , ни через другой SDK, ни напрямую отправляемые вашим приложением) и вы не хотите, чтобы ваше приложение включало это разрешение, вы можете удалить его с помощью маркера remove в инструменте объединения манифестов . Имейте в виду, что удаление этого разрешения предотвращает отображение всех уведомлений, а не только уведомлений FCM . Добавьте следующее в файл манифеста вашего приложения:

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

Получите доступ к регистрационному токену 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.

Приложения, использующие SDK Play Services, всегда должны проверять устройство на наличие совместимого APK-файла Google Play Services перед доступом к функциям Google Play Services. Подробнее см. в разделе «Настройка Google Play Services» . Рекомендуется делать это в двух местах: в методе onCreate() основного приложения и в методе onResume() . Проверка в onCreate() гарантирует, что приложение нельзя будет использовать без успешной проверки. Проверка в onResume() гарантирует, что если пользователь вернется к запущенному приложению другим способом, например, с помощью кнопки «Назад», проверка все равно будет выполнена.

Если на устройстве отсутствует совместимая версия сервисов Google Play, ваше приложение может вызвать метод GoogleApiAvailability.makeGooglePlayServicesAvailable() чтобы разрешить пользователям загружать сервисы Google Play из Play Store.

Предотвратить автоматическую инициализацию

При генерации токена регистрации FCM библиотека загружает идентификатор и данные конфигурации в Firebase. Если вы хотите предотвратить автоматическую генерацию токена, отключите сбор данных Analytics и автоматическую инициализацию 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);

Чтобы повторно включить сбор данных Analytics, вызовите метод setAnalyticsCollectionEnabled() класса FirebaseAnalytics . Например:

setAnalyticsCollectionEnabled(true);

После установки эти значения сохраняются при перезапуске приложения.

Отправить уведомление

Чтобы убедиться в правильной настройке вашего Android-клиента, вы можете отправить тестовое уведомление, следуя приведенным ниже инструкциям:

  1. Установите и запустите приложение на целевом устройстве.
  2. Убедитесь, что приложение работает в фоновом режиме на устройстве.
  3. В консоли Firebase откройте страницу «Сообщения» .
  4. Если это ваше первое сообщение, выберите «Создать первую кампанию» , «Сообщения уведомлений Firebase» , а затем «Создать» .
  5. В противном случае, на вкладке «Кампании» выберите «Новая кампания» , а затем «Уведомления» .
  6. Введите текст сообщения. Все остальные поля необязательны.
  7. В правой панели выберите пункт «Отправить тестовое сообщение» .
  8. В поле « Добавить регистрационный токен FCM» введите регистрационный токен, полученный вами в предыдущем разделе этого руководства.
  9. Выберите тест .

Уведомление должно быть получено на целевом клиентском устройстве, на котором приложение запущено в фоновом режиме.

Для получения более подробной информации о доставке сообщений в ваше приложение см. панель отчетов FCM , которая регистрирует количество отправленных и открытых сообщений на устройствах Apple и Android, а также данные о показах (уведомлениях, просмотренных пользователями) для приложений Android.

Следующие шаги

После завершения этапов настройки, вот несколько вариантов для дальнейшей работы с FCM для Android: