Skip to main content
Version: Next

Делегат SDK (ChatCenterUISDKDelegate)

ChatCenterUISDKDelegate — протокол для получения событий от SDK. Все методы имеют дефолтные пустые реализации, поэтому достаточно реализовать только те, которые нужны в вашем приложении.

Потокобезопасность

Методы делегата могут вызываться не на главном потоке. Если в обработчике вы обновляете UI, оберните вызов в DispatchQueue.main.async:

func chatCenterUI(chatCenter: ChatCenterUISDK, didChangeUnreadMessages count: Int) {
DispatchQueue.main.async {
self.updateBadge(count: count)
}
}

Подключение делегата

Назначьте делегат после инициализации SDK:

chatCenterSDK.delegate = self

Объявите соответствие протоколу в нужном классе:

extension MyViewController: ChatCenterUISDKDelegate {
// реализуйте нужные методы
}

Методы делегата

didChangeUnreadMessages

func chatCenterUI(chatCenter: ChatCenterUISDK, didChangeUnreadMessages count: Int)

Вызывается при изменении количества непрочитанных сообщений.

Когда вызывается:

  • При изменении счётчика непрочитанных, пока экран чата открыт — в том числе при получении новых сообщений и при отметке сообщений прочитанными.
  • Периодически по REST-запросу getUnreadMessagesCount, если задан ChatConfig.unreadMessageCountDelay > 0. Интервал между запросами определяется значением unreadMessageCountDelay в секундах. Полинг работает независимо от того, открыт ли экран чата.
  • Однократно со значением 0 при авторизации нового пользователя (другой identifier или токен). Повторная авторизация того же пользователя не триггерит этот вызов.

После authorize(user:) SDK автоматически подгружает историю чата — открытие экрана чата для этого не требуется. После deauthorizeUser делегат перестаёт получать обновления счётчика до следующей авторизации.

Параметры:

  • count: Количество непрочитанных сообщений. 0 означает отсутствие непрочитанных.
Обновление бейджа, когда чат закрыт

Пока экран чата не открыт, делегат не получает мгновенных обновлений на каждое входящее сообщение — счётчик доставляется по REST-полингу с интервалом unreadMessageCountDelay секунд. Если unreadMessageCountDelay не задан или равен 0, полинг не выполняется, и делегат не будет вызываться до следующего открытия чата.

Для гарантированного обновления бейджа в ключевых точках (выход приложения в foreground, получение пуша) дополнительно вызывайте getUnreadMessagesCount(completion:) из ChatCenterUISDK — это актуальный способ получить счётчик в любой момент.

Пример — обновление бейджа на кнопке чата:

func chatCenterUI(chatCenter: ChatCenterUISDK, didChangeUnreadMessages count: Int) {
DispatchQueue.main.async {
self.chatButton.badge = count > 0 ? "\(count)" : nil
}
}

didReceiveNetwork

func chatCenterUI(chatCenter: ChatCenterUISDK, didReceiveNetwork error: Error)

Вызывается при сетевой ошибке во время работы SDK.

Используется для:

  • Логирования ошибок в систему аналитики
  • Отображения пользователю статуса подключения
  • Диагностики проблем соединения

Пример:

func chatCenterUI(chatCenter: ChatCenterUISDK, didReceiveNetwork error: Error) {
Analytics.log("chat_network_error", parameters: ["error": error.localizedDescription])
}

didOpen url

func chatCenterUI(chatCenter: ChatCenterUISDK, didOpen url: URL) -> Bool

Вызывается перед открытием URL из сообщения чата (ссылки в тексте).

Возвращаемое значение:

  • true — ссылка обработана вашим приложением, SDK ничего не делает
  • false — SDK открывает URL через UIApplication.shared.open(_:)
note

Если метод не реализован, SDK открывает все ссылки через UIApplication.shared.open(_:).

Пример — перехват deeplink, внешние ссылки через SFSafariViewController:

import SafariServices

func chatCenterUI(chatCenter: ChatCenterUISDK, didOpen url: URL) -> Bool {
// Обработать внутренний deeplink приложения
if url.scheme == "myapp" {
DeepLinkRouter.handle(url)
return true
}
// Внешние ссылки открыть через Safari в приложении
let safariVC = SFSafariViewController(url: url)
present(safariVC, animated: true)
return true
}

didLog

func chatCenterUI(chatCenter: ChatCenterUISDK, didLog event: String)

Вызывается при каждом событии логирования SDK. Используется для передачи логов SDK в собственную систему (Firebase Crashlytics, Sentry, OSLog и т.д.).

note

Метод вызывается независимо от уровня ChatLoggerConfig.logLevel. Фильтрация уровней логирования остаётся на стороне вашего кода.

Пример:

func chatCenterUI(chatCenter: ChatCenterUISDK, didLog event: String) {
os_log("%{public}@", log: .default, type: .debug, event)
}

Сводная таблица методов

МетодКогда вызываетсяВозвращает
didChangeUnreadMessagesПри изменении счётчика непрочитанных (при открытом чате — на каждое изменение; при закрытом — с интервалом ChatConfig.unreadMessageCountDelay, если он задан)
didReceiveNetworkПри сетевой ошибке в SDK
didOpen urlПеред открытием URL из сообщения чатаBool (обработана?)
didLogПри каждом событии логирования SDK

Связанные разделы