Чтобы написать кроссплатформенное клиентское приложение Firebase Cloud Messaging на C++, используйте API Firebase Cloud Messaging . C++ SDK работает как для платформ Android, так и для Apple, при этом для каждой платформы требуется дополнительная настройка.
Настройка Firebase и FCM SDK
Андроид
Если вы еще этого не сделали, добавьте Firebase в свой проект C++ .
В связанных инструкциях по настройке ознакомьтесь с требованиями к устройству и приложению для использования Firebase C++ SDK, включая рекомендацию использовать CMake для создания приложения.
В файле
build.gradle
на уровне проекта обязательно включите репозиторий Google Maven как в разделыbuildscript
, так и в разделыallprojects
.
Создайте объект приложения Firebase, передав среду JNI и действие:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Определите класс, реализующий интерфейс
firebase::messaging::Listener
.Инициализируйте FCM , передав App и созданный прослушиватель:
::firebase::messaging::Initialize(app, listener);
Приложения, использующие SDK сервисов Google Play, должны проверить устройство на наличие совместимого APK-файла сервисов Google Play, прежде чем получить доступ к функциям. Дополнительную информацию см. в разделе APK-файл «Проверка сервисов Google Play» .
iOS+
- Если вы еще этого не сделали, добавьте Firebase в свой проект C++ . Затем, чтобы настроить проект для FCM :
- В подфайл вашего проекта добавьте зависимость FCM:
pod 'FirebaseMessaging'
- Перетащите платформы
firebase.framework
иfirebase_messaging.framework
в свой проект Xcode из Firebase C++ SDK .
- В подфайл вашего проекта добавьте зависимость FCM:
Загрузите ключ аутентификации APN в Firebase. Если у вас еще нет ключа аутентификации APN, обязательно создайте его в Центре участников Apple Developer .
Внутри вашего проекта в консоли Firebase выберите значок шестеренки, выберите «Настройки проекта» , а затем выберите вкладку «Облачные сообщения» .
В разделе «Ключ аутентификации APN» в разделе «Конфигурация приложения iOS» нажмите кнопку «Загрузить» .
Перейдите в папку, в которой вы сохранили ключ, выберите его и нажмите «Открыть» . Добавьте идентификатор ключа (доступен в Центре участников Apple Developer ) и нажмите «Загрузить» .
Настройте свой проект Xcode для включения push-уведомлений:
- Выберите проект в области Навигатора .
- Выберите цель проекта в области редактора .
Выберите вкладку «Общие» в области «Редактор» .
- Прокрутите вниз до пункта «Связанные платформы и библиотеки» , затем нажмите кнопку «+» , чтобы добавить платформы.
В появившемся окне прокрутите до UserNotifications.framework , щелкните эту запись, затем нажмите «Добавить» .
Эта платформа появляется только в Xcode v8 и более поздних версиях и требуется для этой библиотеки.
Выберите вкладку «Возможности» в области «Редактор» .
- Установите для параметра Push-уведомления значение « Вкл.» .
- Прокрутите вниз до пункта «Фоновые режимы» , затем переключите его в положение «Вкл.» .
- Выберите «Удаленные уведомления» в разделе «Фоновые режимы» .
Создайте объект приложения Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
Определите класс, реализующий интерфейс
firebase::messaging::Listener
.Инициализируйте Firebase Cloud Messaging, передав приложение и созданный прослушиватель:
::firebase::messaging::Initialize(app, listener);
Доступ к токену регистрации устройства
При инициализации библиотеки Firebase Cloud Messaging запрашивается токен регистрации для экземпляра клиентского приложения. Приложение получит токен с обратным вызовом OnTokenReceived
, который должен быть определен в классе, реализующем firebase::messaging::Listener
.
Если вы хотите настроить таргетинг на это конкретное устройство, вам понадобится доступ к этому токену.
Примечание о доставке сообщений на Android
Когда приложение вообще не запускается и пользователь нажимает на уведомление, сообщение по умолчанию не перенаправляется через встроенные обратные вызовы FCM . В этом случае полезные данные сообщения принимаются через Intent
, используемое для запуска приложения. Чтобы FCM пересылал эти входящие сообщения обратному вызову библиотеки C++, вам необходимо переопределить метод onNewIntent
в своей деятельности и передать 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); } }
В сообщениях, полученных, когда приложение находится в фоновом режиме, содержимое поля уведомления используется для заполнения уведомления на панели задач, но это содержимое уведомления не будет передано в 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 — Analytics). Для этого добавьте значение метаданных в свой Info.plist
(а не в GoogleService-Info.plist
) на платформах Apple или в свой AndroidManifest.xml
на 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>
Быстрый
FirebaseMessagingAutoInitEnabled = NO
Чтобы повторно включить FCM, вы можете выполнить вызов во время выполнения:
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
Это значение сохраняется при перезапуске приложения после установки.
Обработка сообщений с помощью глубоких ссылок на Android
FCM позволяет отправлять сообщения, содержащие глубокую ссылку на ваше приложение. Чтобы получать сообщения, содержащие глубокие ссылки, необходимо добавить новый фильтр намерений в действие, которое обрабатывает глубокие ссылки для вашего приложения. Фильтр намерений должен улавливать глубокие ссылки вашего домена. Если ваши сообщения не содержат глубокой ссылки, эта настройка не требуется. В 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>
Когда пользователи нажимают на уведомление, содержащее ссылку на указанную вами схему и хост, ваше приложение начнет действие с этим фильтром намерений для обработки ссылки.
Следующие шаги
После настройки клиентского приложения вы готовы отправлять последующие и тематические сообщения с помощью Firebase. Чтобы узнать больше, ознакомьтесь с этой функцией, продемонстрированной в образце краткого руководства , который вы можете загрузить, запустить и просмотреть.
Чтобы добавить в свое приложение другое, более продвинутое поведение, ознакомьтесь с руководствами по отправке сообщений с сервера приложений:
Имейте в виду, что для использования этих функций вам понадобится серверная реализация .