Сообщения и счётчик непрочитанных
Программная отправка сообщений
Метод send(message:) отправляет сообщение в активный чат без участия пользователя — например, контекст заказа или текущую локацию.
func send(message: ChatMessage) throws(ChatCenterUISendMessageError)
Параметры:
message:ChatMessage— модель сообщения для отправки.
Выбрасывает: ChatCenterUISendMessageError — см. Справочник ошибок.
Пример использования:
do {
// Отправка текстового сообщения
try chatCenterSDK.send(message: .text("Информация по заказу №12345"))
} catch {
print("Ошибка отправки: \(error)")
}
Типы сообщений (ChatMessage)
| Тип | Описание | Ограничения |
|---|---|---|
.text(String) | Текстовое сообщение | Максимум 4000 символов |
.image(UIImage) | Изображение | Ограничение по размеру файла (настраивается на сервере) |
.location(CGPoint) | Локация пользователя (системное) | Повторная отправка той же точки игнорируется. x — широта, y — долгота. Семантика согласована с серверной стороной edna; SDK сам по себе не интерпретирует значения. |
Примеры:
do {
// Текст
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)))
} catch {
print("Ошибка отправки: \(error)")
}
Длинные текстовые сообщения
.messageTooLong бросается при попытке отправки текста длиннее 4000 символов. На стороне приложения предусмотрите:
-
Pre-flight проверку перед
send— обрезать или попросить пользователя сократить:let maxLength = 4000
func sendUserText(_ text: String) {
guard text.count <= maxLength else {
showAlert("Сообщение длиннее \(maxLength) символов — сократите текст или разбейте на несколько")
return
}
do {
try chatCenterSDK.send(message: .text(text))
} catch {
handleSendError(error)
}
} -
Разбивка на части — если разбиение допустимо для UX, делите по границам предложений, а не посимвольно. Каждая часть отправляется отдельным
send(message:)и приходит к оператору самостоятельным сообщением — ни SDK, ни сервер не склеивают части и не добавляют маркировку «1/N».
В UI экрана чата SDK сам обрезает ввод длиннее 4000 символов с iOS 5.6.0 (см. Инструкции по миграции) — но для программной отправки через send(message:) ограничение должен соблюдать клиентский код.
Ошибки отправки
send(message:) выбрасывает ChatCenterUISendMessageError. Полный список кейсов, рекомендации по обработке и пример с catch — в Справочнике ошибок.
Управление поведением WebSocket (когда возможна .webSocketNotActive) — см. Настройки SDK.
Счётчик непрочитанных сообщений
func getUnreadMessagesCount(completion: @escaping (Result<Int, Error>) -> Void) throws(ChatCenterUIError)
Запрашивает количество непрочитанных сообщений с сервера.
Выбрасывает: ChatCenterUIError.userNotAuthorized, если пользователь не авторизован.
Пример использования:
do {
try chatCenterSDK.getUnreadMessagesCount { [weak self] result in
switch result {
case let .success(count):
// chatButton — UI-элемент родительского приложения
self?.chatButton.badge = count > 0 ? "\(count)" : nil
case let .failure(error):
print("Ошибка получения счётчика: \(error)")
}
}
} catch {
print("Пользователь не авторизован: \(error)")
}
Для автоматического обновления счётчика используйте ChatConfig.unreadMessageCountDelay (Int, секунды; 0 — отключено) или подпишитесь на делегат ChatCenterUISDKDelegate.chatCenterUI(chatCenter:didChangeUnreadMessages:).
Связанные разделы
- Делегат SDK — получение событий об изменении счётчика
- Настройки SDK — параметры
keepSocketActiveиunreadMessageCountDelay - Справочник ошибок — ошибки
ChatCenterUISendMessageError - Управление пользователем — авторизация перед отправкой