Skip to content

Push нотификации

Убедитесь, что предыдущие шаги выполнены успешно
  • SDK подключено к проекту: добавлена зависимость io.carrotquest:android-sdk (см. Установка)
  • Ключи взяты из раздела для разработчика (не из webApi): Ключи для SDK
  • Инициализация выполнена успешно и в Logcat появилась надпись “SDK init success”
Результат шага
  • Приложение принимает push-уведомления Carrot quest и шлёт в кабинет статистику показов/кликов

Для работы с уведомлениями Carrot quest SDK использует Firebase Cloud Messaging (FCM). Поэтому сначала нужно настроить FCM в проекте и загрузить серверный ключ в личный кабинет Carrot quest, а затем пробросить FCM-токен и входящие сообщения в SDK.

Применение ключа в настройках Carrot quest

В консоли Firebase перейдите в свой проект → Project settings → вкладка Service accountsGenerate new private key. Браузер скачает JSON-файл с ключом.

Зайдите в личный кабинет Carrot quest, откройте Настройки → Разработчикам → Push-уведомления для SDK и загрузите этот JSON.

Подробная инструкция по созданию Firebase-проекта: Настройка Firebase project | База знаний.

Подключение Firebase в проект

Добавьте Firebase в Android-приложение по официальной инструкции Firebase и убедитесь, что в build.gradle[.kts] модуля приложения подключён firebase-messaging:

kotlin
implementation("com.google.firebase:firebase-messaging:24.1.0")
groovy
implementation 'com.google.firebase:firebase-messaging:24.1.0'

Отправка токена уведомлений в Carrot quest

В вашем FirebaseMessagingService (если такого ещё нет — создайте и зарегистрируйте в AndroidManifest.xml как обычный FirebaseMessagingService) переопределите onNewToken и пробросьте токен в SDK через Carrot.sendPushToken:

kotlin
import com.google.firebase.messaging.FirebaseMessagingService
import io.carrotquest_sdk.android.Carrot

class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        super.onNewToken(token)
        Carrot.sendPushToken(token)
    }
}
java
import com.google.firebase.messaging.FirebaseMessagingService;
import io.carrotquest_sdk.android.Carrot;

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        Carrot.sendPushToken(token);
    }
}

Обработка входящих push

В том же FirebaseMessagingService, в onMessageReceived, проверьте через Carrot.isCarrotPush, что сообщение пришло от Carrot quest, и передайте его в SDK методом Carrot.sendPushNotification. Свои собственные пуши обработайте как обычно:

kotlin
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import io.carrotquest_sdk.android.Carrot

class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(message: RemoteMessage) {
        super.onMessageReceived(message)
        val pushData = message.data
        if (Carrot.isCarrotPush(pushData)) {
            Carrot.sendPushNotification(pushData, this)
        } else {
            // Логика показа собственных push-уведомлений
        }
    }
}
java
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import io.carrotquest_sdk.android.Carrot;

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage message) {
        super.onMessageReceived(message);
        if (Carrot.isCarrotPush(message.getData())) {
            Carrot.sendPushNotification(message.getData(), this);
        } else {
            // Логика показа собственных push-уведомлений
        }
    }
}

Настройка Huawei Push Kit

На устройствах Huawei без Google-сервисов (большинство моделей, выпущенных после 2019 года) FCM не работает. Чтобы доставлять пуши и на них, в дополнение к FCM используется Huawei Push Kit (HPK). SDK сам определит, что устройство Huawei, и подменит канал доставки — со стороны интеграции достаточно пробросить HPK-токен и входящие сообщения теми же методами Carrot.sendPushToken / Carrot.isCarrotPush / Carrot.sendPushNotification.

HPK настраивается в дополнение к FCM, а не вместо него

Сначала настройте FCM по шагам выше — он остаётся каналом доставки для всех остальных Android-устройств. Оба сервиса (FirebaseMessagingService и HmsMessageService) спокойно живут в одном приложении.

Настройка состоит из четырёх частей: консоль Huawei → ключи в личном кабинете Carrot quest → подключение HMS в проект → код приложения.

Шаг 1. Создайте проект в консоли Huawei

  1. Зарегистрируйте аккаунт разработчика на developer.huawei.com и пройдите верификацию (подтверждение личности или организации). Без верификации Push Kit включить нельзя; проверка документов может занять несколько дней.
  2. В консоли AppGallery Connect создайте проект и добавьте в него Android-приложение. Имя пакета (package name) должно совпадать с applicationId вашего приложения.
  3. В настройках приложения укажите SHA-256 отпечаток сертификата подписи — без него HMS не выдаст пуш-токен. Как получить отпечаток: инструкция Huawei.
  4. Включите Push Kit: в меню проекта слева откройте Рост (Grow) → Push Kit и нажмите «Включить».

Шаг 2. Скопируйте Client ID и Client Secret

В AppGallery Connect откройте Настройки проекта → Данные приложения (App information) и найдите блок ID клиента OAuth 2.0. Скопируйте оба значения — Client ID и Client Secret. Они понадобятся на шаге 4.

Шаг 3. Настройте уведомление о получении сообщений (вебхук)

Этот шаг обязателен

В отличие от FCM, Huawei сообщает о статусе доставки пуша не в ответе на отправку, а асинхронно — вебхуком. Без настроенного вебхука Carrot quest не сможет отслеживать доставку пушей на Huawei-устройства.

  1. В AppGallery Connect откройте Рост (Grow) → Push Kit → Настройки.

  2. Включите Уведомление о получении сообщений на уровне проекта и нажмите Создать в появившемся окне.

  3. Заполните поля:

    ПолеЗначение
    Имяcarrotquest
    Адрес подтверждения получения (callback URL)https://api.carrotquest.io/messages/webhooks/huawei/status?app=APP_ID
    Имя пользователя подтверждения получениястрого carrotquest
    Ключ подтверждения получениянажмите «Сгенерировать» и сохраните значение — это ваш Webhook Secret для шага 4
    Версияv2

    APP_ID в адресе замените на идентификатор вашего аппа в Carrot quest. Он лежит там же, где ключи для SDK: Настройки → Разработчикам (см. Ключи для SDK).

  4. Нажмите Тест — Huawei отправит проверочный запрос на указанный адрес. Если проверка прошла успешно, нажмите Отправить.

Шаг 4. Загрузите ключи в Carrot quest

В личном кабинете Carrot quest откройте Настройки → Разработчикам → Push-уведомления для SDK и заполните три поля:

  • Client ID и Client Secret — из шага 2;
  • Webhook Secret — ключ подтверждения получения, сгенерированный на шаге 3.
Блок «Подключение Huawei Push Kit» в разделе Настройки → Разработчикам → Push-уведомления для SDK

Не забудьте нажать Сохранить.

Шаг 5. Подключите HMS в проект

  1. В AppGallery Connect на странице Настройки проекта → Данные приложения скачайте файл agconnect-services.json и положите его в каталог модуля приложения (рядом с build.gradle модуля app).

  2. Добавьте репозиторий Huawei и плагин AppGallery Connect. В build.gradle уровня проекта:

    groovy
    buildscript {
        repositories {
            google()
            mavenCentral()
            maven { url 'https://developer.huawei.com/repo/' } 
        }
        dependencies {
            classpath 'com.huawei.agconnect:agcp:latestVersion'
        }
    }

    Репозиторий https://developer.huawei.com/repo/ также нужно добавить туда, где ваш проект объявляет репозитории зависимостей: в allprojects { repositories { ... } } или, для новых проектов, в dependencyResolutionManagement { repositories { ... } } файла settings.gradle[.kts].

  3. В build.gradle[.kts] модуля приложения примените плагин и добавьте зависимость Push Kit:

    kotlin
    plugins {
        // ...
        id("com.huawei.agconnect")
    }
    
    dependencies {
        implementation("com.huawei.hms:push:latestVersion")
    }
    groovy
    apply plugin: 'com.huawei.agconnect'
    
    dependencies {
        implementation 'com.huawei.hms:push:latestVersion'
    }

Вместо latestVersion подставьте актуальные версии плагина и Push Kit — их можно посмотреть в официальной инструкции по интеграции HMS.

Шаг 6. Передача токена и обработка push

Создайте сервис, унаследованный от HmsMessageService, и пробросьте в SDK токен и входящие сообщения:

kotlin
import android.os.Bundle
import com.huawei.hms.push.HmsMessageService
import com.huawei.hms.push.RemoteMessage
import io.carrotquest_sdk.android.Carrot

class MyHuaweiPushKitService : HmsMessageService() {
    override fun onMessageReceived(message: RemoteMessage?) {
        val pushData = message?.dataOfMap.orEmpty()
        if (Carrot.isCarrotPush(pushData)) {
            Carrot.sendPushNotification(pushData, this)
        } else {
            // Логика показа собственных push-уведомлений
        }
    }

    override fun onNewToken(token: String?) {
        super.onNewToken(token)
        Carrot.sendPushToken(token)
    }

    override fun onNewToken(token: String?, bundle: Bundle?) {
        super.onNewToken(token, bundle)
        Carrot.sendPushToken(token)
    }
}
java
import android.os.Bundle;
import com.huawei.hms.push.HmsMessageService;
import com.huawei.hms.push.RemoteMessage;
import io.carrotquest_sdk.android.Carrot;

import java.util.Collections;
import java.util.Map;

public class MyHuaweiPushKitService extends HmsMessageService {
    @Override
    public void onMessageReceived(RemoteMessage message) {
        Map<String, String> pushData = message != null ? message.getDataOfMap() : Collections.emptyMap();
        if (Carrot.isCarrotPush(pushData)) {
            Carrot.sendPushNotification(pushData, this);
        } else {
            // Логика показа собственных push-уведомлений
        }
    }

    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        Carrot.sendPushToken(token);
    }

    @Override
    public void onNewToken(String token, Bundle bundle) {
        super.onNewToken(token, bundle);
        Carrot.sendPushToken(token);
    }
}

Зарегистрируйте сервис в AndroidManifest.xml внутри тега <application>:

xml
<service
    android:name=".MyHuaweiPushKitService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
    </intent-filter>
</service>

Подробнее о клиентской части Push Kit: инструкция HMS.

Как проверить

  1. Соберите приложение и запустите его на реальном Huawei-устройстве (на нём должен быть установлен HMS Core — на устройствах без Google-сервисов он есть из коробки).
  2. Убедитесь, что в onNewToken вашего HmsMessageService пришёл токен и он передан в Carrot.sendPushToken (например, добавьте лог).
  3. Сверните приложение и отправьте пользователю ручное сообщение из кабинета Carrot quest с включённым чекбоксом «Отправить push-уведомление» — на устройство должен прийти пуш.

Иконка и цвет уведомления

Иконку и цвет уведомлений Carrot quest можно настроить под свой бренд.

Иконка — одним из двух способов:

  • вызвать после Carrot.setup(...):
    kotlin
    Carrot.setNotificationIcon(R.drawable.ic_my_notification)
    java
    Carrot.setNotificationIcon(R.drawable.ic_my_notification);
  • либо положить в res/drawable иконку с именем ic_cq_notification.xml.

Цвет задаётся в ресурсах через имя colorCqNotify:

xml
<color name="colorCqNotify">#EF7F28</color>

Возврат на свой экран после чата из пуша

Если пользователь открывает чат по тапу на пуше при закрытом приложении, после закрытия чата процесс завершится — стартовая Activity не запустится. Чтобы вернуть управление в нужный экран, передайте полное имя класса Activity в SDK:

kotlin
Carrot.setParentActivityClassName("com.example.MainActivity")
java
Carrot.setParentActivityClassName("com.example.MainActivity");

Метод отписки от пушей

Данные методы помогут отписать конкретного пользователя от пушей и от всех рассылок.

  • Метод для отписки от пушей

    kotlin
    Carrot.pushNotificationsUnsubscribe()
    java
    Carrot.pushNotificationsUnsubscribe();
  • Метод для отписки от всех рассылок

    kotlin
    Carrot.pushCampaignsUnsubscribe()
    java
    Carrot.pushCampaignsUnsubscribe();

Настройка push уведомлений

О том, как настроить триггерные push-уведомления в мобильном приложении: Триггерные сообщения в мобильном приложении | База знаний.

FAQ
Почему могут не приходить пуши?

Неверные ключи

Были взяты ключи из webApi, а не из раздела Разработчикам.

Решение: вернитесь в раздел Ключи для SDK и проверьте, всё ли вы сделали правильно

Почему не приходят пуши на Huawei-устройство?

Типичные причины:

  • В кабинет Carrot quest не загружены Client ID / Client Secret / Webhook Secret (см. Шаг 4).
  • Не настроено или не прошло проверку «Уведомление о получении сообщений» в консоли Huawei (см. Шаг 3) — проверьте, что в адресе указан правильный APP_ID, а имя пользователя — строго carrotquest.
  • В AppGallery Connect не указан SHA-256 отпечаток сертификата, которым подписана сборка (для debug- и release-сборок отпечатки разные — добавьте оба).
  • Push Kit не включён в проекте, либо аккаунт разработчика ещё не прошёл верификацию.
  • На устройстве нет HMS Core (например, это эмулятор без сервисов Huawei).