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

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


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

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

iOS+

Метод перетасовки

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

Android

Сервисы Google Play

FCM clients require devices running Android 4.4 or higher that also have Google Play services installed, or an emulator running Android 4.4 with Google APIs. Note that you are not limited to deploying your Android apps through Google Play Store.

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

If the device doesn't have a compatible version of Google Play services, your app can call GoogleApiAvailability.makeGooglePlayServicesAvailable() to allow users to download Google Play services from the Play Store.

Веб

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

The FCM Web interface uses Web credentials called Voluntary Application Server Identification, or "VAPID" keys, to authorize send requests to supported web push services. To subscribe your app to push notifications, you need to associate a pair of keys with your Firebase project. You can either generate a new key pair or import your existing key pair through the Firebase console.

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

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

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

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

    flutter run
    

Получите доступ к регистрационному токену.

To send a message to a specific device, you need to know the device registration token. To retrieve the registration token for an app instance, call getToken() . If notification permission has not been granted, this method will ask the user for notification permissions. Otherwise, it returns a token or rejects the future due to an error.

// 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.
    });

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

When an FCM registration token is generated, the library uploads the identifier and configuration data to Firebase. If you prefer to prevent token auto generation, disable auto-initialization at build time.

iOS

На iOS добавьте значение метаданных в файл Info.plist :

FirebaseMessagingAutoInitEnabled = NO

Android

На 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 перейдите в раздел DevOps & Engagement > Messaging .

  4. Создайте кампанию.

    • Если это ваше первое сообщение:

      1. Выберите «Создать свою первую кампанию» .

      2. Выберите сообщения Firebase Notification и нажмите «Создать» .

    • Если вы ранее создавали кампании:

      1. На вкладке «Кампании» выберите «Новая кампания» .

      2. Нажмите «Уведомления» .

  5. Введите текст сообщения.

  6. В правой панели выберите пункт «Отправить тестовое сообщение» .

  7. В поле « Добавить регистрационный токен FCM введите свой регистрационный токен.

  8. Выберите тест .

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

Чтобы получить представление о доставке сообщений в ваше приложение, перейдите на панель мониторинга DevOps & Engagement > Messaging > Reports в консоли Firebase . На этой панели мониторинга отображается количество отправленных и открытых сообщений на устройствах Apple и Android, а также данные о «показах» (уведомлениях, увиденных пользователями) для приложений Android.

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

When users tap a notification, the default behavior on both Android and iOS is to open the application. If the application is terminated, it will be started, and if it is in the background, it will be brought to the foreground.

Depending on the content of a notification, you may want to handle the user's interaction when the application opens. For example, if a new chat message is sent using a notification and the user selects it, you may want to open the specific conversation when the application opens.

Пакет 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: