Подключение пушей iOS

На странице Настройки > Каналы выберите существующий или создайте новый канал, в котором хотите разместить приложение. Вы можете объединить в одном канале приложения, пользователям которых хотите отправлять пуши в рамках одной рассылки.

Перед тем как продолжить, убедитесь, что располагаете всем необходимым. Вам понадобятся:

Приложение iOS с минимальной поддерживаемой версией не ниже iOS 10.
Устройство iOS (iPhone, iPad, iPod Touch) для тестирования. Симулятор Xcode не поддерживает пуш-уведомления, поэтому тестируйте на физическом устройстве
Компьютер Мас с последней версией Xcode
Пуш-сертификат Production Apple Push Certificate
Утилита CocoaPods или Swift Package Manager

Описанные далее процессы предполагают, что вы завершили шаги, описанные в статье Создание канала пуш-уведомлений.

1. Создайте 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 введите идентификатор приложения Bundle ID.
  5. Прикрепите файл production пуш-сертификата в формате .p12 и введите пароль от него.

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

2. Создайте расширение 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.

3. Подключите библиотеки edna к проекту

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

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

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

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

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

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

  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"
          // 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";
    // 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.

5. Поддержите регистрацию устройств пользователей в сервисе 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];

* Деятельность сети запрещена на территории РФ

6. Подключите 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-io/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. Убедитесь, что для параметра NSExtension / NSExtensionAttributes / UNNotificationExtensionDefaultContentHidden указано значение YES (1). Данный параметр позволяет скрыть информацию из оригинального уведомления при отображении расширенного вида.

Создание канала пуш-уведомлений
Cледующая статья Подключение пушей Андроид