| Выберите платформу: | iOS+ Android Web Flutter Unity C++ |
В этом руководстве описано, как начать работу с Firebase Cloud Messaging в ваших клиентских приложениях Flutter, чтобы вы могли надежно отправлять сообщения.
В зависимости от целевой платформы, вам потребуется выполнить ряд дополнительных шагов по настройке.
iOS+
Прежде чем ваше приложение сможет начать получать сообщения, необходимо включить push-уведомления и фоновый режим в вашем проекте Xcode.
- Откройте рабочую область вашего проекта Xcode (`ios/Runner.xcworkspace`).
- Включить push-уведомления .
- Включите режимы фоновой выборки и фонового выполнения удаленных уведомлений .
Перед использованием FCM загрузите свой ключ аутентификации APNs в консоль Firebase . Если у вас еще нет ключа аутентификации APNs, создайте его в Центре разработчиков Apple .
- В консоли Firebase внутри вашего проекта выберите значок шестеренки, затем выберите «Настройки проекта» и перейдите на вкладку «Облачные сообщения» .
- Нажмите кнопку «Загрузить» , чтобы загрузить ключ аутентификации для разработки, ключ аутентификации для производственной среды или оба ключа. Требуется как минимум один ключ.
- Для каждого ключа аутентификации выберите файл .p8 и укажите идентификатор ключа и ваш идентификатор команды Apple. Нажмите «Сохранить» .
Метод перетасовки
Для использования плагина FCM Flutter на устройствах Apple требуется подмена методов. Без неё ключевые функции Firebase, такие как обработка токенов FCM не будут работать должным образом.
Android
Сервисы Google Play
Для работы FCM клиентов требуются устройства под управлением Android 4.4 или выше с установленными сервисами Google Play, либо эмулятор Android 4.4 с API Google. Обратите внимание, что вы не ограничены развертыванием своих Android-приложений только через Google Play Store.
Приложения, использующие SDK Play Services, всегда должны проверять устройство на наличие совместимого APK-файла Google Play Services перед доступом к функциям Google Play Services. Рекомендуется делать это в двух местах: в методе onCreate() основного приложения и в методе onResume() . Проверка в onCreate() гарантирует, что приложение нельзя будет использовать без успешной проверки. Проверка в onResume() гарантирует, что если пользователь вернется к запущенному приложению другим способом, например, с помощью кнопки «Назад», проверка все равно будет выполнена.
Если на устройстве отсутствует совместимая версия сервисов Google Play, ваше приложение может вызвать метод GoogleApiAvailability.makeGooglePlayServicesAvailable() чтобы разрешить пользователям загружать сервисы Google Play из Play Store.
Веб
Настройка веб-учетных данных с помощью FCM
Веб-интерфейс FCM использует учетные данные, называемые ключами добровольной идентификации сервера приложений (VAPID), для авторизации запросов на отправку уведомлений в поддерживаемые веб-сервисы push-уведомлений. Чтобы подписать ваше приложение на push-уведомления, необходимо связать пару ключей с вашим проектом Firebase. Вы можете либо сгенерировать новую пару ключей, либо импортировать существующую пару ключей через консоль Firebase .
- Откройте вкладку «Cloud Messaging» в панели настроек консоли Firebase и перейдите в раздел «Веб-конфигурация» .
- На вкладке «Сертификаты Web Push» нажмите «Сгенерировать пару ключей» . В консоли отобразится уведомление о том, что пара ключей сгенерирована, а также строка открытого ключа и дата добавления.
Если у вас уже есть пара ключей, используемая в вашем веб-приложении, вы можете импортировать её в FCM , чтобы получить доступ к существующим экземплярам веб-приложения через API FCM . Для импорта ключей вам необходимы права доступа уровня владельца к проекту Firebase. Импортируйте существующий открытый и закрытый ключи в формате base64, закодированном в URL-адресе:
- Откройте вкладку «Cloud Messaging» в панели настроек консоли Firebase и перейдите в раздел «Веб-конфигурация» .
- На вкладке «Сертификаты Web Push» выберите «Импортировать существующую пару ключей» .
- В диалоговом окне «Импорт пары ключей » укажите открытый и закрытый ключи в соответствующих полях и нажмите «Импорт» . В консоли отобразится строка открытого ключа и дата добавления.
Для получения дополнительной информации о формате ключей и способах их генерации см. раздел «Ключи сервера приложений» .
Установите плагин FCM
Установите и инициализируйте плагины Firebase для Flutter, если вы еще этого не сделали.
Для установки плагина выполните следующую команду из корневой папки вашего Flutter-проекта:
flutter pub add firebase_messagingПосле завершения пересоберите ваше Flutter-приложение:
flutter run
Получите доступ к регистрационному токену.
Для отправки сообщения на конкретное устройство необходимо знать токен регистрации устройства. Чтобы получить токен регистрации для экземпляра приложения, вызовите метод getToken() . Если разрешение на уведомления не предоставлено, этот метод запросит у пользователя разрешение на уведомления. В противном случае он возвращает токен или отклоняет объект `Future` из-за ошибки.
// 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 отключите сбор данных 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);
После установки это значение сохраняется при перезапуске приложения.
Отправить тестовое уведомление
- Установите и запустите приложение на целевом устройстве. На устройствах Apple вам потребуется принять запрос на разрешение получения удаленных уведомлений.
- Убедитесь, что приложение работает в фоновом режиме на устройстве.
- В консоли Firebase откройте страницу «Сообщения».
- Если это ваше первое сообщение, выберите «Создать свою первую кампанию» .
- Выберите сообщения Firebase Notification и нажмите «Создать» .
- В противном случае, на вкладке «Кампании» выберите «Новая кампания» , а затем «Уведомления» .
- Введите текст сообщения.
- В правой панели выберите пункт «Отправить тестовое сообщение» .
- В поле « Добавить регистрационный токен FCM введите свой регистрационный токен.
- Выберите тест .
После выбора пункта «Тест» целевое клиентское устройство, на котором приложение работает в фоновом режиме, должно получить уведомление.
Для получения информации о доставке сообщений в ваше приложение, ознакомьтесь с панелью отчетов FCM , которая регистрирует количество отправленных и открытых сообщений на устройствах Apple и Android, а также данные о показах для приложений Android.
Обработка взаимодействия
Когда пользователь нажимает на уведомление, по умолчанию как в Android, так и в iOS приложение открывается. Если приложение закрыто, оно запускается, а если находится в фоновом режиме, то выводится на передний план.
В зависимости от содержимого уведомления, может потребоваться обработка взаимодействия пользователя при открытии приложения. Например, если с помощью уведомления отправлено новое сообщение в чате, и пользователь его выбирает, может потребоваться открыть конкретную переписку при запуске приложения.
Пакет firebase-messaging предоставляет два способа обработки этого взаимодействия:
-
getInitialMessage():Если приложение запущено из завершенного состояния, этот метод возвращаетFuture, содержащийRemoteMessage. После обработкиRemoteMessageбудет удален. -
onMessageOpenedApp:Stream, который отправляет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.
- Отправляйте сообщения по темам