| Выберите платформу: | iOS+ Android Веб Flutter Unity C++ |
В этом руководстве рассказывается, как начать работу с Firebase Cloud Messaging в клиентских приложениях Flutter, чтобы надежно отправлять сообщения.
В зависимости от целевой платформы вам потребуется выполнить дополнительные настройки.
iOS+
Подмена методов
Чтобы использовать плагин Flutter FCM на устройствах Apple, необходимо переопределение методов. Без него ключевые функции Firebase, например обработка токенов FCM, не будут работать должным образом.
Android
Сервисы Google Play
Для клиентов FCM требуются устройства с Android 4.4 или более поздней версии, на которых установлены сервисы Google Play, или эмулятор с Android 4.4 и API Google. Обратите внимание, что вы можете распространять свои приложения Android не только через Google Play.
Приложения, использующие Play Services SDK, должны всегда проверять, есть ли на устройстве совместимый APK-файл сервисов Google Play, прежде чем обращаться к функциям сервисов Google Play. Рекомендуется сделать это в двух местах: в методе onCreate() основного действия и в методе onResume(). Проверка в onCreate()
не позволяет использовать приложение без успешной проверки. Проверка в
onResume() гарантирует, что если пользователь вернется в запущенное приложение другим способом, например с помощью кнопки "Назад", проверка все равно будет выполнена.
Если на устройстве нет совместимой версии сервисов Google Play, ваше приложение может вызвать функцию GoogleApiAvailability.makeGooglePlayServicesAvailable(), чтобы пользователи могли скачать сервисы Google Play из Google Play.
Веб-приложение
Как настроить учетные данные для сайта с помощью FCM
Веб-интерфейс FCM использует веб-учетные данные, называемые ключами добровольной идентификации сервера приложений (VAPID), для авторизации запросов на отправку в поддерживаемые сервисы веб-push-уведомлений. Чтобы приложение могло получать push-уведомления, вам нужно связать с проектом Firebase пару ключей. Вы можете сгенерировать новую пару ключей или импортировать существующую через консоль Firebase.
Как установить плагин FCM
Установите и инициализируйте плагины Firebase для Flutter, если вы этого ещё не сделали.
Чтобы установить плагин, в корневом каталоге проекта Flutter выполните следующую команду:
flutter pub add firebase_messagingПосле этого пересоберите приложение 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
На устройствах Android отключите сбор данных Аналитики и автоматическую инициализацию 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);
После установки это значение сохраняется при перезапуске приложения.
Как отправить тестовое уведомление
Установите и запустите приложение на целевом устройстве. На устройствах Apple вам нужно будет принять запрос на разрешение получать удаленные уведомления.
Убедитесь, что приложение работает в фоновом режиме.
В консоли Firebase выберите DevOps & Engagement (DevOps и взаимодействие) > Messaging (Обмен сообщениями).
Создайте кампанию.
Если это ваше первое сообщение:
Выберите Создать первую кампанию.
Выберите Уведомления Firebase и нажмите Создать.
Если вы уже создавали кампании:
На вкладке Кампании нажмите Новая кампания.
Нажмите Уведомления.
Введите текст сообщения.
На панели справа выберите Отправить тестовое сообщение.
В поле Добавить токен регистрации FCM введите токен регистрации.
Нажмите Проверить.
После того как вы нажмете Тестировать, целевое клиентское устройство с приложением, работающим в фоновом режиме, должно получить уведомление.
Чтобы узнать, как сообщения доставляются в ваше приложение, откройте раздел DevOps и вовлеченность > Обмен сообщениями > Отчеты на панели управления Firebase. На этой панели управления регистрируется количество сообщений, отправленных и открытых на устройствах Apple и Android, а также данные о показах (уведомлениях, которые видели пользователи) для приложений Android.
Обработка взаимодействия
Когда пользователь нажимает на уведомление, по умолчанию на устройствах Android и iOS открывается приложение. Если приложение закрыто, оно будет запущено, а если оно работает в фоновом режиме, то будет переведено в активный режим.
В зависимости от содержания уведомления вам может понадобиться обработать действия пользователя при открытии приложения. Например, если новое сообщение чата отправлено с помощью уведомления и пользователь выбирает его, при открытии приложения может потребоваться открыть определенный чат.
Пакет firebase-messaging предлагает два способа обработки этого взаимодействия:
getInitialMessage():Если приложение открывается из закрытого состояния, этот метод возвращаетFuture, содержащийRemoteMessage. После использованияRemoteMessageбудет удален.onMessageOpenedApp: AStream, который публикуетRemoteMessage, когда приложение открывается из фонового режима.
Чтобы у пользователей не возникало проблем, вам следует предусмотреть оба варианта. Ниже приведен пример кода, в котором показано, как это сделать:
class Application extends StatefulWidget { @override StatecreateState() => _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 одним из следующих способов:
- Как отправлять сообщения на устройства
- Как получать сообщения в приложении Flutter
- Как отправлять сообщения в темы