Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Настройка клиентского приложения Firebase Cloud Messaging на C ++

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

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

Android

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

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

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

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

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

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

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

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

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

iOS

  1. Вам нужен действующий сертификат APNs . Если у вас его еще нет, обратитесь к разделу Предоставление сертификатов SSL для APNs .
  2. Если вы еще этого не сделали, добавьте Firebase в свой проект C ++ . Затем, чтобы настроить свой проект для FCM:
    1. В Podfile вашего проекта добавьте зависимость FCM:
      pod 'Firebase/Messaging'
    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, передав приложение и сконструированный Listener:

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

Доступ к токену регистрации устройства

После инициализации библиотеки Firebase Cloud Messaging для экземпляра клиентского приложения запрашивается регистрационный токен. Приложение получит токен с OnTokenReceived вызовом 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());
    startService(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 необходимо заменить службой прослушивателя cusom. Это достигается путем удаления 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>

Запретить автоматическую инициализацию

FCM генерирует идентификатор экземпляра, который используется в качестве регистрационного токена в FCM. Когда создается идентификатор экземпляра, библиотека загружает идентификатор и данные конфигурации в Firebase. Если вы хотите получить явное согласие перед использованием идентификатора экземпляра, вы можете предотвратить создание во время настройки, отключив FCM (и на Android, Analytics) . Для этого добавьте значение метаданных в свой Info.plist (а не в GoogleService-Info.plist ) на iOS или в 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>

iOS

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

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

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