Как подключить push-уведомления для iOS
Выберите канал push-уведомлений
-
Перейдите в раздел Каналы в личном кабинете edna Pulse.
-
Выберите существующий канал push-уведомлений, в котором вы хотите разместить приложение, или подключите новый.
Как подключить канал Pushк сведениюВ одном канале вы можете объединить несколько приложений, пользователям которых вы хотите отправлять push-уведомления в рамках одной рассылки
-
Убедитесь, что у вас есть:
- приложение iOS с минимальной поддерживаемой версией не ниже iOS 11;
- устройство iOS (iPhone, iPad, iPod Touch) для тестирования;
- компьютер Мас с последней версией Xcode;
- push-сертификат Production Apple Push Certificate;
- утилита CocoaPods или Swift Package Manage.
Создайте AppGroup и добавьте production-сертификат Apple
-
Авторизуйтесь в своём аккаунте Apple developer и выберите Certificates, Identifiers & Profiles.
-
Откройте вкладку Identifiers в левом меню и проверьте, зарегистрирована ли AppGroup для вашего приложения.
Идентификатор группы должен соответствовать идентификатору приложения. Например для приложения com.edna.push.demoapp группа должна называться group.com.edna.push.demoapp.

-
Если группы ещё нет, нажмите справа от заголовка Identifiers и зарегистрируйте новую AppGroup. Запишите или запомните идентификатор — он потребуется в дальнейшем.

-
Получите в Apple сертификат Production Push Certificate.
Как получить пуш-сертификат в Apple и выгрузить его в формате P12 -
Перейдите в раздел Каналы → Настройка приложения iOS в личном кабинете edna Pulse.
-
Введите идентификатор приложения Bundle ID.
-
Прикрепите файл
productionпуш-сертификата в формате .p12 и введите пароль от него.
Как получить пуш-сертификат в Apple и выгрузить его в формате P12
-
Нажмите Сохранить и продолжить.
Создайте расширение Notification Service Extension
-
В проекте приложения в Xcode добавьте новый target (File → New → Target):

-
В окне Choose a template for your new target на вкладке iOS выберите тип расширения Notification Service Extension.

-
Для основного приложения на вкладке Signing & Capabilities подключите созданную на предыдущем шаге AppGroup: добавьте capability Push Notifications и Background Modes → Remote notification.

-
Для расширения Notification Service Extension на вкладке Signing & Capabilities подключите AppGroup и добавьте capability Push Notifications.

-
В файлах Info.plist в параметре
edna_app_groupдля приложения и расширения укажите имя AppGroup.
Подключите библиотеки edna к проекту
Подключите библиотеки edna с помощью CocoaPods или SwiftPackageManager
Подключение библиотеки для основного приложения
- SwiftPackageManager
- CocoaPods
https://github.com/edna-ru/push-x-ios
pod ednaPushX
Подключение библиотеки для расширения Notification Service Extension
- SwiftPackageManager
- CocoaPods
https://github.com/edna-ru/push-x-ne-ios
pod ednaPushXNE
Интегрируйте библиотеку в коде приложения
-
В файле AppDelegate проекта добавьте следующую строку для подключения библиотеки:
- AppDelegate.swift
- AppDelegate.m
import EDNAPushX#import <EDNAPushX/EDNAPushX.h> -
Вставьте уникальный ключ приложения appId и инициализируйте библиотеку в методе AppDelegate
applicationDidFinishLaunchingWithOptions. Ваш ключ appId будет находиться в блоке кода на шаге 4.2 интерактивной инструкции по настройке приложения.- AppDelegate.swift
- AppDelegate.m
func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// appId – Уникальный ключ приложенияlet appId ="Вставьте appId вашего приложения из edna Pulse"// auto_register - Автоматически показывать диалог с запросом на показ пуш-уведомленийlet pushXSettings = ["auto_register": true]EDNAPushX.initWithLaunchOptions(options: launchOptions, appId: appId, settings: pushXSettings)return true}- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// appId – Уникальный ключ приложенияNSString *appId = @"Вставьте appId вашего приложения из edna Pulse";// auto_register - Автоматически показывать диалог с запросом на показ пуш-уведомленийNSDictionary<NSString *, id> *options = @{@"auto_register": @YES};[EDNAPushX initWithLaunchOptionsWithOptions: launchOptions appId: appId settings: options];return YES;} -
Передайте в библиотеку системные вызовы в методах AppDelegate
didRegisterForRemoteNotificationsWithDeviceTokenиdidReceiveRemoteNotification:- AppDelegate.swift
- AppDelegate.m
func application(_ application: UIApplication,didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {EDNAPushX.setNotificationDeviceToken(deviceToken)}func application(_ application: UIApplication, userInfo: [AnyHashable : Any],fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {EDNAPushX.didReceiveRemoteNotification(userInfo: userInfo, fetchCompletionHandler: completionHandler)}- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{[EDNAPushX setNotificationDeviceToken: deviceToken];}- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler{[EDNAPushX didReceiveRemoteNotificationWithUserInfo: userInfo fetchCompletionHandler: completionHandler];} -
Замените код основного класса Notification Service Extension на следующий:
- NotificationService.swift
- NotificationService.m
import UserNotificationsimport EDNAPushXNEclass NotificationService: UNNotificationServiceExtension {override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler:@escaping (UNNotificationContent) -> Void) {EDNAPushXNE.didReceive(request, withContentHandler: contentHandler)}override func serviceExtensionTimeWillExpire() {EDNAPushXNE.serviceExtensionTimeWillExpire()}}#import <UserNotifications/UserNotifications.h>#import <EDNAPushXNE/EDNAPushXNE.h>@implementation NotificationService- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {[EDNAPushXNE didReceiveNotificationRequest: request withContentHandler: contentHandler];}- (void)serviceExtensionTimeWillExpire {[EDNAPushXNE serviceExtensionTimeWillExpire];} -
Если пользователь нажмёт на область или кнопки уведомления, будет запущено приложение. Чтобы получить от библиотеки информацию о том, что приложение было запущено по нажатию на уведомление, в метод
EDNAPushX.setOnPushActionпередайте замыкание:- AppDelegate.swift
- AppDelegate.m
EDNAPushX.setOnPushAction(block: { (action) in...})[EDNAPushX setOnPushActionWithBlock:^(EDNAPushXAction *action) {...}];
Метод EDNAPushX.setOnPushAction нужно вызвать до инициализации библиотеки — до вызова метода EDNAPushX.initWithLaunchOptions.
Поддержите регистрацию устройств пользователей в сервисе edna
Устройство пользователя появится в edna Pulse после регистрации. Сейчас доступен только автоматический способ регистрации. Скоро будет добавлен ручной способ.
-
Выберите тип регистрации устройства на платформе.
- При автоматической регистрации библиотека edna самостоятельно регистрирует устройство в сервисе edna. Этот способ проще, не требует от вас управлять регистрацией, но не рекомендуется для отправки конфиденциальных данных.
- После появления ручного способа ваш бэкенд сможет самостоятельно регистрировать устройство в сервисе edna через специальный метод API.
-
Для регистрации пользователя в сервисе вызовите метод
loginбиблиотеки, укажите идентификатор пользователя и тип идентификатораSubscriberIdType.Вызовите метод после успешной авторизации пользователя в вашем приложении:
- AppDelegate.swift
- AppDelegate.m
EDNAPushX.login(userIdType: .email, userId: "example@mail.com")[EDNAPushX loginWithUserIdType: EDNAPushXUserIdTypeEmail userId: @"example@mail.com"];Доступны следующие виды
SubscriberIdType:- Номер телефона (
PhoneNumber) - Адрес электронной почты (
Email) - идентификаторы
FacebookId*,TelegramId,GoogleId,AppleId,YandexId; - Внутренние идентификаторы пользователя (
ExtUserId,CookieId) - UTM-метка (
UTM)
-
В момент деавторизации пользователя в приложении, вызовите метод
logoutбиблиотеки, чтобы отключить устройство пользователя в сервисе edna:- AppDelegate.swift
- AppDelegate.m
EDNAPushX.logout()[EDNAPushX logout];
Подключите Notification Content Extension
-
В Xcode-проекте добавьте новый target, как и для Notification Service Extension. Далее в окне Choose a template for your new target на вкладке iOS выберите тип расширения Notification Content Extension.

-
Подключите библиотеку для расширения Notification Content Extension с помощью Swift Package Manager или CocoaPods.
- SwiftPackageManager
- CocoaPods
https://github.com/edna-io/push-x-ce-iospod ednaPushXCE -
Замените код основного класса
Notification Content Extensionна следующий:NotificationViewController.swiftimport UIKitimport UserNotificationsimport UserNotificationsUIimport EDNAPushXCEclass NotificationViewController: EDNAPushCEController{} -
Укажите название extension-категории ednaPushCategory в параметре
NSExtension/NSExtensionAttributes/UNNotificationExtensionCategoryфайла расширения Info.plist. Уведомления, требующие расширенной вёрстки, будут отправлены с extension-категорией ednaPushCategory. -
В файле Info.plist в параметре
edna_app_groupдля расширения Notification Content Extension укажите то же имя AppGroup, что и для приложения и расширения Notification Service Extension. -
Убедитесь, что для параметра
NSExtension/NSExtensionAttributes/UNNotificationExtensionDefaultContentHiddenуказано значениеYES (1). Данный параметр позволяет скрыть информацию из оригинального уведомления при отображении расширенного вида.
-
Для расширения Notification Content Extension на вкладке Signing & Capabilities подключите тот же AppGroup, что и для приложения и расширения Notification Service Extension.
-
Перед загрузкой обновленной версии в магазин приложений не забудьте обновить декларацию о сборе данных.
Заполнение декларации о сборе данных
* Деятельность компании Meta запрещена на территории Российской Федерации.