Делегат 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(_:)
Если метод не реализован, 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 и т.д.).
Метод вызывается независимо от уровня 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 | — |
Связанные разделы
- Настройки инициализации SDK — назначение делегата через свойство
delegate - Сообщения и счётчик непрочитанных — метод
getUnreadMessagesCount - Настройки SDK — параметр
keepSocketActiveдля работыdidChangeUnreadMessagesв фоне