| Выберите платформу: | iOS+ Android Веб Flutter Unity C++ |
В этом руководстве рассказывается, как начать работу с Firebase Cloud Messaging в клиентских приложениях на C++, чтобы надежно отправлять сообщения.
Чтобы написать кросс-платформенное клиентское приложение Firebase Cloud Messaging на C++, используйте Firebase Cloud Messaging API. C++ SDK работает на платформах Android и Apple, но для каждой из них требуется дополнительная настройка. Чтобы узнать больше о том, как C++ SDK для iOS и Android работает с FCM, прочитайте статью Общие сведения о Firebase для C++.
Настройте Firebase и FCM SDK
Android
Если вы ещё этого не сделали, добавьте Firebase в проект C++.
В инструкциях по настройке, доступных по ссылке, ознакомьтесь с требованиями к устройствам и приложениям для использования SDK Firebase C++, включая рекомендацию использовать CMake для сборки приложения.
В файле
build.gradleна уровне проекта добавьте репозиторий Maven от Google в разделыbuildscriptиallprojects.
Создайте объект приложения Firebase, передав указатель на среду JNI и объект Activity:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Определите класс, реализующий интерфейс
firebase::messaging::Listener.Инициализируйте FCM, передав приложение и созданный объект Listener:
::firebase::messaging::Initialize(app, listener);
Приложения, использующие SDK сервисов Google Play, должны проверять наличие на устройстве совместимого APK-файла сервисов Google Play, прежде чем обращаться к функциям. Подробнее о том, как проверить наличие APK-файла сервисов Google Play…
iOS+
- Если вы ещё этого не сделали, добавьте Firebase в проект C++. Затем настройте проект для FCM:
- Добавьте в файл Podfile проекта зависимость FCM:
pod 'FirebaseMessaging'
- Перетащите фреймворки
firebase.frameworkиfirebase_messaging.frameworkиз Firebase C++ SDK в проект Xcode.
- Добавьте в файл Podfile проекта зависимость FCM:
Загрузите ключ аутентификации APNs в Firebase. Если у вас ещё нет ключа аутентификации APNs, создайте его в Apple Developer Member Center.
-
В консоли Firebase выберите
Settings (Настройки) > General (Общие). Затем откройте вкладку Cloud Messaging. - В разделе Конфигурация приложения для iOS в поле Ключ аутентификации APNs нажмите Загрузить, чтобы загрузить ключ аутентификации для разработки, ключ аутентификации для производства или оба ключа. Обязательно заполните как минимум одно из этих полей.
- Перейдите в папку, в которой сохранен ключ, выберите его и нажмите Открыть. Добавьте идентификатор ключа (его можно найти в Apple Developer Member Center) и нажмите Загрузить.
-
В консоли Firebase выберите
Настройте проект Xcode, чтобы включить push-уведомления:
- Выберите проект в области навигатора.
- Выберите цель проекта в области редактора.
На панели редактирования выберите вкладку Общие.
- Прокрутите страницу до раздела Linked Frameworks and Libraries (Связанные фреймворки и библиотеки) и нажмите кнопку +, чтобы добавить фреймворки.
В открывшемся окне найдите UserNotifications.framework, нажмите на эту запись, а затем выберите Add (Добавить).
Этот фреймворк появляется только в Xcode версии 8 и более поздних и требуется для этой библиотеки.
В области редактора выберите вкладку Возможности.
- Установите переключатель Push-уведомления в положение Вкл.
- Прокрутите экран до раздела Фоновые режимы и включите его.
- В разделе Фоновые режимы выберите Удаленные уведомления.
Создайте объект приложения Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
Определите класс, реализующий интерфейс
firebase::messaging::Listener.Инициализируйте Firebase Cloud Messaging, передав приложение и созданный прослушиватель:
::firebase::messaging::Initialize(app, listener);
Как получить доступ к идентификатору установки Firebase
Включить регистрацию с помощью идентификатора установки Firebase
Чтобы зарегистрировать экземпляр приложения в FCM с помощью идентификатора установки Firebase (FID), сначала включите FID в конфигурации приложения для платформ Android и Apple.
Android
Добавьте следующий элемент <meta-data> в элемент <application> файла AndroidManifest.xml:
<meta-data android:name="firebase_messaging_installation_id_enabled" android:value="true" />
Swift
Добавьте ключ FirebaseMessagingInstallationIdEnabled в файл Info.plist и задайте для него значение YES:
FirebaseMessagingInstallationIdEnabled = YES
Как реализовать прослушиватель onRegistrationReceived
При инициализации библиотеки Firebase Cloud Messaging регистрируется экземпляр клиентского приложения для получения сообщений с помощью идентификатора установки Firebase (FID). Приложение получит идентификатор установки Firebase с помощью обратного вызова OnRegistrationReceived, который должен быть определен в вашей реализации firebase::messaging::Listener:
class MyListener : public firebase::messaging::Listener { public: void OnRegistrationReceived(const char* installation_id) override { LogMessage("Received Firebase Installation ID: %s", installation_id); // TODO: Send the Firebase Installation ID (FID) to your app server to // target this device for messages. } };
Если вы хотите настроить таргетинг на определенный экземпляр приложения, отправьте FID на сервер приложения и сохраните его удобным для вас способом.
Как зарегистрироваться вручную, если автоинициализация отключена
Вы также можете вручную запустить регистрацию с помощью FCM во время выполнения, используя Register():
// Manually register with FCM firebase::Future<void> register_future = firebase::messaging::Register(); register_future.OnCompletion([](const firebase::Future<void>& future) { if (future.status() == firebase::kFutureStatusComplete && future.error() == 0) { // Note: The registered Firebase Installation ID is delivered to the // OnRegistrationReceived callback. LogMessage("Registered with FCM"); } });
Доступ к токену регистрации FCM (поддержка прекращена)
При инициализации библиотеки Firebase Cloud Messaging для экземпляра клиентского приложения запрашивается токен регистрации. Приложение получит токен с помощью обратного вызова OnTokenReceived, который должен быть определен в классе, реализующем firebase::messaging::Listener.
Если вы хотите настроить таргетинг на определенный экземпляр приложения, вам понадобится этот токен.
Примечание о доставке сообщений на устройствах Android
Если приложение не запущено и пользователь нажимает на уведомление, сообщение по умолчанию не передается через встроенные обратные вызовы FCM. В этом случае полезная нагрузка сообщений принимается через объект Intent, который используется для запуска приложения. Чтобы FCM перенаправлял эти входящие сообщения в обратный вызов библиотеки C++, вам нужно переопределить метод onNewIntent в своем классе Activity и передать Intent в MessageForwardingService.
import com.google.firebase.messaging.MessageForwardingService; class MyActivity extends Activity { private static final String TAG = "MyActvity"; @Override protected void onNewIntent(Intent intent) { Log.d(TAG, "A message was sent to this app while it was in the background."); Intent message = new Intent(this, MessageForwardingService.class); message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT); message.putExtras(intent); message.setData(intent.getData()); // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`. // startService(message); MessageForwardingService.enqueueWork(this, message); } }
Если приложение работает в фоновом режиме, то при получении сообщений содержимое их поля notification используется для заполнения уведомления в области уведомлений, но это содержимое не передается в FCM. То есть Message::notification будет иметь значение null.
В целом можно выделить следующее.
| Состояние приложения | Уведомление | Данные | Оба варианта |
|---|---|---|---|
| В активном режиме | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
| Общая информация | Область уведомлений | OnMessageReceived |
Уведомление: область уведомлений. Данные: в дополнительных параметрах намерения. |
Обработка специальных сообщений на устройствах Android
По умолчанию уведомления, отправленные в приложение, передаются в ::firebase::messaging::Listener::OnMessageReceived, но в некоторых случаях вам может потребоваться переопределить режим работы по умолчанию. Для этого в Android вам нужно будет написать пользовательские классы, расширяющие com.google.firebase.messaging.cpp.ListenerService, а также обновить файл AndroidManifest.xml проекта.
Переопределить методы ListenerService
ListenerService – это класс Java, который перехватывает входящие сообщения, отправленные в приложение, и направляет их в библиотеку C++. Когда приложение находится на переднем плане (или в фоновом режиме и получает полезную нагрузку только с данными), сообщения будут передаваться через один из обратных вызовов, предоставленных в этом классе. Чтобы добавить в обработку сообщений собственные действия, расширьте стандартный класс ListenerService в FCM:
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
Переопределив метод ListenerService.onMessageReceived, вы можете выполнять действия на основе полученного объекта RemoteMessage и получать данные сообщения:
@Override public void onMessageReceived(RemoteMessage message) { Log.d(TAG, "A message has been received."); // Do additional logic... super.onMessageReceived(message); }
У ListenerService есть и другие методы, которые используются реже.
Их также можно переопределить. Подробнее об этом рассказывается в справочной статье о FirebaseMessagingService.
@Override public void onDeletedMessages() { Log.d(TAG, "Messages have been deleted on the server."); // Do additional logic... super.onDeletedMessages(); } @Override public void onMessageSent(String messageId) { Log.d(TAG, "An outgoing message has been sent."); // Do additional logic... super.onMessageSent(messageId); } @Override public void onSendError(String messageId, Exception exception) { Log.d(TAG, "An outgoing message encountered an error."); // Do additional logic... super.onSendError(messageId, exception); }
Обновите AndroidManifest.xml
После того как вы создадите собственные классы, их нужно включить в AndroidManifest.xml, чтобы они начали действовать. Убедитесь, что в манифесте есть инструменты объединения. Для этого объявите нужный атрибут в теге <manifest>, как показано ниже:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.firebase.messaging.cpp.samples" xmlns:tools="http://schemas.android.com/tools">
В архиве firebase_messaging_cpp.aar есть файл AndroidManifest.xml, в котором объявляется ListenerService по умолчанию для FCM. Обычно он объединяется с манифестом проекта, что позволяет запускать ListenerService. ListenerService нужно заменить на специальный сервис прослушивания. Для этого нужно удалить значение по умолчанию ListenerService и добавить собственный сервис. Это можно сделать, добавив в файл AndroidManifest.xml проекта следующие строки:
<service android:name="com.google.firebase.messaging.cpp.ListenerService" tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service>
В новых версиях Firebase C++ SDK (7.1.0 и более поздних) используется JobIntentService, для которого требуются дополнительные изменения в файле AndroidManifest.xml.
<service android:name="com.google.firebase.messaging.MessageForwardingService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" > </service>
Как отключить автоматическую инициализацию
FCM генерирует токен регистрации для таргетинга на экземпляр приложения.
Когда токен сгенерирован, библиотека загружает идентификатор и данные конфигурации в Firebase. Если вы хотите получить явное согласие пользователя перед использованием токена, вы можете запретить его создание во время настройки, отключив FCM (а на устройствах Android – ещё и Аналитику). Для этого добавьте значение метаданных в Info.plist (не в GoogleService-Info.plist) на платформах Apple или в AndroidManifest.xml на Android:
Android
<?xml version="1.0" encoding="utf-8"?> <application> <meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" /> <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" /> </application>
Swift
FirebaseMessagingAutoInitEnabled = NO
Чтобы снова включить FCM, можно выполнить вызов во время выполнения:
::firebase::messaging::SetRegistrationOnInitEnabled(true);
После установки это значение сохраняется при перезапусках приложения.
Сообщения со ссылками на контент в Android
FCM позволяет отправлять сообщения, содержащие ссылку на контент в приложении. Чтобы получать такие сообщения, необходимо добавить новый фильтр интентов в Activity, которое обрабатывает ссылки на контент в приложении. Фильтр интентов должен перехватывать ссылки на контент вашего домена. Если в ваших сообщениях нет ссылок на контент, то эта настройка не требуется. В файле AndroidManifest.xml:
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/> </intent-filter>
Также можно указать подстановочный знак, чтобы сделать фильтр намерений более гибким. Пример:
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="*.example.com" android:scheme="http"/> <data android:host="*.example.com" android:scheme="https"/> </intent-filter>
Когда пользователь нажимает на уведомление со ссылкой на указанные вами схему и хост, приложение запускает действие с этим фильтром интентов для обработки ссылки.
Дальнейшие действия
После того как вы выполните все шаги по настройке, вы можете продолжить работу с FCM для C++ одним из следующих способов:
- Как отправлять сообщения на устройства
- Получение сообщений в приложении C++
- Как отправлять сообщения в темы