Skip to main content
Version: Next

Сообщения и счётчик непрочитанных

Программная отправка сообщений

SDK позволяет отправлять сообщения в активный чат программно, без участия пользователя. Это полезно для автоматической отправки контекстных данных (например, информации о заказе или локации).

func send(message: ChatMessage) throws(ChatCenterUISendMessageError)

Параметры:

  • message: ChatMessage — модель сообщения для отправки.

Условия:

  • Пользователь авторизован через authorize(user:auth:)
  • WebSocket-соединение активно (чат открыт или keepSocketActive = true)

Выбрасывает: ChatCenterUISendMessageError

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

do {
// Отправка текстового сообщения
try chatCenterSDK.send(message: .text("Информация по заказу №12345"))
} catch {
print("Ошибка отправки: \(error)")
}

Типы сообщений (ChatMessage)

ТипОписаниеОграничения
.text(String)Текстовое сообщениеМаксимум 4000 символов
.image(UIImage)ИзображениеОграничение по размеру файла (настраивается на сервере)
.location(CGPoint)Локация пользователя (системное)Повторная отправка той же точки игнорируется

Примеры:

// Текст
try chatCenterSDK.send(message: .text("Здравствуйте"))

// Изображение
if let image = UIImage(named: "screenshot") {
try chatCenterSDK.send(message: .image(image))
}

// Локация
try chatCenterSDK.send(message: .location(CGPoint(x: 55.7558, y: 37.6173)))

Ошибки отправки (ChatCenterUISendMessageError)

ОшибкаОписаниеПричинаРекомендация
.userNotAuthorizedПользователь не авторизованauthorize() не был вызванВызовите authorize(user:) перед отправкой
.webSocketNotActiveWebSocket-соединение неактивноЧат закрыт, keepSocketActive = falseВключите keepSocketActive = true или отправляйте только пока чат открыт
.chatNotOpenedЧат не открытgetChat() не был вызванУбедитесь, что экран чата отображается
.messageNotSentНе удалось отправить сообщениеВременная ошибка сервераПовторите попытку через несколько секунд
.messageIsEmptyТекст сообщения пустойПередана пустая строкаПроверьте текст перед отправкой
.messageTooLongТекст превышает 4000 символовСлишком длинный текстОбрежьте сообщение до 4000 символов
.messageImageTooLargeИзображение превышает допустимый размерПревышен серверный лимитУменьшите разрешение изображения перед отправкой
.messageImageCompressionErrorОшибка сжатия изображенияНекорректный UIImageПроверьте корректность UIImage объекта

Связь .webSocketNotActive с keepSocketActive

По умолчанию WebSocket-соединение активно только пока открыт экран чата. Ошибка .webSocketNotActive при программной отправке означает, что соединение уже закрыто.

Решения:

  1. keepSocketActive = true — держать WebSocket активным всегда, пока пользователь авторизован
  2. keepSocketActiveDuringOperatorSession = true — держать соединение до закрытия диалога оператором
  3. Отправлять сообщения только пока экран чата открыт — если фоновая отправка не нужна

Подробнее о параметрах — в разделе Настройки SDK.


Счётчик непрочитанных сообщений

func getUnreadMessagesCount(completion: @escaping (Result<Int, Error>) -> Void) throws(ChatCenterUIError)

Запрашивает количество непрочитанных сообщений с сервера.

Выбрасывает: ChatCenterUIError.userNotAuthorized, если пользователь не авторизован.

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

do {
try chatCenterSDK.getUnreadMessagesCount { result in
switch result {
case let .success(count):
print("Непрочитанных: \(count)")
// Обновить бейдж на кнопке чата
case let .failure(error):
print("Ошибка получения счётчика: \(error)")
}
}
} catch {
print("Пользователь не авторизован: \(error)")
}
tip

Для автоматического обновления счётчика используйте ChatConfig.unreadMessageCountDelay (интервал в секундах) или подпишитесь на делегат ChatCenterUISDKDelegate.chatCenterUI(chatCenter:didChangeUnreadMessages:).


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