Начните работу с Firebase Cloud Messaging


В этом кратком руководстве описывается, как настроить Firebase Cloud Messaging в мобильных и веб-клиентских приложениях для надежной отправки сообщений. Сведения о серверных средах см. в разделе «Ваша серверная среда» и FCM .

Настройка клиентского приложения Firebase Cloud Messaging на Flutter

В зависимости от целевой платформы вам потребуется выполнить некоторые дополнительные шаги по настройке.

iOS+

Метод свизлинга

Для использования плагина FCM Flutter на устройствах Apple требуется свизлинг методов. Без него ключевые функции Firebase, такие как обработка токенов FCM не будут работать должным образом.

Андроид

Сервисы Google Play

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

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

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

Интернет

Настройка веб-учетных данных с помощью FCM

Веб-интерфейс FCM использует веб-учётные данные, называемые ключами добровольной идентификации сервера приложений (VAPID), для авторизации отправки запросов к поддерживаемым службам push-уведомлений. Чтобы подписать приложение на push-уведомления, необходимо связать пару ключей с вашим проектом Firebase. Вы можете сгенерировать новую пару ключей или импортировать существующую пару ключей через консоль Firebase .

Установить плагин FCM

  1. Установите и инициализируйте плагины Firebase для Flutter, если вы еще этого не сделали.

  2. Из корня вашего проекта Flutter выполните следующую команду для установки плагина:

    flutter pub add firebase_messaging
    
  3. После завершения перестройте свое приложение Flutter:

    flutter run
    

Доступ к регистрационному токену

Чтобы отправить сообщение на конкретное устройство, необходимо знать токен регистрации устройства. Чтобы получить токен регистрации для экземпляра приложения, вызовите метод getToken() . Если разрешение на отправку уведомлений не предоставлено, этот метод запросит у пользователя разрешение на отправку уведомлений. В противном случае он возвращает токен или отклоняет будущую отправку из-за ошибки.

// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);

// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
 // APNS token is available, make FCM plugin API requests...
}

На веб-платформах передайте свой открытый ключ VAPID в getToken() :

final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");

Чтобы получать уведомления об обновлении токена, подпишитесь на поток onTokenRefresh :

FirebaseMessaging.instance.onTokenRefresh
    .listen((fcmToken) {
      // TODO: If necessary send token to application server.

      // Note: This callback is fired at each app startup and whenever a new
      // token is generated.
    })
    .onError((err) {
      // Error getting token.
    });

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

При генерации регистрационного токена FCM библиотека загружает идентификатор и данные конфигурации в Firebase. Если вы предпочитаете предотвратить автоматическую генерацию токена, отключите автоматическую инициализацию во время сборки.

iOS

В iOS добавьте значение метаданных в ваш Info.plist :

FirebaseMessagingAutoInitEnabled = NO

Андроид

На Android отключите сбор 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 во время выполнения

Чтобы включить автоматическую инициализацию для конкретного экземпляра приложения, вызовите setAutoInitEnabled() :

await FirebaseMessaging.instance.setAutoInitEnabled(true);

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

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

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

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

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

Обработка взаимодействия

При нажатии на уведомление по умолчанию на Android и iOS открывается приложение. Если приложение закрыто, оно запускается, а если оно находится в фоновом режиме, оно выводится на передний план.

В зависимости от содержания уведомления вам может потребоваться обрабатывать действия пользователя при открытии приложения. Например, если новое сообщение чата отправлено с помощью уведомления, и пользователь выбирает его, вам может потребоваться открыть соответствующее сообщение при открытии приложения.

Пакет firebase-messaging предоставляет два способа обработки этого взаимодействия:

  1. getInitialMessage(): Если приложение открывается из завершённого состояния, этот метод возвращает Future , содержащий RemoteMessage . После использования RemoteMessage будет удалён.
  2. onMessageOpenedApp : Stream , который отправляет RemoteMessage при открытии приложения из фонового состояния.

Чтобы обеспечить пользователям бесперебойную работу, необходимо учитывать оба сценария. Следующий пример кода показывает, как это можно реализовать:

class Application extends StatefulWidget {
  @override
  State createState() => _Application();
}

class _Application extends State {
  // In this example, suppose that all messages contain a data field with the key 'type'.
  Future setupInteractedMessage() async {
    // Get any messages which caused the application to open from
    // a terminated state.
    RemoteMessage? initialMessage =
        await FirebaseMessaging.instance.getInitialMessage();

    // If the message also contains a data property with a "type" of "chat",
    // navigate to a chat screen
    if (initialMessage != null) {
      _handleMessage(initialMessage);
    }

    // Also handle any interaction when the app is in the background using a
    // Stream listener
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
  }

  void _handleMessage(RemoteMessage message) {
    if (message.data['type'] == 'chat') {
      Navigator.pushNamed(context, '/chat',
        arguments: ChatArguments(message),
      );
    }
  }

  @override
  void initState() {
    super.initState();

    // Run code required to handle interacted messages in an async function
    // as initState() must not be async
    setupInteractedMessage();
  }

  @override
  Widget build(BuildContext context) {
    return Text("...");
  }
}

Способ обработки взаимодействия зависит от ваших настроек. Приведённый выше пример — это базовый пример использования StatefulWidget .

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

После завершения шагов настройки вот несколько вариантов дальнейшей работы с FCM для Flutter: