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

Справочник ошибок

Методы SDK выбрасывают два типа ошибок: ChatCenterUIError (работа с чатом) и ChatCenterUISendMessageError (отправка сообщений).

Ошибки чата (ChatCenterUIError)

Выбрасываются методами работы с чатом.

ОшибкаОписаниеПричинаРекомендация
.userNotAuthorizedПользователь не авторизованМетод вызван до authorize(user:) или после logout() / deauthorizeUser()Вызовите authorize(user:) перед использованием метода
.chatNotOpenedЭкран чата не открыт или пустой userInfohandleNotification(userInfo:) вызван, когда чат не отображается, либо словарь userInfo пустойЭто ожидаемое поведение. Используйте getChat(userInfo:) для открытия чата с контекстом уведомления. Подробнее — в разделе Уведомления

Какие методы выбрасывают ChatCenterUIError

МетодВозможные ошибки
getChat(userInfo:).userNotAuthorized
logout().userNotAuthorized
getUnreadMessagesCount(completion:).userNotAuthorized
handleNotification(userInfo:).chatNotOpened

Пример обработки

do {
let chatController = try chatCenterSDK.getChat()
navigationController?.pushViewController(chatController, animated: true)
} catch ChatCenterUIError.userNotAuthorized {
// Пользователь не авторизован — показать экран входа
showLoginScreen()
} catch {
print("Неожиданная ошибка: \(error)")
}
Проверка авторизации до вызова

В SDK нет публичного метода isAuthorized() или currentUser(). Состояние авторизации отслеживайте на стороне приложения: сохраняйте флаг при успешном authorize(user:) и сбрасывайте при logout() / deauthorizeUser(). Или ловите .userNotAuthorized через do/catch (см. пример выше).

do {
try chatCenterSDK.handleNotification(userInfo: userInfo)
} catch ChatCenterUIError.chatNotOpened {
// Чат не открыт — открыть с контекстом уведомления
do {
let chatController = try chatCenterSDK.getChat(userInfo: userInfo)
navigationController?.pushViewController(chatController, animated: true)
} catch {
print("Ошибка открытия чата: \(error)")
}
} catch {
print("Ошибка обработки уведомления: \(error)")
}

Ошибки отправки сообщений (ChatCenterUISendMessageError)

Выбрасываются методом send(message:).

ОшибкаОписаниеПричинаРекомендация
.userNotAuthorizedПользователь не авторизованauthorize() не вызванВызовите authorize(user:) перед отправкой
.webSocketNotActiveWebSocket-соединение неактивноЧат закрыт без keepSocketActive, нет сети, соединение ещё не установленоСм. варианты решения ниже
.messageIsEmptyТекст сообщения пустойПередана пустая строка в .text("")Проверьте текст перед отправкой
.messageTooLongТекст превышает 4000 символовСлишком длинное сообщениеОбрежьте сообщение до 4000 символов
.messageImageTooLargeРазмер JPEG превышает серверный лимит (по умолчанию 30 МБ)Лимит конфигурируется на стороне сервераУменьшите разрешение изображения перед отправкой
.messageImageCompressionErrorОшибка сжатия изображенияНекорректный или повреждённый UIImageПроверьте корректность объекта UIImage

send(message:) не выбрасывает .chatNotOpened и .messageNotSent — обрабатывать не нужно.

Пример обработки

do {
try chatCenterSDK.send(message: .text("Здравствуйте"))
} catch ChatCenterUISendMessageError.webSocketNotActive {
// WebSocket не активен — сохранить сообщение для отправки позже
pendingMessages.append(message)
} catch ChatCenterUISendMessageError.messageTooLong {
// Обрезать и повторить
let trimmed = String(text.prefix(4000))
try? chatCenterSDK.send(message: .text(trimmed))
} catch {
// Прочие ошибки валидации
print("Ошибка отправки: \(error)")
}
Транзиентные сетевые ошибки

Сетевые ошибки доставки не приходят как ChatCenterUISendMessageErrorsend(message:) проверяет только preconditions (авторизация, состояние WebSocket, валидность контента).

Для ошибок REST-слоя (включая upload файлов) используйте ChatCenterUISDKDelegate.chatCenterUI(chatCenter:didReceiveNetwork:) — см. Делегат SDK.

Разрывы и ошибки WebSocket через этот делегатный callback не приходят. Статус WebSocket отслеживайте через send(message:) — он бросает .webSocketNotActive при неактивном канале. Чтобы канал оставался активным вне экрана чата, включите keepSocketActive (Настройки чата).


Связь .webSocketNotActive с keepSocketActive

По умолчанию WebSocket-соединение активно только пока открыт экран чата. Отправка через send(message:) без открытого чата завершится ошибкой .webSocketNotActive.

Варианты решения

ПодходНастройкаКогда использовать
Постоянное соединениеchatConfig.keepSocketActive = trueФоновая отправка, счётчик непрочитанных
Соединение на время сессииchatConfig.keepSocketActiveDuringOperatorSession = trueУведомления в рамках активного диалога
Отправка только в чатеБез дополнительных настроекЕсли фоновая отправка не нужна
Локальные флаги планируется удалить

В будущих версиях SDK keepSocketActive и keepSocketActiveDuringOperatorSession будут заменены серверным channelConfig (запрашивается у технической поддержки edna). Для нового кода выбирайте серверный путь.

Локальные значения работают только при chatConfig.shouldUseRemoteConfig = false. По умолчанию (true) серверный конфиг их переопределяет. Подробнее — в Настройках SDK.


Диагностика ошибок

Включите логирование при инициализации SDK:

let loggerConfig = ChatLoggerConfig(logLevel: .all)
let chatCenterSDK = ChatCenterUISDK(providerUid: "...",
chatConfig: chatConfig,
loggerConfig: loggerConfig)

Подробнее — в Настройках логирования.

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