Начните работу с Firebase Cloud Messaging в приложениях на C++

Выберите платформу: iOS+ Android Web Flutter Unity C++


В этом руководстве описано, как начать работу с Firebase Cloud Messaging в ваших клиентских приложениях на C++, чтобы вы могли надежно отправлять сообщения.

Для написания кроссплатформенного клиентского приложения Firebase Cloud Messaging на C++ используйте API Firebase Cloud Messaging . SDK для C++ работает как с платформами Android, так и с Apple, но для каждой платформы требуется дополнительная настройка. Чтобы узнать больше о том, как SDK для C++ для iOS и Android работает с FCM , см. раздел «Понимание Firebase для C++» .

Настройте Firebase и SDK FCM

Android

  1. Если вы еще этого не сделали, добавьте Firebase в свой проект на C++ .

    • В прилагаемых инструкциях по настройке ознакомьтесь с требованиями к устройству и приложению для использования Firebase C++ SDK, включая рекомендацию использовать CMake для сборки вашего приложения.

    • В файле build.gradle на уровне проекта обязательно укажите репозиторий Maven от Google в разделах buildscript и allprojects .

  2. Создайте объект Firebase App, передав ему среду JNI и Activity:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. Определите класс, реализующий интерфейс firebase::messaging::Listener .

  4. Инициализируйте FCM , передав в качестве параметров приложение и созданный слушатель:

    ::firebase::messaging::Initialize(app, listener);

  5. Приложениям, использующим SDK сервисов Google Play, следует проверить устройство на наличие совместимого APK-файла сервисов Google Play перед использованием их функций. Для получения дополнительной информации см. раздел «Проверка наличия APK-файла сервисов Google Play» .

iOS+

  1. Если вы еще этого не сделали, добавьте Firebase в свой проект C++ . Затем, чтобы настроить проект для FCM :
    1. В файл Podfile вашего проекта добавьте зависимость FCM:
      pod 'FirebaseMessaging'
    2. Перетащите фреймворки firebase.framework и firebase_messaging.framework из Firebase C++ SDK в свой проект Xcode.
  2. Загрузите свой ключ аутентификации APNs в Firebase. Если у вас еще нет ключа аутентификации APNs, обязательно создайте его в Центре разработчиков Apple .

    1. В консоли Firebase внутри вашего проекта выберите значок шестеренки, затем выберите «Настройки проекта» и перейдите на вкладку «Облачные сообщения» .

    2. В разделе «Ключ аутентификации APNs» в настройках приложения iOS нажмите кнопку «Загрузить» , чтобы загрузить ключ аутентификации для разработки, ключ аутентификации для производства или оба. Требуется как минимум один ключ.

    3. Перейдите к месту, где вы сохранили свой ключ, выберите его и нажмите «Открыть» . Добавьте идентификатор ключа (доступен в Центре для разработчиков Apple ) и нажмите «Загрузить» .

  3. Настройте свой проект Xcode, чтобы включить push-уведомления:

    1. Выберите проект в разделе «Навигатор» .
    2. Выберите целевой проект в области редактора .
    3. В редакторе выберите вкладку «Общие» .

      1. Прокрутите страницу до раздела «Связанные фреймворки и библиотеки» , затем нажмите кнопку «+» , чтобы добавить фреймворки.
      2. В появившемся окне прокрутите до раздела UserNotifications.framework , щелкните по записи, а затем нажмите «Добавить» .

        Этот фреймворк появляется только в Xcode версии 8 и более поздних версиях и необходим для работы этой библиотеки.

    4. В редакторе выберите вкладку «Возможности» .

      1. Включите push-уведомления .
      2. Прокрутите до пункта «Режимы фона» , затем переключите его в положение «Вкл.» .
      3. В разделе «Фоновые режимы» выберите «Удаленные уведомления» .
  4. Создайте объект Firebase App:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. Определите класс, реализующий интерфейс firebase::messaging::Listener .

  6. Инициализируйте Firebase Cloud Messaging, передав в качестве параметров приложение и созданный слушатель:

    ::firebase::messaging::Initialize(app, listener);

Получите доступ к регистрационному токену 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);
  }
}

Сообщения, полученные во время работы приложения в фоновом режиме, используют содержимое поля уведомления для заполнения уведомления в системном трее, но это содержимое уведомления не будет передано в 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:

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);

После установки это значение сохраняется при перезапуске приложения.

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>

Когда пользователи нажимают на уведомление, содержащее ссылку на указанную вами схему и хост, ваше приложение запускает активность с этим фильтром намерений для обработки ссылки.

Следующие шаги

После завершения этапов настройки, вот несколько вариантов для дальнейшей работы с FCM для C++: