Как подключить push-уведомления для iOS

Шаг 1. Выберите канал push-уведомлений

  1. Перейдите в раздел Настройки → Каналы в личном кабинете edna Pulse.
  2. Выберите существующий канал push-уведомлений, в котором вы хотите разместить приложение, или подключите новый по инструкции.
В одном канале вы можете объединить несколько приложений, пользователям которых вы хотите отправлять push-уведомления в рамках одной рассылки.
  1. Убедитесь, что у вас есть:
    • приложение iOS с минимальной поддерживаемой версией не ниже iOS 11;
    • устройство iOS (iPhone, iPad, iPod Touch) для тестирования;
    • компьютер Мас с последней версией Xcode;
    • push-сертификат Production Apple Push Certificate;
    • утилита CocoaPods или Swift Package Manage.

Шаг 2. Создайте AppGroup и добавьте production-сертификат Apple

  1. Авторизуйтесь в своём аккаунте Apple developer и выберите Certificates, Identifiers & Profiles.
  2. Откройте вкладку Identifiers в левом меню и проверьте, зарегистрирована ли AppGroup для вашего приложения.



    Идентификатор группы должен соответствовать идентификатору приложения. Например для приложения com.edna.push.demoapp группа должна называться group.com.edna.push.demoapp.

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

  3. Получите в Apple сертификат Production Push Certificate (инструкция по получению сертификата).
  4. Перейдите в раздел Настройки → Каналы → Настройка приложения iOS в личном кабинете edna Pulse.
  5. Введите идентификатор приложения Bundle ID.
  6. Прикрепите файл production пуш-сертификата в формате .p12 и введите пароль от него (инструкция по выгрузке сертификата в формате p12).

  7. Нажмите Сохранить и продолжить.

Шаг 3. Создайте расширение Notification Service Extension

  1. В проекте приложения в Xcode добавьте новый target (File New Target):

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

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

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

  5. В файлах Info.plist в параметре edna_app_group для приложения и расширения укажите имя AppGroup.

Шаг 4. Подключите библиотеки edna к проекту

Подключите библиотеки edna с помощью CocoaPods или SwiftPackageManager.

Подключение библиотеки для основного приложения:

  • Подключение через Swift Package Manager:
https://github.com/edna-ru/push-x-ios
  • Подключение через CocoaPods:
pod ednaPushX

Подключение библиотеки для расширения Notification Service Extension:

  • Подключение через Swift Package Manager:
https://github.com/edna-ru/push-x-ne-ios
  • Подключение через CocoaPods:
pod ednaPushXNE

Шаг 5. Интегрируйте библиотеку в коде приложения

  1. В файле AppDelegate проекта добавьте следующую строку для подключения библиотеки:
import EDNAPushX
#import <EDNAPushX/EDNAPushX.h>
  1. Вставьте уникальный ключ приложения appId и инициализируйте библиотеку в методе AppDelegate applicationDidFinishLaunchingWithOptions. Ваш ключ appId будет находиться в блоке кода на шаге 4.2 интерактивной инструкции по настройке приложения.
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;
}
  1. Передайте в библиотеку системные вызовы в методах AppDelegate didRegisterForRemoteNotificationsWithDeviceToken и didReceiveRemoteNotification:
    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];
}
  1. Замените код основного класса Notification Service Extension на следующий:
   import UserNotifications
   import EDNAPushXNE

   class 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];
}
  1. Если пользователь нажмёт на область или кнопки уведомления, будет запущено приложение. Чтобы получить от библиотеки информацию о том, что приложение было запущено по нажатию на уведомление, в метод EDNAPushX.setOnPushAction передайте замыкание:
   EDNAPushX.setOnPushAction(block: { (action) in
            ...
        })
    [EDNAPushX setOnPushActionWithBlock:^(EDNAPushXAction *action) {
        ...
    }];

Метод EDNAPushX.setOnPushAction нужно вызвать до инициализации библиотеки — до вызова метода EDNAPushX.initWithLaunchOptions.

Шаг 6. Поддержите регистрацию устройств пользователей в сервисе edna

  1. Выберите тип регистрации устройства на платформе.

    Устройство пользователя появится в сервисе edna после регистрации. Сейчас доступен только автоматический способ регистрации. Скоро к нему будет добавлен ручной способ.
    • При автоматической регистрации библиотека edna самостоятельно регистрирует устройство в сервисе edna. Этот способ проще, не требует от вас управлять регистрацией, но не рекомендуется для отправки конфиденциальных данных.
    • После появления ручного способа ваш бэкенд сможет самостоятельно регистрировать устройство в сервисе edna через специальный метод API.
  2. Для регистрации пользователя в сервисе вызовите метод login библиотеки, укажите идентификатор пользователя и тип идентификатора SubscriberIdType.

Следует вызывать метод только после успешной авторизации пользователя в вашем приложении:

EDNAPushX.login(userIdType: .email, userId: "example@mail.com")
    [EDNAPushX loginWithUserIdType: EDNAPushXUserIdTypeEmail userId: @"example@mail.com"];

Доступны следующие виды SubscriberIdType:

  • Номер телефона (PhoneNumber)
  • Адрес электронной почты (Email)
  • Идентификаторы Facebook*, Телеграм, Гугл, Эпл, Яндекс (FacebookId*, TelegramId, GoogleId, AppleId, YandexId)
  • Внутренние идентификаторы пользователя (ExtUserId, CookieId)
  • UTM-метка (UTM)
  1. В момент деавторизации пользователя в приложении, вызовите метод logout библиотеки, чтобы отключить устройство пользователя в сервисе edna:
EDNAPushX.logout()
    [EDNAPushX logout];
* Деятельность компании Meta запрещена на территории Российской Федерации.

Шаг 7. Подключите Notification Content Extension

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

  2. Подключите библиотеку для расширения Notification Content Extension с помощью Swift Package Manager или CocoaPods.

    Подключение через Swift Package Manager:
https://github.com/edna-ru/push-x-ce-ios

Подключение через CocoaPods:

pod ednaPushXCE
  1. Замените код основного класса Notification Content Extension на следующий:
    import UIKit
    import UserNotifications
    import UserNotificationsUI
    import EDNAPushXCE

    class NotificationViewController: EDNAPushCEController{

    }
  1. Укажите название extension-категории ednaPushCategory в файле Info.plist расширения, в параметре NSExtension/NSExtensionAttributes/UNNotificationExtensionCategory.
    Уведомления, требующие расширенной вёрстки, будут отправлены с extension-категорией ednaPushCategory.
  2. В файле Info.plist в параметре edna_app_group для расширения Notification Content Extension укажите то же имя AppGroup, что и для приложения и расширения Notification Service Extension.
  3. Убедитесь, что для параметра NSExtension / NSExtensionAttributes / UNNotificationExtensionDefaultContentHidden указано значение YES (1). Данный параметр позволяет скрыть информацию из оригинального уведомления при отображении расширенного вида.

  4. Для расширения Notification Content Extension на вкладке Signing & Capabilities подключите тот же AppGroup, что и для приложения и расширения Notification Service Extension.

Перед загрузкой обновленной версии в магазин приложений не забудьте обновить декларацию о сборе данных.