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

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

Загрузка ключей в Carrot quest

Сначала интегрируйте HPK в своё приложение по инструкции Huawei. Затем в личном кабинете Carrot quest откройте Настройки → Разработчикам → Push-уведомления для SDK и заполните Client ID, Client Secret и Webhook Secret.

Передача токена и обработка 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 по инструкции HMS.

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

Иконку и цвет уведомлений 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 и проверьте, всё ли вы сделали правильно