Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

Android

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

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

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

  2. Создание объекта Firebase App, проходя в JNI среде и активность:

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

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

  4. Initialize ТСМ, проходя в App и сконструированной Слушатель:

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

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

iOS +

  1. Вам нужен действующий APNs сертификат. Если у вас еще нет, убедитесь , что создать в компании Apple Developer Center член .
  2. Если вы еще не сделали, добавьте Firebase в свой проект C ++ . Затем, чтобы настроить свой проект для FCM:
    1. В Podfile вашего проекта, добавьте зависимость ТСМ:
      pod 'Firebase/Messaging'
    2. Перетащите firebase.framework и firebase_messaging.framework рамки в свой проект Xcode с ++ SDK Firebase C .
  3. Настройте свой проект Xcode, чтобы включить push-уведомления:

    1. Выберите проект из области Navigator.
    2. Выберите цель проекта из области редактора.
    3. Выберите вкладку Общие из области редактора.

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

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

    4. Выберите вкладку Capabilities из области редактора.

      1. Переключатель Push Notifications Вкл.
      2. Прокрутите вниз до фона режимов, а затем включите его в On.
      3. Выберите Удаленные уведомления под Режимы фона.
  4. Создание объекта Firebase App:

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

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

  6. Initialize Firebase Cloud Messaging, проходя в App и сконструированной СЛУШАТЕЛЬ:

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

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

После инициализации библиотеки Firebase Cloud Messaging для экземпляра клиентского приложения запрашивается регистрационный токен. Приложение получит маркер с OnTokenReceived обратного вызова, который должен быть определен в классе , который реализует firebase::messaging::Listener .

Если вы хотите настроить таргетинг на это конкретное устройство, вам понадобится доступ к этому токену.

Примечание о доставке сообщений на Android

Когда приложение вообще не запущено, а пользователь нажимает на уведомление, сообщение по умолчанию не маршрутизируется через встроенные обратные вызовы FCM. В этом случае, полезные нагрузки сообщений принимаются через Intent используется для запуска приложения. Для того, чтобы иметь ТСМ вперед эти входящие сообщения на 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 .

Override ListenerService методы.

ListenerService класс Java , который перехватывает входящие сообщения , отправленные на приложение и маршруты их в библиотеку C ++. Когда приложение находится на переднем плане (или когда приложение находится в фоновом режиме и получает полезные данные, содержащие только данные), сообщения будут проходить через один из обратных вызовов, предоставленных в этом классе. Чтобы добавить пользовательское поведение при обработке сообщений, вам нужно будет продлить по умолчанию FCM в ListenerService :

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 файл , который объявляет по умолчанию FCM в ListenerService . Это проявляется , как правило , объединены с проектом конкретных манифеста , который , как 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>

Новые версии 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>

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

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

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

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

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