Skip to content

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.

Untitled

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

Без имени-3.png

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

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

Untitled

В разделе General/your apps выберите Add app, а затем следуйте подробной инструкции от Firebase.

Также вы можете ознакомиться с общей инструкцией от Firebase.

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

Нужно сделать делегат MessagingDelegate и реализовать функцию для получения токена. Для корректной работы необходимо вставить следующий код в ваш проект (без определённого места):

swift
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")
        }
    }
}
objective-c
#import "CarrotSDK/CarrotSDK.h"
#import <Firebase.h>

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    CarrotNotificationService *service = [CarrotNotificationService shared];
    [service setToken:fcmToken];
}

Такое решение подходит для нативных проектов.

Если требуется интеграция в кроссплатформенное решение, то метод setToken должен быть вызван после метода setup.

Разрешение на показ уведомлений

Необходимо запросить разрешение на показ уведомлений. Рекомендованное место:

swift
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
    }
}
objective-c
#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.

Отображение уведомлений

Для корректной работы необходимо вставить следующий код в ваш проект (без определённого места):

swift
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 {
            // Логика показа пользовательских уведомлений
        }
    }
}
objective-c
#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 уже будут показаны

Обработка кликов на уведомления

Для обработки кликов на уведомления необходимо вставить следующий код в ваш проект (без определённого места):

swift
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()
    }
}
objective-c
#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 и нажмите на +

Untitled

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

Untitled

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

Теперь необходимо добавить Identifier в Xcode:

AppGroup.png
  1. В списке файлов выберите свой проект.
  2. В списке targets выберете пункт с именем вашего проекта.
  3. Во вкладке "Singing & Capabitities" нажмите на "+ Capability".
  4. В выпадающем списке найдите найдите и выберите App Group.
  5. На вкладке появится пустой список для идентификаторов App Group. Добавте туда Identifier, который зарегистрировали в Apple Developer Portal ранее.
  6. Вернитесь к списку Targets. Аналогичным образом добавте App Group к вашему Notification Service Extension.

Внесите изменения в метод инициализирующий библиотеку:

swift
Carrot.shared.setup(
   ...
       withAppGroup: "GROUP ID", // Тут ваш только что созданный идентификатор
   ...
)
objective-c
[[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:

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)
    }
}
objective-c
#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 файл, добавьте:

ruby
target 'NotificationService' do
     inherit! :search_paths
     pod 'CarrotquestSDK'
   end

И напоследок, нужно передать Identifier зарегистрированный в Apple Developer Portal ранее в метод show в UNUserNotificationCenterDelegate:

swift
let domain = "Identifier зарегистрированный в Apple Developer Portal ранее"
notificationService.show(notification, appGroudDomain: domain, completionHandler: completionHandler)
objective-c
NSString *domain = @"Identifier зарегистрированный в Apple Developer Portal ранее";
[notificationService show:notification appGroudDomain:domain completionHandler:completionHandler];
  • Проверка шага

    Чтобы проверить правильность выполнения шага вы можете вручную отправить себе на устройство пуш. Для этого:

    1. Найдите свою карточку в базе лидов. Вот так

    2. Затем нажмите на три точки → Отправить push-уведомление

      Untitled
    3. Выберите “Создать сообщение с нуля”

    4. Затем заполните поля случайными тестовыми данными и нажмите отправить

    Untitled

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

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

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

    swift
    import CarrotSDK
    
    CarrotNotificationService.shared.pushNotificationsUnsubscribe()
    objective-c
    #import "CarrotSDK/CarrotSDK.h"
    
    [[CarrotNotificationService shared] pushNotificationsUnsubscribe];
  • Метод для отписки от всех рассылок

    swift
    import CarrotSDK
    
    CarrotNotificationService.shared.pushCampaignsUnsubscribe()
    objective-c
    #import "CarrotSDK/CarrotSDK.h"
    
    [[CarrotNotificationService shared] pushCampaignsUnsubscribe];

Важная информация о Push уведомлениях

Необходимо добавить в info.plist вашего проекта параметр:

xml
<key>FirebaseAppDelegateProxyEnabled</key>
<false/>

Если кратко, то это переключает управление уведолмениями в ручной режим и позволяет SDK правильно функционировать. Подробнее можете почитать тут.

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

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

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

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

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