Перейти к основному содержимому
Версия: 5.8.2

Уведомления

Для работы пуш‑уведомлений необходимо включить и настроить их отправку на нашем сервере. За подробной инструкцией напишите на support@edna.ru.

Передача токена

В SDK достаточно передать из приложения токен устройства:

Можно использовать до инициализации экземпляра ChatCenterUISDK

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
ChatCenterUISDK.setDeviceToken(deviceToken)
}

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

Если пуши в приложении ранее не использовались, необходимо предварительно настроить их в вашем аккаунте Apple и самом приложении.

примечание

Для работы didRegisterForRemoteNotificationsWithDeviceToken необходим запрос разрешений на получение уведомлений в приложении:

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, _ in
guard granted else {
return
}
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
}

Проверка пушей

Для определённых действий (например, переход по пушу в чат) может потребоваться метод для определения принадлежности пуша к ChatCenter:

static func isChatCenterNotification(_ userInfo: [String: Any]) -> Bool

Параметры:

  • userInfo: Словарь с информацией о Push-уведомлении от APNS.

Возвращает: Bool - true, если уведомление относится к ChatCenterUI SDK, иначе false.

Пример использования:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if let userInfo = userInfo as? [String: Any],
ChatCenterUISDK.isChatCenterNotification(userInfo) {
// Это уведомление от ChatCenterUI SDK, обрабатываем его
// ...
} else {
// Это другое уведомление
// ...
}
}

Сценарии обработки уведомлений

Поведение SDK зависит от состояния чата в момент получения пуша:

СценарийСостояние приложенияЧто использовать
Экран чата открытАктивноеhandleNotification(userInfo:)
Чат закрыт, пользователь авторизованАктивное / фонgetChat(userInfo:) + показать UIViewController
Приложение неактивноBackground / terminatedОбработать в didReceiveRemoteNotification, вызвать getChat(userInfo:) при выходе в foreground
Ошибка .chatNotOpened при вызове handleNotification

handleNotification(userInfo:) бросает ChatCenterUIError.chatNotOpened, если экран чата в данный момент не отображается. Это ожидаемое поведение, а не ошибка интеграции.

Правильная обработка:

do {
try chatCenterSDK?.handleNotification(userInfo: userInfo)
} catch ChatCenterUIError.chatNotOpened {
// Чат не открыт — открываем его с контекстом уведомления
openChatFromNotification(userInfo: userInfo)
} catch {
print("Ошибка обработки уведомления: \(error)")
}

Переход по уведомлению

handleNotification(userInfo:) используется в паре с getChat(userInfo:) для обработки пуша в зависимости от того, отображается ли экран чата. Если экран чата открыт — вызов завершится без ошибки; если нет — будет брошено ChatCenterUIError.chatNotOpened, по которому приложение переключается на getChat(userInfo:) для открытия чата (см. пример кода в разделе ниже).

func handleNotification(userInfo: [AnyHashable: Any]) throws(ChatCenterUIError)

Параметры:

  • userInfo: Словарь с информацией о Push-уведомлении.

Выбрасывает: ChatCenterUIError.chatNotOpened, если экран чата не отображается в данный момент.

Пример использования:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// Проверяем, является ли уведомление от ChatCenterUI SDK
if let userInfo = userInfo as? [String: Any],
ChatCenterUISDK.isChatCenterNotification(userInfo) {
do {
try chatCenterSDK?.handleNotification(userInfo: userInfo)
completionHandler(.newData)
} catch {
print("Ошибка при обработке уведомления: \(error)")
completionHandler(.failed)
}
} else {
// Обработка других уведомлений
completionHandler(.noData)
}
}

Открытие чата по пушу

Если при получении пуш-уведомления экран чата ещё не открыт, используйте getChat(userInfo:) — метод вернёт UIViewController чата, который приложение показывает через собственный навигационный стек. Для неавторизованного SDK метод бросит ChatCenterUIError.userNotAuthorized — перед открытием чата убедитесь, что вызван authorize(user:).

Параметр userInfo передаётся в SDK как контекст уведомления, по которому открывается чат. Поведение контекста определяется типом пуша, сконфигурированным на стороне edna:

  • Массовая рассылка edna (маркетинговая кампания): в поле ввода чата появится цитата уведомления, а следующее отправленное сообщение уйдёт в привязке к этой кампании.
  • Стандартный пуш о новом сообщении: чат откроется без дополнительных действий.
func openChatFromNotification(userInfo: [AnyHashable: Any]) {
guard let chatCenterSDK else { return }

let result = Result { try chatCenterSDK.getChat(userInfo: userInfo) }

switch result {
case let .success(chatController):
navigationController?.pushViewController(chatController, animated: true)
case let .failure(error):
print("Ошибка открытия чата: \(error)")
}
}
примечание

Если экран чата уже отображается, используйте handleNotification(userInfo:) — он не приведёт к повторному открытию чата и не выбросит .chatNotOpened.

Реплай на массовую рассылку не появился?

Если вы ожидали цитату уведомления в поле ввода чата, но её нет — обратитесь в поддержку edna для проверки настроек кампании и формата push-payload. Формирование payload для массовых рассылок происходит на стороне edna, а не в мобильном приложении.