Как настроить push-уведомления для приложения iOS с помощью PushEngage

Теперь вы можете реализовать push-уведомления для вашего iOS-приложения, используя наш iOS App SDK. Вам понадобится помощь вашего разработчика, так как это будет разовая интеграция, прежде чем вы сможете отправлять им push-уведомления через панель управления PushEngage.

Прежде чем начать

  • Вам понадобится установленный Xcode на вашей системе.
  • Действительный аккаунт разработчика и App ID настроены на Apple Developer Portal.

Мы выполним следующие шаги, чтобы включить push-уведомления для вашего iOS-приложения.

Настройка вашего приложения

Включить удаленные уведомления

1. Откройте ваш проект Xcode и выберите корневой проект в навигаторе проекта. Выберите вашу основную цель приложения.

2. Перейдите в раздел Signing & Capabilities. Убедитесь, что добавлена возможность Background Modes. Если нет, добавьте ее, нажав кнопку «+ Capability».

3. Аналогично, убедитесь, что добавлена возможность Push Notifications. Если нет, добавьте ее с помощью кнопки «+ Capability».

Если возможность Push Notifications не отображается в Xcode. Вам нужно выполнить следующие шаги:

1. Войдите в свою учетную запись разработчика Apple.

2. Перейдите в раздел Certificates, Identifiers & Profiles.

3. Выберите идентификатор вашего приложения. Отредактируйте конфигурацию вашего App ID и убедитесь, что Push Notifications включены.

4. Вернитесь в Xcode и попробуйте добавить возможность «Push Notifications» снова.

Включить фоновые режимы

1. В вашем проекте Xcode перейдите в раздел Signing & Capabilities.

2. В разделе Background Modes включите Remote notifications и Background Fetch.

Этот шаг гарантирует, что ваше приложение сможет эффективно обрабатывать удаленные уведомления и фоновые выборки.

Здесь находится руководство по созданию вашего сертификата APNs.

Интеграция PushEngage iOS SDK

PushEngage iOS SDK доступен как Swift package и как CocoaPods pod. Мы просим вас ознакомиться с обоими методами, но использовать только один из них при завершении настройки.

Интеграция PushEngage iOS SDK с SPM

Чтобы интегрировать PushEngage iOS SDK с помощью Swift Package Manager, выполните следующие шаги:

  1. Откройте Xcode и перейдите к вашему проекту. Выберите вкладку Package dependencies. Нажмите кнопку +.
  1. Вставьте URL https://github.com/awesomemotive/pushengage-ios-sdk в строку поиска. Нажмите «Add Package».
  1. Выберите вашу основную цель приложения в разделе «Add to Target» и нажмите «Add Package».

Интеграция PushEngage iOS SDK с CocoaPods

Чтобы интегрировать PushEngage iOS SDK с помощью CocoaPods, вам необходимо выполнить следующие шаги:

Если CocoaPods не установлен, закройте текущий проект Xcode и выполните следующую команду в корневом каталоге вашего проекта

sudo gem install cocoapods

Выполните следующую команду, чтобы инициализировать Podfile в вашем проекте

pod init

Откройте недавно созданный Podfile с помощью текстового редактора или, следуя команде в вашем терминале в корневом каталоге проекта.

open Podfile

Добавьте зависимость PushEngage под целевым объектом вашего проекта. Убедитесь, что ваш Podfile выглядит похоже на пример ниже

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'YourProjectName' do
  # Add PushEngage SDK dependency
  pod 'PushEngage'
  post_install do |installer|
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
      end
    end
  end
end

Сохраните Podfile и выполните следующие команды в терминале.

pod repo update
pod install

Откройте недавно созданный файл <project-name>.xcworkspace в Xcode.

Инициализация PushEngage iOS SDK

После интеграции SDK нам нужно будет инициализировать iOS SDK в вашем AppDelegate.

Используя язык Swift, вот как вы можете это сделать

import PushEngage
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    override init() {
        super.init()
        PushEngage.swizzleInjection(isEnabled: true)
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
       // Set your PushEngage App ID (replace       "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD" with your actual App ID)
        PushEngage.setAppId(key: "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD")
        // Start PushEngage initial info
        PushEngage.setInitialInfo(for: application, with: launchOptions)
        // Enable logs for debugging (optional)
        PushEngage.enableLogs = true
        return true
    }
}

Используя язык Objective-C, вот как вы можете это сделать

#import "AppDelegate.h"
@import PushEngage;
@implementation AppDelegate

- (instancetype)init {
    self = [super init];
    if (self) {
       [PushEngage swizzleInjectionWithIsEnabled:YES];
    }
    return self;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Set your PushEngage App ID (replace "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD" with your actual App ID)
    [PushEngage setAppIdWithKey:@"APP_ID_FROM_PUSH_ENGAGE_DASHBOARD"];
    // Set initial info
    [PushEngage setInitialInfoFor:application with:launchOptions];
    // Enable logs for debugging (optional)
    [PushEngage setEnableLogs:YES];
    return YES;
}

@end

Иногда, при использовании SwiftUI, AppDelegate может быть недоступен по умолчанию. В таких случаях вы можете инициализировать PushEngage SDK в вашем основном файле приложения. Вот пример в SwiftUI

import SwiftUI
import PushEngage

@main
struct PEDemoApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class AppDelegate: NSObject, UIApplicationDelegate {
    
    override init() {
        super.init()
        PushEngage.swizzleInjection(isEnabled: true)
    }
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        PushEngage.setAppId(key: "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD")
        PushEngage.setIntialInfo(for: application,
                                             with: launchOptions)
        
        PushEngage.enableLogs = true
        return true
    }
}

Примечание: При разработке вашего приложения вам может быть полезно включить журналы из PushEngage SDK для целей отладки. Однако крайне важно отключить журналы в производственной сборке, чтобы избежать раскрытия конфиденциальной информации.

Создание расширения Notification Service

Расширение Notification Service расширяет возможности вашего iOS-приложения по получению уведомлений. Оно используется для изменения содержимого уведомления или для получения/обработки любых данных при получении уведомления. Вы можете выполнить следующие шаги для создания расширения Notification Service:

1. Откройте Xcode и перейдите к вашему проекту. Выберите File » New » Target в меню.

2. В окне выбора шаблона выберите Notification Service Extension и нажмите Next.

3. Укажите имя для вашего расширения, например, PushEngageNotificationServiceExtension, и нажмите Finish.

4. По завершении создания Notification Service Extension вам может быть предложено активировать его. Не активируйте его немедленно.

Активация расширения переключит фокус отладки Xcode с вашего приложения на расширение. Если вы активировали его случайно, не волнуйтесь; вы можете переключиться обратно на отладку вашего приложения в Xcode.

Инициализация SDK PushEngage для Notification Service Extension

Чтобы обеспечить надлежащее функционирование PushEngage SDK в вашем расширении Notification Service для iOS, вам необходимо выполнить следующие шаги:

1. Откройте Podfile, связанный с вашим проектом.

2. Затем вам нужно добавить зависимость. Вставьте следующий фрагмент кода в ваш Podfile:

target 'Your_Main_Application_Target' do
      pod 'PushEngage'
      post_install do |installer|
          installer.pods_project.targets.each do |target|
            target.build_configurations.each do |config|
              config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
          end
        end
      end
     
      target 'Your_Notification_Service_Extension_Target' do
              pod 'PushEngage'
      end
end

3. Выполните следующие команды в вашем терминале в корневом каталоге вашего проекта:

pod repo update
pod install

4. В целевом объекте вашего Notification Service Extension импортируйте фреймворк PushEngage и добавьте необходимый код инициализации. Вот как вы можете это сделать.

Используя Swift

import UserNotifications
import PushEngage

@available(iOSApplicationExtension 10.0, *)
class PushEngageNotificationServiceExtension: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?
    var request : UNNotificationRequest?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.request = request
        self.contentHandler = contentHandler
        self.bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
        
        if let bestContent = bestAttemptContent {
            PushEngage.didReceiveNotificationExtensionRequest(request, bestContentHandler: bestContent)
            contentHandler(bestContent)
        }
    }
    
    override func serviceExtensionTimeWillExpire() {
        // Called just before the extension will be terminated by the system.
        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
        if let contentHandler = contentHandler, let request = request ,let bestAttemptContent =  bestAttemptContent {
            guard let content = PushEngage.serviceExtensionTimeWillExpire(request, content: bestAttemptContent) else {
                contentHandler(bestAttemptContent)
                return
            }
            contentHandler(content)
        }
    }

}

Используя Objective-C

#import "NotificationService.h"
@import PushEngage;

@interface NotificationService ()

@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@property (nonatomic, strong) UNNotificationRequest *request;

@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.request = request;
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    
    if (self.bestAttemptContent) {
        [PushEngage didReceiveNotificationExtensionRequest:request bestContentHandler:self.bestAttemptContent];
        contentHandler(self.bestAttemptContent);
    }
}

- (void)serviceExtensionTimeWillExpire {

    if (self.contentHandler && self.request && self.bestAttemptContent) {
        UNNotificationContent *content = [PushEngage serviceExtensionTimeWillExpire:self.request content:self.bestAttemptContent];
        if (content) {
            self.contentHandler(self.bestAttemptContent);
            return;
        }
    }
    self.contentHandler(self.bestAttemptContent);
}

@end

Создание Notification Content Extension

Чтобы улучшить отображение путем добавления пользовательского интерфейса, вам потребуется создать Notification Content Extension. Следуйте приведенным ниже шагам для настройки расширения:

1. В Xcode перейдите в File » New » Target.

2. Выберите Notification Content Extension и нажмите Далее.

3. Не выбирайте «Активировать» в диалоговом окне, которое появляется после нажатия «Готово». Отмена сохранит отладку вашего приложения в Xcode вместо расширения. Если вы случайно активируете его, вернитесь к отладке вашего приложения в Xcode (рядом с кнопкой запуска).

4. В навигаторе проекта выберите каталог верхнего уровня проекта и выберите цель NotificationContentExtension в списке целей, созданных в шаге № 2.

5. Установите Deployment Target на iOS 10 или выше, так как это версия iOS, для которой Apple выпустила поддержку этого расширения. 

Инициализация SDK PushEngage для Notification Content Extension

Чтобы обеспечить надлежащее функционирование PushEngage SDK в вашем расширении Notification Content для iOS, вам необходимо выполнить следующие шаги:

1. Откройте Podfile, связанный с вашим проектом.

2. Добавьте зависимость, вставьте следующий фрагмент кода в ваш Podfile:

target 'Your_Main_Application_Target' do
  pod 'PushEngage'
  target 'Your_Notification_Content_Extension' do
    pod 'PushEngage'
  end
end

3. Выполните следующие команды в вашем терминале в корневом каталоге вашего проекта:

pod repo update

pod install

4. В целевом объекте вашего Notification Content Extension импортируйте фреймворк PushEngage и добавьте необходимый код инициализации. Вот как вы можете это сделать с некоторыми примерами элементов пользовательского интерфейса:

Используя Swift

import UIKit
import UserNotifications
import UserNotificationsUI
import PushEngage

@available(iOSApplicationExtension 10.0, *)
class NotificationViewController: UIViewController, UNNotificationContentExtension {
    
    fileprivate var hostingView: UIHostingController<ContentView>?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
    }
    
    func didReceive(_ notification: UNNotification) {
        if(notification.request.content.categoryIdentifier == "your_identifier"){
            let payLoad = PushEngage.getCustomUIPayLoad(for: notification.request)
  //pass the payload to your custom View
            let view = CustomView(payLoadInfo: payLoad)
            hostingView = UIHostingController(rootView: view)
If let customView = self.hostingView {
            addChild(hostingView!)
}
        }
    }
    
}


Objective-C:

#import "NotificationViewController.h"
#import <UserNotifications/UserNotifications.h>
#import <UserNotificationsUI/UserNotificationsUI.h>

@import PushEngage;
@import UIKit;

@interface NotificationViewController () <UNNotificationContentExtension>

@property IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIButton *firstButton;
@property (weak, nonatomic) IBOutlet UIButton *secondButton;

@end

@implementation NotificationViewController

- (IBAction)firstbuttonAction:(id)sender {
    // do what action you want to perform.
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any required interface initialization here.
}

- (void)didReceiveNotification:(UNNotification *)notification {
    
    NotificationViewController * __block blockSelf = self;
    CustomUIModel *object = [PushEngage getCustomUIPayLoadFor:notification.request];
    dispatch_async(dispatch_get_main_queue(), ^{
        blockSelf.label.text = object.title;
        blockSelf.imageView.image = object.image;
        [blockSelf.firstButton setTitle:object.buttons.firstObject.text forState:UIControlStateNormal];
        [blockSelf.secondButton setTitle:object.buttons.lastObject.text forState:UIControlStateNormal];
        blockSelf = NULL;
    });
}

@end

Добавить группы приложений

Группы приложений необходимы для связи между основным приложением, расширением сервиса уведомлений и расширением контента. Вы можете выполнить следующие шаги, чтобы добавить группы приложений в ваш проект iOS:

Если у вас уже есть группа приложений и вы хотите использовать только ее, перейдите к шагу № 5.

1. В вашем проекте Xcode, в навигаторе проекта, выберите корневой каталог проекта и выберите основную цель приложения.

2. Перейдите на вкладку "Signing & Capabilities".

3. Нажмите кнопку "+ Capability" и выберите "App Groups" из списка.

4. Нажмите кнопку +, чтобы добавить группу приложений. Добавьте уникальное имя для вашей группы приложений и нажмите OK.

5. В основной области редактора выберите основной целевой объект вашего приложения и создайте группу приложений. Укажите имя группы в файле Info.plist вашего приложения с ключом PushEngage_App_Group_Key.

6. Добавьте тот же ключ и значение в файл Info.plist расширения сервиса уведомлений.

7. Выберите ту же группу приложений в основном целевом объекте приложения и в вашем расширении сервиса уведомлений.

Убедитесь, что вы выбрали ваше расширение сервиса уведомлений на предыдущем шаге.

Глубокие ссылки

Глубокие ссылки позволяют вашим подписчикам переходить непосредственно к определенному экрану в приложении или на указанную веб-страницу при взаимодействии с push-уведомлениями. По умолчанию, если вы предоставите действительный URL, подписчик будет перенаправлен на эту веб-страницу.

Обработка веб-URL:

  • Установите значение YES для PushEngageInAppEnabled в Info.plist, и URL будет загружаться в приложении с использованием WKWebview.
  • Установите значение NO для PushEngageInAppEnabled в Info.plist, если вы хотите, чтобы ваш подписчик перенаправлялся в Safari для загрузки URL. 
  • Установите значение YES для PushEngageAutoHandleDeeplinkURL в Info.plist, и SDK будет обрабатывать глубокую ссылку в соответствии с конфигурацией PushEngageInAppEnabled.
  • Установите значение NO для PushEngageAutoHandleDeeplinkURL в Info.plist, и управление обработкой глубокой ссылки будет передано клиентскому приложению от SDK.
  • Если глубокая ссылка не является допустимым URL, вам необходимо настроить навигацию, используя setNotificationOpenHandler в AppDelegate в методе didFinishLaunchingWithOptions. Это позволит вам перейти к определенному экрану на основе предоставленной строки, как показано ниже. Если не настроено, SDK просто откроет приложение.
ios-deeplink

Используя Swift:

class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    
    override init() {
        super.init()
        // method Swizzling enabled for the application.
        PushEngage.swizzleInjection(isEnabled: true)
    }

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

     PushEngage.setAppId(key: "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD")
     PushEngage.setInitialInfo(for: application,with: launchOptions)
        
        
     // Notification open handler.
     // deep linking screen
     // here ShoesScreen and pepay are example deep link texts
     PushEngage.setNotificationOpenHandler { (result) in
            //replace this block with your own handling
            let additionData = result.notification.additionalData
            if result.notificationAction.actionID == "ShoesScreen" {
                print(additionData ?? [])
                let storyBoard = UIStoryboard(name: "Main", bundle: .main)
                let viewController = storyBoard.instantiateViewController(withIdentifier: "SportViewController")
                let navcontroller = application.windows.first?.rootViewController as? UINavigationController
                navcontroller?.popToRootViewController(animated: true)
                navcontroller?.pushViewController(viewController, animated: true)
            } else if result.notificationAction.actionID == "SalesScreen" {
                let storyBoard = UIStoryboard(name: "Main", bundle: .main)
                let viewController = storyBoard.instantiateViewController(withIdentifier: "NotificationApiTestViewconttoller")
                let navcontroller = application.windows.first?.rootViewController as? UINavigationController
                navcontroller?.popToRootViewController(animated: true)
                navcontroller?.pushViewController(viewController, animated: true)
            } else if result.notificationAction.actionID == "pepay" {
                let storyBoard = UIStoryboard(name: "Main", bundle: .main)
                let viewController = storyBoard.instantiateViewController(withIdentifier: "PEPay")
                let navcontroller = application.windows.first?.rootViewController as? UINavigationController
                navcontroller?.popToRootViewController(animated: true)
                navcontroller?.pushViewController(viewController, animated: true)
            }
        }
        
        PushEngage.enableLogs = true
        
        return true
    }
}

Используя Objective-C:

@implementation AppDelegate


- (instancetype)init
{
    self = [super init];
    if (self) {
       [PushEngage swizzleInjectionWithIsEnabled: YES];
    }
    return self;
}

typedef void (^PEnotificationOpenHandler)(PENotificationOpenResult * nonnull);

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UNUserNotificationCenter.currentNotificationCenter.delegate = self;
    PEnotificationOpenHandler actionHandler = ^void(PENotificationOpenResult *result) {
       //replace this block with your own handling
        if ([result.notificationAction.actionID isEqualToString: @"ShoesScreen"]) {
            AddToCart *controller = [AddToCart new];
            UINavigationController *navigationController = (UINavigationController *) application.windows.firstObject.rootViewController;
            [navigationController popToRootViewControllerAnimated:YES];
            [navigationController pushViewController:controller animated:YES];
        } else if ([result.notificationAction.actionID isEqualToString: @"SalesScreen"]) {
            SportsViewcontroller *controller = [SportsViewcontroller new];
            UINavigationController *navigationController = (UINavigationController *) application.windows.firstObject.rootViewController;
            [navigationController popToRootViewControllerAnimated:YES];
            [navigationController pushViewController:controller animated:YES];
        }
    };
    application.applicationIconBadgeNumber = 0;
    [PushEngage setAppIdWithKey:@"APP_ID_FROM_PUSH_ENGAGE_DASHBOARD"];
    [PushEngage setInitialInfoFor:application with:launchOptions];
    [PushEngage setNotificationOpenHandlerWithBlock:actionHandler];
    [PushEngage setEnableLogs:true];
    return YES;
}
@end

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

Когда уведомления приходят в фоновом режиме, вы должны решить, показывать ли оповещение об уведомлении устройству. Для обработки уведомлений в фоновом режиме используйте setNotificationWillShowInForgroundHandler

Если блок завершения не будет вызван вами вообще, SDK вызовет блок завершения через 29 секунд. В любом случае, тихое уведомление или уведомление с оповещением, когда приложение находится в фоновом режиме.

Используя Swift

class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    
    override init() {
        super.init()
        // method Swizzling enabled for the application.
       PushEngage.swizzleInjection(isEnabled: true)
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        PushEngage.setAppId(key: "APP_ID_FROM_PUSH_ENGAGE_DASHBOARD")
        PushEngage.setInitialInfo(for: application, with: launchOptions)
        
        // Notification handler when notification deliver's and app is in foreground.
        
        PushEngage.setNotificationWillShowInForgroundHandler { notification, completion in
            if notification.contentAvailable == 1 {
                // in case the developer failed to set the completion handler. After 29 sec the handler will call from the SDK after 29 sec.
                completion(nil)
            } else {
                completion(notification)
            }
        }
        
        PushEngage.enableLogs = true
        
        return true
    }
}


Используя Objective-C

@implementation AppDelegate


- (instancetype)init
{
    self = [super init];
    if (self) {
       [PushEngage swizzleInjectionWithIsEnabled: YES];
    }
    return self;
}
// please create this handlers 
typedef void (^ _Nonnull PENotificationDisplayHandler)(PENotification * _Nullable);

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UNUserNotificationCenter.currentNotificationCenter.delegate = self;
    
    [PushEngage setNotificationWillShowInForgroundHandlerWithBlock:^(PENotification * _Nonnull notification, PENotificationDisplayHandler completion) {
        if (notification.contentAvailable == 1) {
            completion(nil);
        } else {
            completion(notification);
        }
    }];
    [PushEngage setAppIdWithKey:@"APP_ID_FROM_PUSH_ENGAGE_DASHBOARD"];
    [PushEngage setInitialInfoFor:application with:launchOptions];
    [PushEngage setEnableLogs:true];
    return YES;
}
@end

Устранение неполадок

Решение проблем сборки, связанных с песочницей

Проблема:

У вас возникли проблемы со сборкой, связанные с песочницей.

Решение:

  • Откройте ваш проект в Xcode.
  • Перейдите в Build Settings.
  • Найдите опцию User Script Sandboxing.
  • Установите ее в No.
Проблемы с подменой методов в SDK Firebase и PushEngage

Проблема:

Вы используете как Firebase SDK, так и PushEngage SDK с включенной подменой методов для обоих, и это вызывает проблемы.

Решение:

Отключите подмену методов для PushEngage SDK и следуйте ручным инструкциям по обработке методов PushEngage. Подробные инструкции можно найти здесь:
Документация PushEngage iOS SDK

Если вы хотите изучить больше возможностей iOS SDK, вы можете ознакомиться с нашей подробной документацией по API.

Если у вас возникнут какие-либо проблемы, пожалуйста, свяжитесь с нами, нажав здесь. Наша служба поддержки сможет вам помочь.

Все еще не можете разобраться? Чем мы можем помочь?
Последнее обновление: 9 марта 2026 г.

Вовлекайте и удерживайте посетителей после того, как они покинули ваш веб-сайт

Увеличьте ценность каждого посещения веб-сайта с помощью push-уведомлений, которые трудно пропустить.

  • Бесплатный тариф навсегда
  • Простая настройка
  • Поддержка 5 звезд