| Выберите платформу: | iOS+ Android Веб Flutter Unity C++ |
В этом руководстве описано, как начать работу с Firebase Cloud Messaging в клиентских приложениях на C++, чтобы надежно отправлять сообщения.
Чтобы написать кросс-платформенное клиентское приложение Firebase Cloud Messaging на C++, используйте API Firebase Cloud Messaging. C++ SDK работает на платформах Android и Apple, но для каждой из них требуется дополнительная настройка. Чтобы узнать больше о том, как C++ SDK для iOS и Android работает с FCM, прочитайте статью Общие сведения о Firebase для C++.
Настройте Firebase и SDK FCM
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, передав приложение и созданный прослушиватель:
::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-уведомления в положение Вкл.
- Найдите раздел Background Modes (Фоновые режимы) и установите переключатель в положение On (Вкл.).
- В разделе Background Modes (Фоновые режимы) выберите Remote notifications (Удаленные уведомления).
Создайте объект приложения 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>
Когда пользователь нажимает на уведомление со ссылкой на указанные вами схему и хост, приложение запускает Activity с этим фильтром интентов, чтобы обработать ссылку.
Дальнейшие действия
После завершения настройки вы можете выполнить следующие действия с FCM для C++:
- Как отправлять сообщения на устройства
- Получение сообщений в приложении C++
- Как отправлять сообщения в темы