Push нотификации
Убедитесь, что предыдущие шаги выполнены успешно
- SDK добавлено в ваше мобильное приложение (в проекте появилась зависимость
CarrotSDK) - Ключи взяты из раздела для разработчика (не из webApi): ключи для SDK
- Инициализация выполнена успешно и приложение запустилось без ошибок
- В консоли появилась надпись “SDK init success”
Результат шага
- В вашем приложении будет настроена отправка push нотификаций для пользователей
Для работы с уведомлениями Carrot quest SDK использует сервис Firebase Cloud Messaging. В связи с этим необходимо получить ключ и отправить его в Carrot.
Применение ключа в настройках Carrot quest
В консоли Firebase перейдите в свой проект, перейдите в Project settings, выберите вкладку Service accounts, нажмите на кнопку Generate new private key и в появившемся окне нажмите Generate key. Браузер предложит скачать JSON-файл с ключом.
Управлять созданными ключами вы сможете из настроек Google Cloud Platform. Для этого в консоли Firebase в разделе Service accounts перейдите по ссылке Manage service account permissions.

Зайдите в свой аккаунт в Carrot quest, перейдите в раздел Настройки → Разработчикам и загрузите ключ. На скриншоте указаны примеры ключей

Подключение Firebase в проект
Для подключения вам нужно добавить файл конфигурации в проект. Для этого зайдите в консоль firebase и перейдите в настройки проекта:

В разделе General/your apps выберите Add app, а затем следуйте подробной инструкции от Firebase.
Также вы можете ознакомиться с общей инструкцией от Firebase.
Отправка токена уведомлений в Carrot quest
Нужно сделать делегат MessagingDelegate и реализовать функцию для получения токена. Для корректной работы необходимо вставить следующий код в ваш проект (без определённого места):
import FirebaseMessaging
import CarrotSDK
extension AppDelegate: MessagingDelegate {
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
if let fcmToken = fcmToken {
CarrotNotificationService.shared.setToken(fcmToken)
} else {
print("Carrot quest SDK error: fcmToken not found")
}
}
}#import "CarrotSDK/CarrotSDK.h"
#import <Firebase.h>
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
CarrotNotificationService *service = [CarrotNotificationService shared];
[service setToken:fcmToken];
}Такое решение подходит для нативных проектов.
Если требуется интеграция в кроссплатформенное решение, то метод setToken должен быть вызван после метода setup.
Разрешение на показ уведомлений
Необходимо запросить разрешение на показ уведомлений. Рекомендованное место:
import CarrotSDK
class AppDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
) -> Bool {
...
UNUserNotificationCenter
.current()
.requestAuthorization(
options: [.alert, .badge, .sound]
) { granted, error in
if granted {
DispatchQueue.main.async {
UIApplication
.shared
.registerForRemoteNotifications()
}
}
}
return true
}
}#import "CarrotSDK/CarrotSDK.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions {
...
[[UNUserNotificationCenter currentNotificationCenter]
requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound)
completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
}
}];
return YES;
}Так же, рекомендуем убедиться, что запрос на показ уведолмений происходит раньше чем установка токена через CarrotNotificationService.shared.setToken.
Отображение уведомлений
Для корректной работы необходимо вставить следующий код в ваш проект (без определённого места):
import CarrotSDK
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
let notificationService = CarrotNotificationService.shared
if notificationService.canHandle(notification) {
notificationService.show(notification, completionHandler: completionHandler)
} else {
// Логика показа пользовательских уведомлений
}
}
}#import <UserNotifications/UserNotifications.h>
#import "CarrotSDK/CarrotSDK.h"
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
CarrotNotificationService *service = [CarrotNotificationService shared];
if ([service canHandle:notification]) {
[service show:notification appGroudDomain:nil completionHandler:completionHandler];
} else {
// Логика показа пользовательских уведомлений
}
}Этот код нужен для отображения пушей полученных по RTS. Пуши, которые приходят от Firebase уже будут показаны
Обработка кликов на уведомления
Для обработки кликов на уведомления необходимо вставить следующий код в ваш проект (без определённого места):
import CarrotSDK
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let notificationService = CarrotNotificationService.shared
if notificationService.canHandle(response) {
notificationService.clickNotification(notificationResponse: response)
} else {
// Логика для пользовательских уведомлений
}
completionHandler()
}
}#import <UserNotifications/UserNotifications.h>
#import "CarrotSDK/CarrotSDK.h"
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)(void))completionHandler {
CarrotNotificationService *service = [CarrotNotificationService shared];
if ([service canHandleWithResponse:response]) {
[service clickNotificationWithNotificationResponse:response appGroudDomain:nil openLink:YES];
} else {
// Логика для пользовательских уведомлений
}
completionHandler();
}Дублирование уведомлений и статистика доставленных пушей
Мы используем 2 канала доставки сообщений, поэтому в некоторых случаях уведомления могут дублироваться. Например: при выходе из приложения или при очень быстром удалении уведомления, возможно получение повторного уведомления. Для предотвращения такого поведения нужно создать Notification Service Extension.
В Xcode, в списке файлов выберите свой проект, а затем File/New/Target/Notification Service Extension.
После чего необходимо зарегистрировать AppGroup.
Для этого перейдите в Apple Developer Portal и авторизуйтесь под своим аккаунтом. Затем выберите Identifiers и нажмите на +

В списке выберите App Group. Вы должны увидеть примерно такую картину:

Description может быть любой, это описание для вас. А вот Identifier должен быть уникальным, и начинаться на "group." иначе Xcode его не примет.
Теперь необходимо добавить Identifier в Xcode:

- В списке файлов выберите свой проект.
- В списке targets выберете пункт с именем вашего проекта.
- Во вкладке "Singing & Capabitities" нажмите на "+ Capability".
- В выпадающем списке найдите найдите и выберите App Group.
- На вкладке появится пустой список для идентификаторов App Group. Добавте туда Identifier, который зарегистрировали в Apple Developer Portal ранее.
- Вернитесь к списку Targets. Аналогичным образом добавте App Group к вашему Notification Service Extension.
Внесите изменения в метод инициализирующий библиотеку:
Carrot.shared.setup(
...
withAppGroup: "GROUP ID", // Тут ваш только что созданный идентификатор
...
)[[Carrot shared] setupWithApiKey:<api_key>
successHandler:^(){
NSLog(@"Carrot quest SDK connected");
}
errorHandler:^(NSString *error) {
NSLog(@"Carrot quest SDK error: %@", error);
}
withAppGroup:<group_id>];Теперь нужно добавить логику в ваш Notification Service Extension. В списке файлов, должна была появиться новая папка с именем вашего Notification Service Extension. Добавьте код в файл NotificationService.swift:
import UserNotifications
import CarrotSDK
class NotificationService: CarrotNotificationServiceExtension {
override func setup() {
self.apiKey = "API KEY"
self.domainIdentifier = "GROUP ID"
}
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
super.didReceive(request, withContentHandler: contentHandler)
}
}#import <UserNotifications/UserNotifications.h>
#import "CarrotSDK/CarrotSDK.h"
@interface NotificationService : CarrotNotificationServiceExtension
@end
@implementation NotificationService
- (void)setup {
self.apiKey = <api_key>;
self.domainIdentifier = <group_id>;
}
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
withContentHandler:(void (^)(UNNotificationContent *contentToDeliver))contentHandler {
[super didReceiveNotificationRequest:request withContentHandler:contentHandler];
}
@endОбновите ваш pod файл, добавьте:
target 'NotificationService' do
inherit! :search_paths
pod 'CarrotquestSDK'
endИ напоследок, нужно передать Identifier зарегистрированный в Apple Developer Portal ранее в метод show в UNUserNotificationCenterDelegate:
let domain = "Identifier зарегистрированный в Apple Developer Portal ранее"
notificationService.show(notification, appGroudDomain: domain, completionHandler: completionHandler)NSString *domain = @"Identifier зарегистрированный в Apple Developer Portal ранее";
[notificationService show:notification appGroudDomain:domain completionHandler:completionHandler];Проверка шага
Чтобы проверить правильность выполнения шага вы можете вручную отправить себе на устройство пуш. Для этого:
Найдите свою карточку в базе лидов. Вот так
Затем нажмите на три точки → Отправить push-уведомление

Выберите “Создать сообщение с нуля”
Затем заполните поля случайными тестовыми данными и нажмите отправить

Метод отписки от пушей
Данные методы помогут отписать конкретного пользователя от пушей и от всех рассылок.
Метод для отписки от пушей
swiftimport CarrotSDK CarrotNotificationService.shared.pushNotificationsUnsubscribe()objective-c#import "CarrotSDK/CarrotSDK.h" [[CarrotNotificationService shared] pushNotificationsUnsubscribe];Метод для отписки от всех рассылок
swiftimport CarrotSDK CarrotNotificationService.shared.pushCampaignsUnsubscribe()objective-c#import "CarrotSDK/CarrotSDK.h" [[CarrotNotificationService shared] pushCampaignsUnsubscribe];
Важная информация о Push уведомлениях
Необходимо добавить в info.plist вашего проекта параметр:
<key>FirebaseAppDelegateProxyEnabled</key>
<false/>Если кратко, то это переключает управление уведолмениями в ручной режим и позволяет SDK правильно функционировать. Подробнее можете почитать тут.
Настройка push уведомлений
Отправка триггерных push уведомлений
О том, как настроить push уведомления можно прочитать здесь:
Использование ссылок в пушах
Подробная инструкция по ручной обработке ссылок вынесена в отдельный раздел: Ручной способ открывать ссылки в SDK
FAQ
Почему могут не приходить пуши?
Неверные ключи
Были взяты ключи из webApi, а не из раздела Разработчикам.
Решение: вернитесь в раздел ключи для SDK и проверьте, всё ли вы сделали правильно