Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Настройте клиентское приложение Firebase Cloud Messaging с помощью C++.

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

Чтобы написать кроссплатформенное клиентское приложение Firebase Cloud Messaging на C++, используйте API Firebase Cloud Messaging . C++ SDK работает как на платформах Android, так и на платформах Apple, но для каждой платформы требуется дополнительная настройка.

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

Андроид

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

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

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

  2. Создайте объект приложения Firebase, передав среду JNI и действие:

    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. Вам нужен действующий сертификат APNs . Если у вас его еще нет, обязательно создайте его в Apple Developer Member Center .
  2. Если вы еще этого не сделали, добавьте Firebase в свой проект C++ . Затем, чтобы настроить ваш проект для FCM:
    1. В подфайл вашего проекта добавьте зависимость FCM:
      pod 'FirebaseMessaging'
    2. Перетащите фреймворки firebase.framework и firebase_messaging.framework в свой проект Xcode из Firebase C++ SDK .
  3. Настройте свой проект Xcode, чтобы включить push-уведомления:

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

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

        Эта структура появляется только в Xcode v8 и более поздних версиях и требуется для этой библиотеки.

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

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

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

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

  6. Инициализируйте 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 будет нулевым.

В итоге:

Состояние приложения Уведомление Данные Оба
Передний план 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);

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

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. Чтобы узнать больше, см. демонстрацию этой функции в образце быстрого запуска, который можно загрузить, запустить и просмотреть.

Чтобы добавить другое, более продвинутое поведение в ваше приложение, см. руководства по отправке сообщений с сервера приложений:

Имейте в виду, что вам потребуется реализация сервера , чтобы использовать эти функции.