| Выберите платформу: | 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
Если вы еще этого не сделали, добавьте Firebase в свой проект на C++ .
В прилагаемых инструкциях по настройке ознакомьтесь с требованиями к устройству и приложению для использования Firebase C++ SDK, включая рекомендацию использовать CMake для сборки вашего приложения.
В файле
build.gradleна уровне проекта обязательно укажите репозиторий Maven от Google в разделахbuildscriptиallprojects.
Создайте объект Firebase App, передав ему среду JNI и Activity:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Определите класс, реализующий интерфейс
firebase::messaging::Listener.Инициализируйте FCM , передав в качестве параметров приложение и созданный слушатель:
::firebase::messaging::Initialize(app, listener);
Приложениям, использующим SDK сервисов Google Play, следует проверить устройство на наличие совместимого APK-файла сервисов Google Play перед использованием их функций. Для получения дополнительной информации см. раздел «Проверка наличия APK-файла сервисов Google Play» .
iOS+
- Если вы еще этого не сделали, добавьте Firebase в свой проект C++ . Затем, чтобы настроить проект для FCM :
- В файл Podfile вашего проекта добавьте зависимость FCM:
pod 'FirebaseMessaging'
- Перетащите фреймворки
firebase.frameworkиfirebase_messaging.frameworkиз Firebase C++ SDK в свой проект Xcode.
- В файл Podfile вашего проекта добавьте зависимость FCM:
Загрузите свой ключ аутентификации APNs в Firebase. Если у вас еще нет ключа аутентификации APNs, обязательно создайте его в Центре разработчиков Apple .
В консоли Firebase внутри вашего проекта выберите значок шестеренки, затем выберите «Настройки проекта» и перейдите на вкладку «Облачные сообщения» .
В разделе «Ключ аутентификации APNs» в настройках приложения iOS нажмите кнопку «Загрузить» , чтобы загрузить ключ аутентификации для разработки, ключ аутентификации для производства или оба. Требуется как минимум один ключ.
Перейдите к месту, где вы сохранили свой ключ, выберите его и нажмите «Открыть» . Добавьте идентификатор ключа (доступен в Центре для разработчиков Apple ) и нажмите «Загрузить» .
Настройте свой проект Xcode, чтобы включить push-уведомления:
- Выберите проект в разделе «Навигатор» .
- Выберите целевой проект в области редактора .
В редакторе выберите вкладку «Общие» .
- Прокрутите страницу до раздела «Связанные фреймворки и библиотеки» , затем нажмите кнопку «+» , чтобы добавить фреймворки.
В появившемся окне прокрутите до раздела UserNotifications.framework , щелкните по записи, а затем нажмите «Добавить» .
Этот фреймворк появляется только в Xcode версии 8 и более поздних версиях и необходим для работы этой библиотеки.
В редакторе выберите вкладку «Возможности» .
- Включите push-уведомления .
- Прокрутите до пункта «Режимы фона» , затем переключите его в положение «Вкл.» .
- В разделе «Фоновые режимы» выберите «Удаленные уведомления» .
Создайте объект Firebase App:
app = ::firebase::App::Create(::firebase::AppOptions());
Определите класс, реализующий интерфейс
firebase::messaging::Listener.Инициализируйте 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);
После установки это значение сохраняется при перезапуске приложения.
Сообщения с прямыми ссылками на 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>
Когда пользователи нажимают на уведомление, содержащее ссылку на указанную вами схему и хост, ваше приложение запускает активность с этим фильтром намерений для обработки ссылки.
Следующие шаги
После завершения этапов настройки, вот несколько вариантов для дальнейшей работы с FCM для C++:
- Отправляйте сообщения на устройства
- Получение сообщений в приложении на C++
- Отправляйте сообщения по темам