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 accounts → Generate new private key. Браузер скачает JSON-файл с ключом.
Зайдите в личный кабинет Carrot quest, откройте Настройки → Разработчикам → Push-уведомления для SDK и загрузите этот JSON.
Подробная инструкция по созданию Firebase-проекта: Настройка Firebase project | База знаний.
Подключение Firebase в проект
Добавьте Firebase в Android-приложение по официальной инструкции Firebase и убедитесь, что в build.gradle[.kts] модуля приложения подключён firebase-messaging:
implementation("com.google.firebase:firebase-messaging:24.1.0")implementation 'com.google.firebase:firebase-messaging:24.1.0'Отправка токена уведомлений в Carrot quest
В вашем FirebaseMessagingService (если такого ещё нет — создайте и зарегистрируйте в AndroidManifest.xml как обычный FirebaseMessagingService) переопределите onNewToken и пробросьте токен в SDK через Carrot.sendPushToken:
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)
}
}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. Свои собственные пуши обработайте как обычно:
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-уведомлений
}
}
}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
- Зарегистрируйте аккаунт разработчика на developer.huawei.com и пройдите верификацию (подтверждение личности или организации). Без верификации Push Kit включить нельзя; проверка документов может занять несколько дней.
- В консоли AppGallery Connect создайте проект и добавьте в него Android-приложение. Имя пакета (package name) должно совпадать с
applicationIdвашего приложения. - В настройках приложения укажите SHA-256 отпечаток сертификата подписи — без него HMS не выдаст пуш-токен. Как получить отпечаток: инструкция Huawei.
- Включите 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-устройства.
В AppGallery Connect откройте Рост (Grow) → Push Kit → Настройки.
Включите Уведомление о получении сообщений на уровне проекта и нажмите Создать в появившемся окне.
Заполните поля:
Поле Значение Имя carrotquestАдрес подтверждения получения (callback URL) https://api.carrotquest.io/messages/webhooks/huawei/status?app=APP_IDИмя пользователя подтверждения получения строго carrotquestКлюч подтверждения получения нажмите «Сгенерировать» и сохраните значение — это ваш Webhook Secretдля шага 4Версия v2APP_IDв адресе замените на идентификатор вашего аппа в Carrot quest. Он лежит там же, где ключи для SDK: Настройки → Разработчикам (см. Ключи для SDK).Нажмите Тест — Huawei отправит проверочный запрос на указанный адрес. Если проверка прошла успешно, нажмите Отправить.
Шаг 4. Загрузите ключи в Carrot quest
В личном кабинете Carrot quest откройте Настройки → Разработчикам → Push-уведомления для SDK и заполните три поля:
Client IDиClient Secret— из шага 2;Webhook Secret— ключ подтверждения получения, сгенерированный на шаге 3.

Не забудьте нажать Сохранить.
Шаг 5. Подключите HMS в проект
В AppGallery Connect на странице Настройки проекта → Данные приложения скачайте файл
agconnect-services.jsonи положите его в каталог модуля приложения (рядом сbuild.gradleмодуляapp).Добавьте репозиторий Huawei и плагин AppGallery Connect. В
build.gradleуровня проекта:groovybuildscript { 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].В
build.gradle[.kts]модуля приложения примените плагин и добавьте зависимость Push Kit:kotlinplugins { // ... id("com.huawei.agconnect") } dependencies { implementation("com.huawei.hms:push:latestVersion") }groovyapply plugin: 'com.huawei.agconnect' dependencies { implementation 'com.huawei.hms:push:latestVersion' }
Вместо latestVersion подставьте актуальные версии плагина и Push Kit — их можно посмотреть в официальной инструкции по интеграции HMS.
Шаг 6. Передача токена и обработка push
Создайте сервис, унаследованный от HmsMessageService, и пробросьте в SDK токен и входящие сообщения:
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)
}
}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>:
<service
android:name=".MyHuaweiPushKitService"
android:exported="false">
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service>Подробнее о клиентской части Push Kit: инструкция HMS.
Как проверить
- Соберите приложение и запустите его на реальном Huawei-устройстве (на нём должен быть установлен HMS Core — на устройствах без Google-сервисов он есть из коробки).
- Убедитесь, что в
onNewTokenвашегоHmsMessageServiceпришёл токен и он передан вCarrot.sendPushToken(например, добавьте лог). - Сверните приложение и отправьте пользователю ручное сообщение из кабинета Carrot quest с включённым чекбоксом «Отправить push-уведомление» — на устройство должен прийти пуш.
Иконка и цвет уведомления
Иконку и цвет уведомлений Carrot quest можно настроить под свой бренд.
Иконка — одним из двух способов:
- вызвать после
Carrot.setup(...):kotlinCarrot.setNotificationIcon(R.drawable.ic_my_notification)javaCarrot.setNotificationIcon(R.drawable.ic_my_notification); - либо положить в
res/drawableиконку с именемic_cq_notification.xml.
Цвет задаётся в ресурсах через имя colorCqNotify:
<color name="colorCqNotify">#EF7F28</color>Возврат на свой экран после чата из пуша
Если пользователь открывает чат по тапу на пуше при закрытом приложении, после закрытия чата процесс завершится — стартовая Activity не запустится. Чтобы вернуть управление в нужный экран, передайте полное имя класса Activity в SDK:
Carrot.setParentActivityClassName("com.example.MainActivity")Carrot.setParentActivityClassName("com.example.MainActivity");Метод отписки от пушей
Данные методы помогут отписать конкретного пользователя от пушей и от всех рассылок.
Метод для отписки от пушей
kotlinCarrot.pushNotificationsUnsubscribe()javaCarrot.pushNotificationsUnsubscribe();Метод для отписки от всех рассылок
kotlinCarrot.pushCampaignsUnsubscribe()javaCarrot.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).