Справочник ошибок
Методы SDK выбрасывают два типа ошибок: ChatCenterUIError (работа с чатом) и ChatCenterUISendMessageError (отправка сообщений).
Ошибки чата (ChatCenterUIError)
Выбрасываются методами работы с чатом.
| Ошибка | Описание | Причина | Рекомендация |
|---|---|---|---|
.userNotAuthorized | Пользователь не авторизован | Метод вызван до authorize(user:) или после logout() / deauthorizeUser() | Вызовите authorize(user:) перед использованием метода |
.chatNotOpened | Экран чата не открыт или пустой userInfo | handleNotification(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:) перед отправкой |
.webSocketNotActive | WebSocket-соединение неактивно | Чат закрыт без 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)")
}
Сетевые ошибки доставки не приходят как ChatCenterUISendMessageError — send(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)
Подробнее — в Настройках логирования.
Связанные разделы
- Настройки SDK — параметры
keepSocketActiveи другие - Настройки логирования — включение логов для отладки
- Сообщить об ошибке — как подготовить отчёт для поддержки
- Сообщения и счётчик непрочитанных — программная отправка и получение сообщений