# Справочник по Webim Mobile SDK v4 для iOS-приложений

Редакция соответствует актуальной версии **Mobile SDK 4** для **iOS**.

!!! Note "N.B."
    Ответы на наиболее часто встречающиеся вопросы приведены в [этой статье](https://webim.ru/kb/mobile/sdk/v-3-0/recommendations-of-usage.html).

!!! Note "Ограничения поддержки"
    Описание в этом справочнике относится к нативным iOS/Android-приложениям. Использование в *Flutter/React Native* и *WebView/PWA* не поддерживается.

!!! Note "N.B."
    При использовании **Webim Mobile SDK** без готового виджета отображение и обработка ссылок в интерфейсе чата выполняются на стороне приложения.

## Класс `Webim` { #webim }

Набор статических методов, которые используются при создании объекта сессии и для работы в push-уведомлениями, поступающими от сервиса **Webim**

### Метод класса `newSessionBuilder()` { #new-session-builder }

Метод, необходимый для получения объекта [`SessionBuilder`](#session-builder), который в свою очередь необходим для создания экземпляра класса [`WebimSession`](#webim-session)

### Метод класса `parse(remoteNotification:visitorId:)` { #parse-remote-notification }

Метод, используемый для конвертирования объекта, представляющего push-уведомление в iOS-приложение, в объект класса [`WebimRemoteNotification`](#webim-remote-notification).

Параметр `remoteNotification` — словарь типа `[AnyHashable: Any]` (такой же тип словаря передаётся в метод `application(_:didReceiveRemoteNotification:)` в параметр `userInfo` в классе `AppDelegate` iOS-приложения). В параметр необходимо передать значение параметра `userInfo`, упомянутого выше метода класса `AppDelegate` в не измененном виде.

Возвращает объект класса [`WebimRemoteNotification`](#webim-remote-notification) или `nil`, если значение параметра `remoteNotification` не соответствует формату push-уведомления, получаемого от сервиса **Webim**, или уведомление не содержит полезной нагрузки.

В качестве предварительной проверки, является ли параметр `remoteNotification` push-уведомлением, полученным от сервиса **Webim**, может быть вызван метод [`isWebim(remoteNotification:)`](#is-webim-remote-notification).

### Метод класса `isWebim(remoteNotification:)` { #is-webim-remote-notification }

Метод, позволяющий узнать, является ли объект, представляющий push-уведомление в iOS-приложении, push-уведомлением, полученным от сервиса **Webim**.

Параметр `remoteNotification` — словарь типа `[AnyHashable: Any]` (такой же тип словаря передаётся в метод `application(_:didReceiveRemoteNotification:)` в параметр `userInfo` в классе `AppDelegate` iOS-приложения). В параметр необходимо передать значение параметра `userInfo`, упомянутого выше метода класса `AppDelegate` в не измененном виде.

Возвращает булево значение: `true` — если значение параметра `remoteNotification` является полученным push-уведомлением от сервиса **Webim**, `false` — если не является.

---

## Перечисляемый тип `RemoteNotificationSystem` { #remote-notification-system }

Системы push-уведомлений, которые могут быть переданы в качестве параметра метода экземпляра [`SessionBuilder`](#session-builder)[`set(remoteNotificationSystem:)`](#set-remote-notification-system).

### Случай `apns` { #apns }

Соответствует **Apple Push Notification System**.

### Случай `fcm` { #fcm }

**Firebase Cloud Messaging**. Вариант для сценария, когда push-уведомления от **Webim** доставляются на устройство через FCM. Как и для [`apns`](#apns), при значении, отличном от [`none`](#none), для успешного вызова [`build()`](#build) нужно передать токен устройства методом [`set(deviceToken:)`](#set-device-token).

### Случай `none` { #none }

Соответствует ситуации, когда приложению не требуется получать push-уведомления от сервиса **Webim**.

---

## Класс `SessionBuilder` { #session-builder }

Класс, экземпляр которого используется для получения экземпляра класса [`WebimSession`](#webim-session). Экземпляр класса получается методом [`newSessionBuilder()`](#new-session-builder) класса [`Webim`](#webim).

### Метод экземпляра `set(notFatalErrorHandler:)`

Метод, с помощью которого можно установить объект, подчиняющийся протоколу [`NotFatalErrorHandler`](#not-fatal-error-handler), который будет ответственен за обработку ошибок при создании экземпляра сессии, которые могут быть вызваны сервисом **Webim**.

Параметр `notFatalErrorHandler` — любой класс, реализующий протокол [`NotFatalErrorHandler`](#not-fatal-error-handler).

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным объектом `NotFatalErrorHandler`. Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным.

### Метод экземпляра `set(accountName:)` { #set-account-name}

Метод необходим для задания названия аккаунта в системе **Webim** при создании сессии.

Параметр `accountName` — название аккаунта клиента в системе **Webim**. Обычно представляет из себя URL сервера (например, `https://companyname.webim.ru`), но может иметь и вид названия аккаунта одним словом (например, `demo`), если сервер находится в домене `webim.ru`. Тип параметра — `String`.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным названием аккаунта.

Для получения экземпляра [`WebimSession`](#webim-session) вызов метода является обязательным.

### Метод экземпляра `set(location:)` { #set-location }

Метод необходим для задания изначально используемой локации при создании сессии.

Параметр `location` — локация внутри сервиса **Webim**, которая будет использоваться при чате. Тип параметра — `String`. Скорее всего, сразу же можно использовать значения `mobile` и/или `default`. Для создания и дальнейшего использования дополнительных локаций необходимо связаться со службой поддержки сервиса **Webim**.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным названием используемой локации.

Для получения экземпляра [`WebimSession`](#webim-session) вызов метода является обязательным.

### Метод экземпляра `set(appVersion:)` { #set-app-version }

Метод используется для задания версии клиентского приложения, если их необходимо различать в контексте сервиса **Webim**.

Параметр `appVersion` — версия клиентского приложения или `nil`. Тип параметра — опциональный `String`.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленной версией клиентского приложения, если параметр `appVersion` не `nil`, и не измененный экземпляр класса [`SessionBuilder`](#session-builder), если параметр `appVersion — nil`.

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным.

### Метод экземпляра `set(visitorFieldsJSONString:)` { #set-visitor-fields-json-string-json-string }

Метод используется для внутренней авторизации посетителя.

Без вызова этого метода при создании объекта сессии, пользователь будет анонимным, со случайным образом сгенерированным ID. Этот ID сохраняется в настройках приложения, и в случае потери этих настроек (например, при переустановке приложения), все данные (история сообщений) будут потеряны.

Все данные авторизованного пользователя сохраняются и будут доступны при авторизации с любого устройства.

Параметр `jsonString` — поля авторизационных данных пользователя в `JSON`-формате, тип — `String`. Подробную информацию об этих полях (включая, какие из них являются обязательными, и как необходимо их формировать) можно почерпнуть в [этой статье](https://webim.ru/kb/dev/identification/id-2-0.html).

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленными авторизационными данными посетителя.

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным.

Данный метод не может быть вызван одновременно с методом [`set(providedAuthorizationTokenStateListener:providedAuthorizationToken:)`](#set-provided-authorization-token-state-listener-provided-authorization-token).

### Метод экземпляра `set(visitorFieldsJSONData jsonData:)` { #set-visitor-fields-json-data-json-data }

Метод, полностью аналогичный методу [`set(visitorFieldsJSONString:)`](#set-visitor-fields-json-string-json-string) за исключением параметра: параметр `jsonData` имеет тип `Data` (приведенный от `JSON`-формата). Какой из двух методов использовать не имеет значения.

### Метод экземпляра `set(providedAuthorizationTokenStateListener:providedAuthorizationToken:)` { #set-provided-authorization-token-state-listener-provided-authorization-token }

Когда клиентское приложение предоставляет свой собственный механизм авторизации посетителя, это может быть реализовано с помощью передачи особого токена вместо посетительских полей.

Данный метод передает объект протокола [`ProvidedAuthorizationTokenStateListener`](#provided-authorization-token-state-listener) и токен. Токен передавать не обязательно: если опустить второй параметр, токен будет сгенерирован библиотекой.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленными объектом [`ProvidedAuthorizationTokenStateListener`](#provided-authorization-token-state-listener) и токеном клиентской системы авторизации посетителя.

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным.

Данный метод не может быть вызван одновременно с методами [`set(visitorFieldsJSONString:)`](#set-visitor-fields-json-string-json-string) или [`set(visitorFieldsJSONData:)`](#set-visitor-fields-json-data-json-data).

### Метод экземпляра `set(pageTitle:)` { #set-page-title }

Метод, с помощью которого можно установить заголовок чата со стороны оператора при создании экземпляра сессии. В случае, если при создании экземпляра сессии метод не был вызван, заголовок примет значение по умолчанию — `iOS Client`.

Параметр `pageTitle` — заголовок чата со стороны оператора. Тип параметра — `String`.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным заголовком чата со стороны оператора.

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным.

### Метод экземпляра `set(fatalErrorHandler:)`

Метод, с помощью которого можно установить объект, подчиняющийся протоколу [`FatalErrorHandler`](#fatal-error-handler), который будет ответственен за обработку ошибок при создании экземпляра сессии, которые могут быть вызваны сервисом **Webim**.

Параметр `fatalErrorHandler` — опциональный; любой класс, подчиняющийся протоколу [`FatalErrorHandler`](#fatal-error-handler), или `nil`, если методы протокола [`FatalErrorHandler`](#fatal-error-handler) в приложении использоваться не будут.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным объектом [`FatalErrorHandler`](#fatal-error-handler).

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным.

### Метод экземпляра `set(remoteNotificationSystem:)` { #set-remote-notification-system }

Метод, с помощью которого при создании сессии можно указать, будет ли приложение получать push-уведомления от сервиса **Webim** и, если будет, какую систему push-уведомлений приложение будет для этого использовать. (См. перечисляемый тип [`RemoteNotificationSystem`](#remote-notification-system) в классе [`Webim`](#webim).)

Параметр `remoteNotificationSystem` — соответствующее значение типа [`RemoteNotificationSystem`](#remote-notification-system) класса [`Webim`](#webim).

Требует предварительно полученного экземпляра класса [`SessionBuilder`](#session-builder). В случае, если данный метод вызывается, и значение параметра remoteNotificationSystem отлично от [`none`](#none), при создании экземпляра сессии вызов метода [`set(deviceToken:)`](#set-device-token) является обязательным.

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным. Если при создании сессии метод вызван не был, сервис **Webim** не будет высылать приложению push-уведомления (аналогично, как при значении параметра `remoteNotificationSystem` [`none`](#none)).

### Метод экземпляра `set(deviceToken:)` { #set-device-token }

Метод, с помощью которого при создании сессии можно указать токен устройства для получения приложением push-уведомлений от сервиса **Webim**.

Параметр `deviceToken` — токен устройства, использующийся для получения push-уведомлений в приложении. Тип — опциональный `String` в шестнадцатеричном формате, без служебных символов и пробелов.

Пример приведения значения токена устройства к нужному виду из значения в формате `Data`, получаемом методом `application(_:,didRegisterForRemoteNotificationsWithDeviceToken:)` класса `AppDelegate` приложения:

```
let deviceToken = deviceToken.map { String(format: «%02.2hhx», $0) }.joined()
```

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным значением токена устройства.

Для получения приложением push-уведомлений сервиса **Webim**, вызов данного метода не является достаточным: необходим также вызов метода [`set(remoteNotificationSystem:)`](#set-remote-notification-system).

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным.

### Метод экземпляра `set(isLocalHistoryStoragingEnabled:)` { #set-is-local-history-storaging-enabled }

По умолчанию сессия сохраняет на устройстве историю сообщений (в SQLite-хранилище, связанном с приложением). Если для каких-либо целей необходимо отключить данный функционал, используется этот метод со значением параметра `isLocalHistoryStoragingEnabled` `false`.

Параметр `isLocalHistoryStoragingEnabled` — булева переменная, означающая необходимость хранения истории сообщений локально (значение `true`) или ее (необходимости) отсутствие (значение `false`).

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным вручную значением соответствующей опции.

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным. Отсутствие вызова метода аналогично его вызову со значением параметра `isLocalHistoryStoragingEnabled` `true`.

### Метод экземпляра `set(isVisitorDataClearingEnabled:)` { #set-is-visitor-data-clearing-enabled }

Метод, используемый для удаления всех существующих пользовательских данных во время создания экземпляра сессии.

Параметр `isVisitorDataClearingEnabled` — булева переменная, означающая необходимость очистить пользовательские данные (значение `true`) или ее (необходимости) отсутствие (значение `false`).

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным вручную значением соответствующей опции.

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным. Отсутствие вызова метода аналогично его вызову со значением параметра `isVisitorDataClearingEnabled false`.

Для получения экземпляра класса [`WebimSession`](#webim-session) вызов метода не является обязательным

### Метод экземпляра `set(webimLogger:verbosityLevel:availableLogTypes:)` { #set-webim-logger }

Метод, с помощью которого передаётся объект [`WebimLogger`](#webim-logger).

Параметр `verbosityLevel` — значение [`WebimLoggerVerbosityLevel`](#webim-logger-verbosity-level) (может быть опущен).

Параметр `availableLogTypes` – значение [`WebimLogType`](#webim-log-type) (может быть опущен).

### Метод экземпляра `build()` { #build }

Метод, который вызывается в заключение перечисленных выше методов для получения экземпляра [`WebimSession`](#webim-session).

Возвращает объект [`WebimSession`](#webim-session) с установленными параметрами с помощью остальных методов экземпляра класса.

Может выбрасывать ошибки типа [`SessionBuilderError`](#session-builder-error).

Требует вызова методов [`set(accountName:)`](#set-account-name) и [`set(location:)`](#set-location) (в любом порядке). Также предварительно могут быть вызваны и любые другие (в любом порядке и сочетании) методы экземпляра класса [`SessionBuilder`](#session-builder).

### Метод класса `set(multivisitorSection:)`

Метод используется для получения уведомлений для разных посетителей на одном устройстве.

Параметр `multivisitorSection` — `String`.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным вручную значением соответствующей опции.

### Метод класса `set(webimAlert:)`

Метод используется для показа предупреждений о стандартных ошибках.

Параметр `webimALert` — предупреждение, тип — [`WebimAlert`](#webim-alert).

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder), но с установленным туда значением соответствующей опции.

### Метод `set(mobileChatInstance:)`

Метод используется для установки новой сессии внутри мобильного приложения.

Параметр `mobileChatInstance` — `String`.

Значение по умолчанию — `default`.

Если вы не установите этот параметр и попытаетесь создать новую сессию внутри мобильного приложения, вы получите ту же сессию.

Возвращает тот же экземпляр класса `SessionBuilder`, но с установленным вручную значением соответствующей опции.

### Метод экземпляра `set(requestHeader:)` { #set-request-header }

Метод, с помощью которого можно задать дополнительные HTTP-заголовки для запросов SDK к серверу **Webim** (например, для маршрутизации запросов в вашей инфраструктуре или передачи идентификаторов сценария). Конкретный набор допустимых заголовков определяется конфигурацией **Webim Server**.

Параметр `requestHeader` — словарь заголовков. Тип параметра — `[String: String]`.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder).

!!! Note "N.B."
    Механизм не следует путать с авторизацией посетителя: для неё по-прежнему используются [`set(visitorFieldsJSONString:)`](#set-visitor-fields-json-string-json-string), [`set(visitorFieldsJSONData:)`](#set-visitor-fields-json-data-json-data) или [`set(providedAuthorizationTokenStateListener:providedAuthorizationToken:)`](#set-provided-authorization-token-state-listener-provided-authorization-token).

### Метод экземпляра `set(isLightModeEnabled:)` { #set-is-light-mode-enabled }

Включает так называемый **облегчённый режим** сессии: не запускается полный цикл обработки исходящих действий (`ActionRequestLoop`), остаётся упрощённый обмен с сервером через `DeltaRequestLoop`. Режим предназначен для отладки, снижения нагрузки и сценариев, в которых не требуется отправка сообщений и файлов через полноценный канал действий, но нужны, например, опрос состояния и получение счётчика непрочитанных через [`InfoListener`](#info-listener).

Параметр `isLightModeEnabled` — `true`, чтобы включить облегчённый режим.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder).

!!! Warning "Внимание!"
    При `isLightModeEnabled == true` часть возможностей сессии (отправка сообщений и файлов, связанная с `ActionRequestLoop`) недоступна. Используйте обычный режим для полноценного чата.

### Метод экземпляра `set(infoListener:)` { #set-info-listener }

Устанавливает объект протокола [`InfoListener`](#info-listener), который в облегчённом режиме получает актуальное **число непрочитанных сообщений** посетителя с сервера (после запросов `get_info`), без необходимости поднимать полноценную сессию чата. Требуется поддержка со стороны **Webim Server**.

Параметр `infoListener` — объект, реализующий [`InfoListener`](#info-listener), или `nil`.

Возвращает тот же экземпляр класса [`SessionBuilder`](#session-builder).

---

## Протокол `InfoListener` { #info-listener }

Обработчик обновления счётчика непрочитанных сообщений в сценарии с [`set(isLightModeEnabled:)`](#set-is-light-mode-enabled) и [`set(infoListener:)`](#set-info-listener).

!!! Note "N.B."
    Механизм не следует путать с [`UnreadByVisitorMessageCountChangeListener`](#unread-by-visitor-message-count-change-listener): последний работает в уже открытом чате в полноценной сессии, а `InfoListener` — в режиме лёгкого клиента при опросе сервера.

### Метод `update(newMessageCount:)`

Вызывается SDK, когда с сервера получено новое значение числа непрочитанных сообщений для текущего посетителя.

Параметр `newMessageCount` — целое число непрочитанных сообщений. Тип — `Int`.

---

## Перечисляемый тип `WebimLogType` { #webim-log-type }

Возможные типы логов. Используется в методе [`set(webimLogger:verbosityLevel:availableLogTypes:)`](#set-webim-logger).

### Случай `networkRequest`

Логи, связанные с сетевыми запросами.

### Случай `messageHistory`

Логи, связанные с историей сообщений.

### Случай `manualCall`

Логи, связанные с ручным вызовом методов.

### Случай `undefined`

Неопределенный тип.

---

## Перечисляемый тип `FileState`

Используется для определения состояния файла.

### Случай `error`

Возникает, когда при загрузке файла произошла ошибка.

### Случай `ready`

Возникает, файл загружен.

### Случай `upload`

Возникает, файл загружается.

### Случай `externalChecks`

Файл проверяется сервером.


### Случай `externalVerification`

Файл проверяется верификатором.

---

## Перечисляемый тип `EditMessageError` { #edit-message-error }

Возможные ошибки, которые могут быть переданы в параметр `error` при вызове метода [`EditMessageCompletionHandler.onFailure(messageID:error:)`](#edit-message-completion-handler-on-failure).

### Случай `unknown`

Неизвестная ошибка.

### Случай `notAllowed`

На сервере отключена возможность редактирования сообщений.

### Случай `messageEmpty`

Редактируемое сообщение пустое.

### Случай `messageNotOwned`

Посетитель может редактировать только свои сообщения. Указанный идентификатор принадлежит другому сообщению.

### Случай `maxLengthExceeded`

Сервер может отклонить запрос, если размер сообщения превышает ограничение. Максимальный размер сообщения настраивается на сервере.

### Случай `wrongMesageKind`

Посетитель может редактировать только текстовые сообщения.

В публичном API Swift у этого варианта имя с опечаткой: **`wrongMesageKind`** (не *Message*).

---

## Перечисляемый тип `WebimLoggerVerbosityLevel` { #webim-logger-verbosity-level }

Определяет степень информативности передаваемых в объект [`WebimLogger`](#webim-logger) записей.

### Случай `verbose`

Вся доступная информация будет передана объекту [`WebimLogger`](#webim-logger) с максимальным уровнем информативности:

  * параметры настройки сетевых соединений;

  * URL, HTTP-методы и параметры сетевых запросов;

  * HTTP-коды, полученные данные и ошибки ответов на сетевые запросы;

  * SQL-запросы и ошибки, возникающие при этих запросах;

  * полная информация, которая может быть полезна при отладке, и дополнительные заметки.

### Случай `debug`

Вся необходимая информация для диагностики будет передана объекту [`WebimLogger`](#webim-logger) с необходимым уровнем информативности:

  * параметры настройки сетевых соединений;

  * URL, HTTP-методы и параметры сетевых запросов;

  * HTTP-коды, полученные данные и ошибки ответов на сетевые запросы;

  * SQL-запросы и ошибки, возникающие при этих запросах;

  * полная информация, которая может быть полезна при отладке с умеренным уровнем информативности.

### Случай `info`

Объекту [`WebimLogger`](#webim-logger) будет передана справочная информация, а также все предупреждения и ошибки:

  * URL, HTTP-методы и параметры сетевых запросов;

  * HTTP-коды, полученные данные и ошибки ответов на сетевые запросы;

  * SQL-запросы и ошибки, возникающие при этих запросах.

### Случай `warning`

Объекту [`WebimLogger`](#webim-logger) будут переданы только предупреждения и ошибки:

  * HTTP-коды, полученные данные и ошибки ответов на сетевые запросы;

  * SQL-запросы и ошибки, возникающие при этих запросах.

### Случай `error`

Объекту [`WebimLogger`](#webim-logger) будут переданы только ошибки:

  * HTTP-коды и ошибки ответов на сетевые запросы, которые не закончились успехом.

---

## Перечисляемый тип `SessionBuilderError` { #session-builder-error }

Значение типа соответствуют возможным ошибкам, которые могут возникнуть при вызове метода [`build()`](#build) класса [`SessionBuilder`](#session-builder).

### Случай `invalidAuthentificatorParameters`

Возникает, когда при создании сессии была произведена попытка использовать одновременно стандартную (см. методы [`set(visitorFieldsJSONString:)`](#set-visitor-fields-json-string-json-string) и [`set(visitorFieldsJSONData:)`](#set-visitor-fields-json-data-json-data)) и собственную (см. метод [`set(providedAuthorizationTokenStateListener:providedAuthorizationToken:)`](#set-provided-authorization-token-state-listener-provided-authorization-token)) системы авторизации посетителя.

### Случай `invalidRemoteNotificationConfiguration`

Возникает, когда при создании сессии задана неверная конфигурация push: для получения уведомлений от **Webim** выбрана система, отличная от [`none`](#none) (например [`apns`](#apns) или [`fcm`](#fcm); см. метод [`set(remoteNotificationSystem:)`](#set-remote-notification-system) класса [`SessionBuilder`](#session-builder)), но не передан токен устройства (или передан `nil`) — см. метод [`set(deviceToken:)`](#set-device-token) класса [`SessionBuilder`](#session-builder).

### Случай `nilAccountName`

Возникает, когда при создании сессии не было передано значение названия аккаунта (или это значение `nil`).

### Случай `nilLocation`

Возникает, когда при создании сессии не было передано значение названия локации (или это значение `nil`).

### Случай `invalidHex`

Возникает, когда передаётся недействительная строка в `HEX`-формате.

### Случай `unknown`

Неизвестная ошибка.

---

## Перечисляемый тип `ButtonState` { #button-state }

Используется для определения состояния кнопки.

### Случай `showing`

Кнопка отображается.

### Случай `showingSelected`

Кнопка выбрана.

### Случай `hidden`

Кнопка скрыта.

---

## Перечисляемый тип `ButtonType` { #button-type }

Используется для определения типа кнопки.

### Случай `url`

Кнопка содержит ссылку, по которой перебросит посетителя при нажатии на кнопку.

### Случай `insert`

Кнопка содержит текст, который отправится от лица посетителя при нажатии на кнопку.

---

## Протокол `Configuration` { #configuration }

Протокол является абстракцией, представляющей информацию о конфигурации кнопок клавиатуры чат-бота.

### Метод `isActive()`

Метод, с помощью которого может быть получена информация активна кнопка или нет.

Возвращает `true`, если активна, и `false`, если нет. Тип — `Bool`.

### Метод `getButtonType()`

Метод, с помощью которого может быть получена информация о типе кнопки.

Возвращает тип кнопки. Тип — [`ButtonType`](#button-type).

### Метод `getData()`

Метод, с помощью которого может быть получена информация о кнопке.

Возвращает информацию о кнопке. Тип — `String`.

### Метод `getState()`

Метод, с помощью которого может быть получена информация состоянии кнопки.

Возвращает информацию о состоянии кнопки. Тип - [`ButtonState`](#button-state).

### Метод `getHideAfter()`

Метод используется для получения информации о том, нужно ли скрывать **кнопку** после ответа посетителя (см. комментарий в SDK: hide button after response).

Возвращает опциональный `Bool` (`Bool?`).

### Метод `isEqual(to:)`

Сравнивает текущий объект `Configuration` с другим.

Параметр `to` — объект для сравнения. Тип — `Configuration`.

Возвращает `Bool`: `true`, если объекты совпадают, и `false`, если нет.

---

## Протокол `FileInfo` { #file-info }

Содержит информацию о вложениях.

### Метод `getContentType()`

Метод, с помощью которого может быть получен `MIME`-тип вложения.

Возвращает `MIME`-тип вложения в текстовом виде или `nil`. Тип — опциональный `String`.

### Метод `getFileName()`

Метод, с помощью которого может быть получено имя файла вложения.

Возвращает имя файла вложения в текстовом виде или `nil`. Тип — `String`.

### Метод `getImageInfo()`

Метод, с помощью которого может быть получена информация о изображении, если вложение им является.

Возвращает объект [`ImageInfo`](#image-info) или `nil`, если вложенный файл не является изображением.

### Метод `getSize()`

Метод, с помощью которого может быть получен размер файла вложения.

Возвращает размер файла вложения в байтах или `nil`. Тип — опциональный `Int64`.

### Метод `getURL()`

Метод, с помощью которого может быть получена ссылка для скачивания файла вложения. Ссылка действительна только для текущей сессии.

Возвращает URL  файла вложения или `nil`.

### Метод `getGuid()`

Метод, с помощью которого может быть получен `guid` файла вложения.
Возвращает значение в текстовом виде. Тип — `String`.

### Метод `isEqual(to:)`

Сравнивает текущий объект `FileInfo` с другим.

Параметр `to` — объект для сравнения. Тип — `FileInfo`.

Возвращает `Bool`: `true`, если объекты совпадают, и `false`, если нет.

---

## Протокол `Keyboard` { #keyboard }

Протокол является абстракцией, предоставляющей элементы клавиатуры чат-бота.

### Метод `getButtons()`

Метод, с помощью которого может быть получен список кнопок элемента клавиатуры.

Возвращает список кнопок. Тип — [`KeyboardButton`](#keyboard-button).

### Метод `getState()` { #keyboard-get-state }

Метод, с помощью которого может быть получено состояние клавиатуры.

Возвращает состояние клавиатуры. Тип — [`KeyboardState`](#keyboard-state).

### Метод `getKeyboardResponse()`

Метод, с помощью которого может быть получена кнопка, выбранная пользователем.

Возвращает кнопку, выбранную пользователем. Тип — опциональный [`KeyboardResponse`](#keyboard-response).

### Метод `isEqual(to:)`

Сравнивает текущий объект `Keyboard` с другим.

Параметр `to` — объект для сравнения. Тип — `Keyboard`.

Возвращает `Bool`: `true`, если объекты совпадают, и `false`, если нет.

---

## Протокол `KeyboardButton` { #keyboard-button }

Протокол является абстракцией, представляющей информацию о кнопках клавиатуры чат-бота.

### Метод `getId()`

Метод, с помощью которого может быть получен уникальный ID кнопки в клавиатуре чат-бота.

Возвращает ID в текстовом виде. Тип — `String`. ID кнопки может содержать только латинские буквы, цифры, символы дефиса и нижнего подчёркивания и должен быть не более 24 символов в длину. ID кнопки, генерируемый на стороне **Webim**, имеет формат `UUID4`, а ID, генерируемый извне (в т.ч. сторонними ботами), только проверяется на соответствие данным выше критериям.


### Метод `isEqual(to:)`

С помощью данного метода можно сравнить объект `KeyboardButton` с другим, передаваемым в параметрах.

Параметр `to` — объект для сравнения. Тип — `KeyboardButton`.

Возвращает `Bool`. `true`, если объекты идентичны, и `false`, если нет.

### Метод `getText()`

Метод, с помощью которого может быть получен текст кнопки в клавиатуре чат-бота.

Возвращает название кнопки в текстовом виде. Тип — `String`.

### Метод `getConfiguration()`

Метод, с помощью которого может быть получена конфигурация кнопки в клавиатуре чат-бота. Тип — опциональный [`Configuration`](#configuration).

### Метод `isEqual(to:)`

Сравнивает текущий объект `KeyboardButton` с другим.

Параметр `to` — объект для сравнения. Тип — `KeyboardButton`.

Возвращает `Bool`: `true`, если объекты совпадают, и `false`, если нет.

---

## Протокол `KeyboardRequest` { #keyboard-request }

Протокол является абстракцией, представляющей информацию о выбранной кнопке в клавиатуре чат-бота.

### Метод `getButton()`

Метод, с помощью которого может быть получена выбранная кнопка элемента клавиатуры.

Возвращает объект [`KeyboardButton`](#keyboard-button).

### Метод `getMessageId()`

Метод, с помощью которого может быть получен ID сообщения, в котором была выбрана кнопка.

Возвращает название ID сообщения в текстовом виде. Тип — `String`.

### Метод `isEqual(to:)`

С помощью данного метода можно сравнить объект `KeyboardRequest` с другим, передаваемым в параметрах.

Параметр `to` — объект для сравнения. Тип — `KeyboardRequest`.

Возвращает `Bool`. `true`, если объекты идентичны, и `false`, если нет.

---

## Протокол `KeyboardResponse` { #keyboard-response }

Протокол является абстракцией, представляющей информацию о выбранной кнопке в клавиатуре чат-бота.

### Метод `getButtonId()`

Метод, с помощью которого может быть получен уникальный ID выбранной кнопки в клавиатуре чат-бота.

Возвращает ID в текстовом виде. Тип — `String`.

### Метод `getMessageId()`

Метод, с помощью которого может быть получен ID сообщения, в котором была выбрана кнопка.

Возвращает название ID сообщения в текстовом виде. Тип — `String`.

### Метод `isEqual(to:)`

С помощью данного метода можно сравнить объект `KeyboardResponse` с другим, передаваемым в параметрах.

Параметр `to` — объект для сравнения. Тип — `KeyboardResponse`.

Возвращает `Bool`. `true`, если объекты идентичны, и `false`, если нет.

---

## Протокол `NotFatalErrorHandler` { #not-fatal-error-handler }

Протокол, который предоставляет методы для обработки некритических ошибок, которые могут возникать в работе сервиса **Webim**.

### Метод `on(error:)` { #not-fatal-error-handler-on-error }

Вызывается при возникновении некритической ошибки сервиса **Webim**.

Параметр `error` — ошибка сервиса **Webim**. Тип — [`WebimNotFatalError`](#webim-not-fatal-error).

!!! Warning "Внимание!"
    Данный метод вызывается не из главного потока!

### Метод `connectionStateChanged(connected:)`

Вызывается при возникновении ошибки соединения сервиса **Webim**.

!!! Warning "Внимание!"
    Данный метод вызывается не из главного потока!

---

## Протокол `Quote` { #quote }

Протокол является абстракцией, представляющей информацию о цитируемом сообщении.

### Метод `getAuthorId()`

С помощью этого метода можно получить ID автора цитируемого сообщения.

Возвращает ID сообщения. Тип — опциональный `String`.

### Метод `getMessageAttachment()`

С помощью этого метода можно получить вложение, если это файл, отправленный посетителем или оператором (`fileFromOperator` или `fileFromVisitor`).

Возвращает информацию о вложении. Тип — опциональный [`FileInfo`](#file-info).

### Метод `getMessageTimestamp()`

С помощью этого метода можно получить время отправки сообщения.

Возвращает количество миллисекунд, прошедших с начала эпохи до обработки сообщения сервером. Тип — опциональный ``Date``.

### Метод `getMessageId()`

С помощью этого метода можно получить уникальный ID цитируемого сообщения.

Возвращает ID сообщения. Тип — опциональный `String`.

### Метод `getMessageText()`

С помощью этого метода можно получить текст сообщения.

Возвращает текст сообщения. Тип — опциональный `String`.

### Метод `getMessageType()`

С помощью этого метода можно получить тип цитируемого сообщения.

Возвращает опциональное значение перечисляемого типа [`MessageType`](#message-type).

### Метод `getSenderName()`

С помощью этого метода можно получить имя отправителя сообщения.

Возвращает имя отправителя сообщения. Тип — опциональный `String`.

### Метод `getState()`

С помощью этого метода можно получить статус цитаты.

Возвращает значение перечисляемого типа [`QuoteState`](#quote-state).

---

## Перечисляемый тип `QuoteState` { #quote-state }

Используется для определения состояния цитируемого сообщения.

### Случай `pending`

Возникает, когда цитата загружается.

### Случай `filled`

Возникает, когда цитата загружена.

### Случай `notFound`

Возникает, когда цитируемое сообщение не найдено на сервере.

---

## Перечисляемый тип `NotFatalErrorType` { #not-fatal-error-type }

Соответствует значениям возможных некритичных ошибок, которые могут возникать в работе сервиса **Webim** (см. метод [`getErrorType()`](#webim-not-fatal-error-get-error-type) протокола [`WebimNotFatalError`](#webim-not-fatal-error)).

### Случай `noNetworkConnection`

Эта ошибка указывает на отсутствие сетевого подключения.

### Случай `serverIsNotAvailable`

Эта ошибка возникает, когда сервер недоступен.

Неизвестная ошибка.

## Перечисляемый тип `KeyboardResponseError` { #keyboard-response-error }

Возможные ошибки, которые могут быть переданы в параметр `error` при вызове метода `KeyboardResponseCompletionHandler.onFailure(error:)`.

### Случай `unknown`

Неизвестная ошибка.

### Случай `noChat`

Кнопка из клавиатуры чат-бота отправлена не в тот чат.

### Случай `buttonIdNotSet`

Не установлен идентификатор кнопки.

### Случай `requestMessageIdNotSet`

Не установлен идентификатор сообщения запроса.

### Случай `canNotCreateResponse`

Невозможно создать ответ.

---

## Перечисляемый тип `KeyboardState` { #keyboard-state }

Используется для определения состояния клавиатуры чат-бота (см. метод [`getState()`](#keyboard-get-state) протокола [`Keyboard`](#keyboard)).

### Случай `pending`

Клавиатура ожидает ответа посетителя, кнопки можно нажимать.

### Случай `completed`

Получен ответ по клавиатуре; клавиатура неактивна.

### Случай `canceled`

Клавиатура снята без ответа (в коде SDK используется написание **`canceled`**).

---

## Протокол `EditMessageCompletionHandler` { #edit-message-completion-handler }

Объект, реализующий данный протокол, может быть передан в параметр `completionHandler` метода [`edit(message:text:completionHandler:)`](#message-stream-edit-message-text-completion-handler) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess(messageID:)`

Вызывается при успешном результате вызова метода [`edit(message:text:completionHandler:)`](#message-stream-edit-message-text-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `messageID` — ID соответствующего сообщения. Тип — `String`.

### Метод `onFailure(messageID:error:)` { #edit-message-completion-handler-on-failure }

Вызывается при неуспешном результате вызова метода [`edit(message:text:completionHandler:)`](#message-stream-edit-message-text-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `messageID` — ID соответствующего сообщения. Тип — `String`.

Параметр `error` — ошибка, воспрепятствовавшая успешному редактированию сообщения. Тип — [`EditMessageError`](#edit-message-error).

---

## Протокол `ProvidedAuthorizationTokenStateListener` { #provided-authorization-token-state-listener }

Если клиент предоставляет собственный механизм авторизации посетителя, это может быть реализовано с помощью передачи специального токена, который используется вместо посетительских полей (см. методы [`set(visitorFieldsJSONString:)`](#set-visitor-fields-json-string-json-string) и [`set(visitorFieldsJSONData:)`](#set-visitor-fields-json-data-json-data)). В момент генерации (или получения переданного значения) этого токена, вызывается метод `update(providedAuthorizationToken:)`. Это означает, что сервис клиента должен передать данный токен в сервис **Webim**.

Данный механизм — это не самодостаточная реализация. Клиентский сервис должен поддерживать и реализовывать методы передачи токена и данных посетителя в сервис **Webim**.

### Метод экземпляра `update(providedAuthorizationToken:)`

Метод вызывается в двух случаях:

  1. Токен клиентского механизма авторизации передан или сгенерирован и требуется его отправка в сервис **Webim** силами клиента.

  1. От сервиса **Webim** получена информация о том, что используемый токен ему неизвестен. Это может случиться, например, если токен не был отправлен сервису **Webim** сервисом клиента или не был получен сервисом **Webim**. В этом случае сервису **Webim** необходимо предоставить токен и соответствующие ему данные посетителя.

---

## Протокол `WebimSession` { #webim-session }

Протокол, позволяющий производить манипуляции с текущей сессией. Экземпляр класса [`WebimSession`](#webim-session) получается с помощью методов класса [`SessionBuilder`](#session-builder).

### Метод экземпляра `resume()` { #resume }

При создании экземпляра класса [`WebimSession`](#webim-session), соответствующая ему сессия находится в приостановленном состоянии. Данный метод необходим для того, чтобы стартовать сетевую активность сессии.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Необходим для полноценного функционирования сервиса в контексте приложения.

В результате ответа сервера могут быть вызваны различные методы [`MessageListener`](#message-listener), [`ChatStateListener`](#chat-state-listener), [`CurrentOperatorChangeListener`](#current-operator-change-listener) и [`LocationSettingsChangeListener`](#location-settings-change-listener).

### Метод экземпляра `pause()` { #pause }

Метод, который используется для приостановки сетевой активности сессии. Если сессия уже находится в приостановленном состоянии, метод не производит никаких действий.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Для вызова метода сессия не должна находиться в деактивированном состоянии.

### Метод экземпляра `destroy()` { #destroy }

Метод, который используется для деактивации сессии и экземпляра класса. После вызова данного метода, никакие методы, относящиеся к сессии использованы быть не могут.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

### Метод экземпляра `getStream()` { #get-stream }

Метод, который необходимо вызвать для получения соответствующего сессии экземпляра [`MessageStream`](#message-stream).

Для полноценного использования методов протокола [`MessageStream`](#message-stream) сессия не должна быть приостановлена или деактивирована (см. методы [`resume()`](#resume), [`pause()`](#pause) и [`destroy()`](#destroy)).

### Метод экземпляра `set(deviceToken:)` { #webim-session-set-device-token }

Метод используется для установки токена устройства для получения push-уведомлений.

Параметр `deviceToken` — токен устройства, использующийся для получения push-уведомлений в приложении. Тип — опциональный `String` в шестнадцатеричном формате, без служебных символов и пробелов.

Пример приведения значения токена устройства к нужному виду из значения в формате `Data`, получаемом методом `application(_:didRegisterForRemoteNotificationsWithDeviceToken:)` класса `AppDelegate` приложения:

```
let deviceToken = deviceToken.map { String(format: «%02.2hhx», $0) }.joined()
```

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Для вызова метода сессия не должна находиться с приостановленном или деактивированном состоянии (см. методы [`resume()`](#resume), [`pause()`](#pause) и [`destroy()`](#destroy)).

### Метод `destroyWithClearVisitorData()`

Метод, который используется для деактивации сессии и экземпляра класса с удалением информации о пользователе. После вызова данного метода, никакие методы, относящиеся к сессии использованы быть не могут.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

### Метод экземпляра `setRequestHeader(key:value:)`

Метод, с помощью которого можно установить заголовок запроса после создания сессии.  
Параметр `key` — ключ заголовка. Тип параметра — `String`.  
Параметр `value` — значение заголовка. Тип параметра — `String`.  

Возвращает тот же экземпляр класса `SessionBuilder`, но с установленным заголовком.

Для получения экземпляра класса `WebimSession` вызов метода не является обязательным.

---

## Протокол `MessageData` { #message-data }

Содержит прикреплённый к сообщению файл.

### Метод `getAttachment()` { #get-attachment }
С помощью этого метода можно получить вложение, если это файл, отправленный посетителем или оператором (типы `MessageType` `fileFromOperator` или `fileFromVisitor`).

Возвращает экземпляр класса [`MessageAttachment`](#message-attachment) или `nil`, если файл находится в процессе отправки.

### Метод `isEqual(to:)`

С помощью данного метода можно сравнить объект `MessageData` с другим, передаваемым в параметрах.

Параметр `to` — объект для сравнения. Тип — `MessageData`.

Возвращает `Bool`: `true`, если объекты идентичны, и `false` — если нет.

---

## Протокол `MessageStream` { #message-stream }

Экземпляр класса, с помощью которого вызываются методы протокола, в рамках сессии существует только один и получается с помощью метода [`getStream()`](#get-stream) экземпляра класса [`WebimSession`](#webim-session). Методы протокола используются непосредственно для взаимодействия с сервисом **Webim** (таких как отправка и получение сообщений). Для использования методов протокола необходимо, чтобы сессия не находилась в приостановленном или деактивированном виде (см. методы [`resume()`](#resume), [`pause()`](#pause) и [`destroy()`](#destroy) класса [`WebimSession`](#webim-session)).


### Метод `getForms()` { #get-forms }

Метод, с помощью которого можно получить список форм текущего опроса.

Возвращает `[SurveyForm]`.


### Метод `send(message:completionHandler:)` { #message-stream-send-message-completion-handler }

Соответствует методу [`send(message:isHintQuestion:)`](#send-message-is-hint-question) с опущенным параметром `isHintQuestion`.

Параметр `completionHandler` — объект, реализующий методы протокола [`SendMessageCompletionHandler`](#send-message-completion-handler). Тип опциональный.

### Метод `sendKeyboardRequest(button:message:completionHandler:)` { #message-stream-send-keyboard-request-button-message-completion-handler }

Метод используется для отправки выбранного элемента в клавиатуре чат-бота в сервис **Webim**.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Параметр `button` — элемент в клавиатуре чат-бота. Тип — [`KeyboardButton`](#keyboard-button).

Параметр `message` — сообщение. Тип — `Message`.

Параметр `completionHandler` — объект, реализующий методы протокола [`SendKeyboardRequestCompletionHandler`](#send-keyboard-request-completion-handler). Тип опциональный.

### Метод `sendKeyboardRequest(buttonID:messageCurrentChatID:completionHandler:)`

Метод используется для отправки выбранного элемента в клавиатуре чат-бота в сервис **Webim**.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Параметр `buttonID` — ID элемента в клавиатуре чат-бота. Тип — `String`.

Параметр `messageCurrentChatID` — ID запрашиваемого сообщения. Тип — `Message`.

Параметр `completionHandler` — объект, реализующий методы протокола [`SendKeyboardRequestCompletionHandler`](#send-keyboard-request-completion-handler). Тип опциональный.

### Метод `reply(message:repliedMessage:)`

Метод используется для цитирования сообщения посетителя в сервис **Webim**.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Параметр `message` — отправляемое сообщение. Тип — `String`.

Параметр `repliedMessage` — цитируемое сообщение. Тип — `Message`.

Возвращает ID сообщения или `nil`, если сообщение не может быть цитировано.

Не требует предварительного вызова никаких других методов. Если существуют объекты [`MessageTracker`](#message-tracker) и [`MessageListener`](#message-listener), отправка сообщения вызовет метод [`added(message:after:)`](#added-message-new-message-after-previous-message) протокола [`MessageListener`](#message-listener) с новым сообщением со статусом `MessageSendStatus.sent`.

Максимальная длина сообщения 32000 символов. Сообщения длиннее будут обрезаться.

### Метод `edit(message:text:completionHandler:)` { #message-stream-edit-message-text-completion-handler }

Метод используется для изменения сообщения.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Параметр `message` — изменяемое сообщение. Тип — `Message`.

Параметр `text` — текст сообщения. Тип — `String`.

Параметр `completionHandler` — объект, реализующий методы протокола [`EditMessageCompletionHandler`](#edit-message-completion-handler). Тип опциональный.

Возвращает `true`, если сообщение можно редактировать.

Не требует предварительного вызова никаких других методов. Если существуют объекты [`MessageTracker`](#message-tracker) и [`MessageListener`](#message-listener), отправка сообщения вызовет метод [`changed(oldVersion:newVersion:)`](#changed-message-old-version-to-new-version) протокола [`MessageListener`](#message-listener) с новым сообщением со статусом `MessageSendStatus.sent`.

Максимальная длина сообщения 32000 символов. Сообщения длиннее будут обрезаться.

### Метод `delete(message:completionHandler:)` { #message-stream-delete-message-completion-handler }

Метод для удаления сообщения.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Параметр `message` — удаляемое сообщение. Тип — `Message`.

Параметр `completionHandler` — объект, реализующий методы протокола [`DeleteMessageCompletionHandler`](#delete-message-completion-handler). Тип опциональный.

Возвращает `true`, если сообщение может быть удалено.

Не требует предварительного вызова никаких других методов. Если существуют объекты [`MessageTracker`](#message-tracker) и [`MessageListener`](#message-listener), отправка сообщения вызовет метод [`removed(message:)`](#removed-message) протокола [`MessageListener`](#message-listener) с новым сообщением со статусом `MessageSendStatus.sent`.

Максимальная длина сообщения 32000 символов. Сообщения длиннее будут обрезаться.

### Метод `setChatRead()`

Метод отправляет сигнал сервису **Webim**, что посетитель прочитал чат.

### Метод `setChatRead(before:)` { #set-chat-read-before }

Метод отправляет сигнал сервису **Webim**, что посетитель прочитал чат до указанного сообщения включительно.

Параметр `message` — опорное сообщение, до которого чат считается прочитанным. Тип — [`Message`](#message).

### Метод `sendDialogTo(emailAddress:completionHandler:)` { #message-stream-send-dialog-to-emailaddress-completion-handler }

Метод используется для отправки текущего диалога на Email адрес.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Параметр `emailAddress` — Email для отправки. Тип — `String`.

Параметр `completionHandler` — объект, реализующий методы протокола [`SendDialogToEmailAddressCompletionHandler`](#send-dialog-to-email-address-completion-handler). Тип опциональный.

### Метод `getVisitSessionState()`

Возвращает текущее состояние сессии значением типа [`VisitSessionState`](#visit-session-state).

### Метод `getChatState()` { #get-chat-state }

Метод с помощью, которого можно уточнить состояние текущего чата.

Возвращает значение перечислимого типа [`ChatState`](#chat-state).

### Метод `getUnreadByOperatorTimestamp()` { #get-unread-by-operator-timestamp }

Возвращает момент времени (типа ``Date``), после которого все сообщения чата являются непрочитанными оператором (на момент полученного от сервера обновления).

### Метод `getUnreadByVisitorMessageCount()` { #get-unread-by-visitor-message-count }

Возвращает количество непрочитанных сообщений пользователем.

### Метод `getUnreadByVisitorTimestamp()` { #get-unread-by-visitor-timestamp }

Возвращает момент времени (типа `Date`), после которого все сообщения чата являются непрочитанными посетителем (на момент полученного от сервера обновления) или `nil`, если непрочитанных сообщений нет.

### Метод `getDepartmentList()` { #get-department-list }

Возвращает список отделов массивом объектов типа [`Department`](#department) или `nil`, если отделы не используются или список отделов пока не был получен.

### Метод `getLocationSettings()` { #get-location-settings }

Каждая локация может обладать индивидуальными настройками. С помощью текущего метода можно получить объект, представляющий текущие настройки локации.

Возвращает объект класса [`LocationSettings`](#location-settings), соответствующий текущей сессии.

### Метод `getCurrentOperator()` { #get-current-operator }

С помощью этого метода можно уточнить информацию об актуальном операторе (если он есть) текущего чата.

Возвращает объект класса [`Operator`](#protocol-operator) или `nil`, если у чата в данный момент нет оператора.

### Метод `getVisitor()` { #get-visitor }

Возвращает сведения о текущем посетителе. Тип — опциональный объект протокола [`Visitor`](#visitor).

### Метод `getChatLanguage()`

Возвращает код языка текущего диалога (если известен серверу). Тип — опциональный `String`.

### Метод `getLastRatingOfOperatorWith(id:)`

С помощью этого метода можно уточнить текущий рейтинг (в целых числах от 0 до 5) оператора, зная ID этого оператора (см. метод [`getID()`](#operator-get-id) протокола [`Operator`](#protocol-operator)).

Параметр `id` — ID оператора, рейтинг которого должен вернуть метод. Тип — `String`.

Возвращает рейтинг оператора с ID, соответствующему значению параметра `id`, в целых числах от 1 до 5 или 0, если рейтинг у оператора отсутствует.

### Метод `rateOperatorWith(id:rating:completionHandler:)` { #rate-operator-with-id-by-rating-rating }

С помощью этого метода можно отправить оценку оператора текущего посетителя.

Параметр `id` — ID оператора, оценку которого необходимо отправить сервису **Webim**. Тип — `String`. Опциональный: если передать `nil`, будет отправлена оценка текущему оператору чата (если есть).

Параметр `rating` — оценка оператора, которую необходимо отправить сервису **Webim**. Оценка должна быть целым числом от 1 до 5 (при указании иного, метод не произведет никаких действий). Тип — `Int`.

Параметр `completionHandler` — объект [`RateOperatorCompletionHandler`](#rate-operator-completion-handler).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

!!! Warning "Внимание!"
    Реализация механизма оценки оператора остаётся за разработчиками мобильного приложения!

### Метод `startChat()` { #start-chat }

Метод начинает чат. В терминах сервиса **Webim** меняет у текущего чата состояние, представленное типом [`ChatState`](#chat-state), на [`queue`](#queue).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

При отправке сообщения или файла пользователем, чат начинается автоматически, поэтому вызов метода не является обязательным. Но, если настройки аккаунта предусматривают приветственные сообщения, до начала чата (методами серии `startChat` или с первым сообщением) приветственные сообщения получены не будут.

В результате может быть вызван метод [`changed(state previousState:to newState:)`](#changed-state-previous-state-to-new-state) протокола [`ChatStateListener`](#chat-state-listener).

### Метод `startChat(departmentKey:)` { #start-chat-department-key }

Метод начинает чат с указанием определенного отдела. В терминах сервиса **Webim** меняет у текущего чата состояние, представленное типом [`ChatState`](#chat-state), на [`queue`](#queue).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

При отправке сообщения или файла пользователем, чат начинается автоматически, но если текущее состояние сессии — [`departmentSelection`](#department-selection), чат необходимо начать именно с помощью данного метода.

При отправке сообщения или файла пользователем, чат начинается автоматически, поэтому вызов метода не является обязательным.

Если настройки аккаунта предусматривают приветственные сообщения, до начала чата (методами серии `startChat` или с первым сообщением) приветственные сообщения получены не будут.

В параметр `departmentKey` передаётся значение ключа отдела, которое может быть получено методом [`getKey()`](#get-key) протокола [`Department`](#department).

В результате может быть вызван метод [`changed(state previousState:to newState:)`](#changed-state-previous-state-to-new-state) протокола [`ChatStateListener`](#chat-state-listener).

### Метод `startChat(firstQuestion:)` { #start-chat-first-question }

Метод начинает чат и одновременно посылает первое сообщение посетителя. В терминах сервиса **Webim** меняет у текущего чата состояние, представленное типом [`ChatState`](#chat-state), на [`queue`](#queue).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

При отправке сообщения или файла пользователем, чат начинается автоматически, поэтому вызов метода не является обязательным. Но, если настройки аккаунта предусматривают приветственные сообщения, до начала чата (методами серии `startChat` или с первым сообщением) приветственные сообщения получены не будут.

В результате может быть вызван метод [`changed(state previousState:to newState:)`](#changed-state-previous-state-to-new-state) протокола [`ChatStateListener`](#chat-state-listener).

### Метод `startChat(departmentKey:firstQuestion:)`

Метод начинает чат с указанием определенного отдела и одновременно посылает первое сообщение посетителя. В терминах сервиса **Webim** меняет у текущего чата состояние, представленное типом [`ChatState`](#chat-state), на [`queue`](#queue).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

При отправке сообщения или файла пользователем, чат начинается автоматически, но если текущее состояние сессии — [`departmentSelection`](#department-selection), чат необходимо начать именно с помощью данного метода.

Если настройки аккаунта предусматривают приветственные сообщения, до начала чата (методами серии `startChat` или с первым сообщением) приветственные сообщения получены не будут.

В параметр `departmentKey` передаётся значение ключа отдела, которое может быть получено методом [`getKey()`](#get-key) протокола [`Department`](#department).

В результате может быть вызван метод [`changed(state previousState:to newState:)`](#changed-state-previous-state-to-new-state) протокола [`ChatStateListener`](#chat-state-listener).

### Метод `startChat(customFields:)`

Метод начинает чат с указанными дополнительными полями. В терминах сервиса **Webim** меняет у текущего чата состояние, представленное типом `ChatState`, на `queue`.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Параметр `customFields` — дополнительные поля в формате `JSON`. Тип — опциональный `String`.

В результате может быть вызван метод [`changed(state previousState:to newState:)`](#changed-state-previous-state-to-new-state) протокола [`ChatStateListener`](#chat-state-listener).

### Метод `startChat(firstQuestion:customFields:)`

Метод начинает чат с указанными дополнительными полями и одновременно посылает первое сообщение посетителя. В терминах сервиса **Webim** меняет у текущего чата состояние, представленное типом `ChatState`, на `queue`.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Если настройки аккаунта предусматривают приветственные сообщения, до начала чата (методами серии `startChat` или с первым сообщением) приветственные сообщения получены не будут.

Параметр `firstQuestion` — первое сообщение пользователя. Тип — опциональный `String`.

Параметр `customFields` — дополнительные поля в формате `JSON`. Тип — опциональный `String`.

В результате может быть вызван метод [`changed(state previousState:to newState:)`](#changed-state-previous-state-to-new-state) протокола [`ChatStateListener`](#chat-state-listener).

### Метод `startChat(departmentKey:customFields:)`

Метод начинает чат с указанием определенного отдела и указанными дополнительными полями. В терминах сервиса **Webim** меняет у текущего чата состояние, представленное типом `ChatState`, на `queue`.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

При отправке сообщения или файла пользователем, чат начинается автоматически, но если текущее состояние `VisitSessionState` `departmentSelection`, чат необходимо начать именно с помощью данного метода.

В параметр `departmentKey` передаётся значение ключа отдела, которое может быть получено методом [`getKey()`](#get-key) протокола [`Department`](#department).

Параметр `customFields` — дополнительные поля в формате `JSON`. Тип — опциональный `String`.

В результате может быть вызван метод [`changed(state previousState:to newState:)`](#changed-state-previous-state-to-new-state) протокола [`ChatStateListener`](#chat-state-listener).

### Метод `startChat(departmentKey:firstQuestion:customFields:)`

Метод начинает чат с указанием определенного отдела и указанными дополнительными полями, а также одновременно посылает первое сообщение посетителя. В терминах сервиса **Webim** меняет у текущего чата состояние, представленное типом `ChatState`, на `queue`.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

При отправке сообщения или файла пользователем, чат начинается автоматически, но если текущее состояние `VisitSessionState` `departmentSelection`, чат необходимо начать именно с помощью данного метода.

В параметр `departmentKey` передаётся значение ключа отдела, которое может быть получено методом [`getKey()`](#get-key) протокола [`Department`](#department).

Если настройки аккаунта предусматривают приветственные сообщения, до начала чата (методами серии `startChat` или с первым сообщением) приветственные сообщения получены не будут.

Параметр `firstQuestion` — первое сообщение пользователя. Тип — опциональный `String`.

Параметр `customFields` — дополнительные поля в формате `JSON`. Тип — опциональный `String`.

В результате может быть вызван метод [`changed(state previousState:to newState:)`](#changed-state-previous-state-to-new-state) протокола [`ChatStateListener`](#chat-state-listener).


### Метод `forceStartChat(departmentKey:)` { #force-start-chat }

Принудительно начинает чат. Параметр `departmentKey` — ключ отдела (см. [`getKey()`](#get-key) у [`Department`](#department)); при передаче `nil` поведение соответствует сценарию без выбора отдела.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

### Метод `sendContacts(contacts:completionHandler:)` { #message-stream-send-contacts }

Отправляет на сервер контактные данные посетителя (строка в ожидаемом сервером формате).

Параметр `contacts` — контактные данные. Тип — `String`.

Параметр `completionHandler` — объект протокола [`ContactsCompletionHandler`](#contacts-completion-handler). Тип опциональный.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

### Метод `closeChat()` { #close-chat }

Метод отправляет сигнал сервису **Webim**, что посетитель закончил чат. В терминах сервиса **Webim** меняет у текущего чата состояние, представленное типом [`ChatState`](#chat-state), на **`closedByVisitor`**.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

В результате может быть вызван метод [`changed(state previousState:to newState:)`](#changed-state-previous-state-to-new-state) протокола [`ChatStateListener`](#chat-state-listener).

### Метод `set(sessionLanguageListener:)` { #set-session-language-listener }

Устанавливает наблюдателя за языком сессии (см. [`SessionLanguageListener`](#session-language-listener)).

Параметр `sessionLanguageListener` — объект, реализующий протокол `SessionLanguageListener`.

### Метод `set(forceOnline:)`

Задаёт принудительный онлайн-режим: при `true` чат ведёт себя как онлайн; при `false` может использоваться сценарий с формой офлайн-сообщения (в зависимости от настроек сервера).

Параметр `forceOnline` — `Bool`.

### Метод `sendOfflineMessage(message:fields:file:fileName:mimeType:completionHandler:)` { #message-stream-send-offline-message }

Отправляет офлайн-сообщение (например, когда операторы заняты): текст, дополнительные поля в `JSON` и при необходимости файл.

Параметр `message` — текст. Тип — `String`.

Параметр `fields` — пользовательские поля в формате `JSON`. Тип — `String`.

Параметр `file` — данные файла. Тип — опциональный `Data`.

Параметр `fileName` — имя с расширением. Тип — опциональный `String`.

Параметр `mimeType` — MIME-тип. Тип — опциональный `String`.

Параметр `completionHandler` — объект [`OfflineMessageCompletionHandler`](#offline-message-completion-handler). Тип опциональный.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

!!! attention
    Метод требует поддержки на стороне **Webim Server** и корректной конфигурации сценария.

### Метод `setVisitorTyping(draftMessage:)`

Метод используется для отправки сигнала сервису **Webim**, что посетитель вводит сообщение (или прекратил его (сообщения) ввод).

При последовательном многократном вызове метода, черновик отправляется сервису **Webim** не с такой же частотой, а не чаще, чем один раз в секунду.

Параметр `draftMessage` — сообщение, которое уже ввёл посетитель в соответствующее поле, но не отправил его. Тип — опциональный `String`, Значение параметра `nil` соответствует ситуации, когда посетитель прекратил ввод сообщения либо стёр написанное из поля ввода.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

### Метод `send(message:isHintQuestion:)` { #send-message-is-hint-question }

Метод используется для отправки сообщения посетителя в сервис **Webim**.

Параметр `message` — отправляемое сообщение. Тип — `String`.

Максимальная длина сообщения — 32000 символов. Более длинные сообщения будут обрезаны сервером при их получении.

Параметр `isHintQuestion` используется, если приложение обладает собственным механизмом показа подсказок пользователю. Тип — опциональный `Bool`. В случае, если посетитель не ввёл сообщение вручную, а выбрал одну из предлагаемых подсказок, значение параметра должно быть `true`, и `false` — в обратном случае. Параметр не обязательный для использования и может быть опущен.

Возвращает ID, сгенерированный случайным образом для данного сообщения, который может быть использован для идентификации данного конкретного сообщения внутри логики приложения. Тип — `String`.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Если существуют объекты [`MessageTracker`](#message-tracker) и [`MessageListener`](#message-listener), отправка сообщения вызовет метод [`added(message:after:)`](#added-message-new-message-after-previous-message) протокола [`MessageListener`](#message-listener) с новым сообщением со статусом [`sending`](#sending) перечислимого типа [`MessageSendStatus`](#message-send-status).

### Метод `send(message:)`

Полностью соответствует методу [`send(message:isHintQuestion:)`](#send-message-is-hint-question) с опущенным параметром `isHintQuestion`.

### Метод `send(message:data:completionHandler:)` { #send-message-data }

Отправляет текстовое сообщение посетителя и дополнительный словарь `data` на сервер **Webim** (см. протокол [`DataMessageCompletionHandler`](#data-message-completion-handler)).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

### Метод `send(file:filename:mimeType:completionHandler:)` { #send-file-filename-mime-type-completion-handler }

Метод используется для отправки файла от посетителя оператору.

Параметр `file` — сам файл в формате `Data`.

Параметр `filename` — название файла вместе с расширением. Тип — `String`.

Параметр `mimeType` — *MIMЕ*-тип передаваемого файла. Тип — `String`.

Параметр `completionHandler` — объект, реализующий методы протокола [`SendFileCompletionHandler`](#send-file-completion-handler). Тип опциональный.

Возвращает ID, сгенерированный случайным образом для данного сообщения, который может быть использован для идентификации данного конкретного сообщения внутри логики приложения. (Отправляемый файл тоже является типом сообщения.) Тип — `String`.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Если существуют объекты [`MessageTracker`](#message-tracker) и [`MessageListener`](#message-listener), отправка сообщения вызовет метод [`added(message:after:)`](#added-message-new-message-after-previous-message) протокола [`MessageListener`](#message-listener) с новым сообщением со статусом [`sending`](#sending) перечислимого типа [`MessageSendStatus`](#message-send-status).

### Метод `newMessageTracker(messageListener:)` { #new-message-tracker-message-listener }

Метод используется для получения экземпляра класса [`MessageTracker`](#message-tracker).

Параметр `messageListener` — объект класса, реализующего методы протокола [`MessageListener`](#message-listener).

Возвращает экземпляр класса [`MessageTracker`](#message-tracker), соответствующий текущему объекту [`MessageStream`](#message-stream).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Получение нового экземпляра класса [`MessageTracker`](#message-tracker)автоматически уничтожает предыдущий экземпляр класса [`MessageTracker`](#message-tracker).

### Метод `set(visitSessionStateListener:)`

Метод передает в SDK ссылку на объект, реализующий методы протокола [`VisitSessionStateListener`](#visit-session-state-listener).

Параметр `chatStateListener` — объект, реализующий методы протокола [`VisitSessionStateListener`](#visit-session-state-listener).

### Метод `set(chatStateListener:)` { #set-chat-state-listener }

Метод передает в SDK ссылку на объект, реализующий методы протокола [`ChatStateListener`](#chat-state-listener).

Параметр `chatStateListener` — объект, реализующий методы протокола [`ChatStateListener`](#chat-state-listener).

### Метод `set(currentOperatorChangeListener:)` { #set-current-operator-change-listener }

Метод передает в SDK ссылку на объект, реализующий методы протокола [`CurrentOperatorChangeListener`](#current-operator-change-listener).

Параметр `currentOperatorChangeListener` — объект, реализующий методы протокола [`CurrentOperatorChangeListener`](#current-operator-change-listener).

### Метод `set(departmentListChangeListener:)`

Метод передает в SDK ссылку на объект, реализующий методы протокола [`DepartmentListChangeListener`](#department-list-change-listener).

Параметр currentOperatorChangeListener — объект, реализующий методы протокол [`DepartmentListChangeListener`](#department-list-change-listener).

### Метод `set(operatorTypingListener:)` { #set-operator-typing-listener }

Метод передает в SDK ссылку на объект, реализующий методы протокола [`OperatorTypingListener`](#operator-typing-listener).

Параметр `operatorTypingListener` — объект, реализующий методы протокола [`OperatorTypingListener`](#operator-typing-listener).

### Метод `set(locationSettingsChangeListener:)` { #set-location-settings-change-listener }

Метод передает в SDK ссылку на объект, реализующий методы протокола [`LocationSettingsChangeListener`](#location-settings-change-listener).

Параметр `locationSettingsChangeListener` — объект, реализующий методы протокола [`LocationSettingsChangeListener`](#location-settings-change-listener).

### Метод `set(onlineStatusChangeListener:)` { #set-session-online-status-change-listener }

Метод передает в SDK ссылку на объект, реализующий методы протокола [`SessionOnlineStatusChangeListener`](#session-online-status-change-listener).

Параметр `sessionOnlineStatusChangeListener` — объект, реализующий методы протокола [`SessionOnlineStatusChangeListener`](#session-online-status-change-listener).

### Метод `set(unreadByOperatorTimestampChangeListener:)` { #set-unread-by-operator-timestamp-change-listener }

Передает объект [`UnreadByOperatorTimestampChangeListener`](#unread-by-operator-timestamp-change-listener).

### Метод `set(unreadByVisitorMessageCountChangeListener:)` { #set-unread-by-visitor-message-count-change-listener }

Передает объект [`UnreadByVisitorTimestampMessageCountListener`](#unread-by-visitor-message-count-change-listener).

### Метод `set(unreadByVisitorTimestampChangeListener:)` { #set-unread-by-visitor-timestamp-change-listener }

Передает объект [`UnreadByVisitorTimestampChangeListener`](#unread-by-visitor-timestamp-change-listener).

### Метод `getRawConfig(forLocation:completionHandler:)` { #message-stream-getrawconfig }

Метод используется для получения конфигурации для местоположения.

Может выбрасывать ошибки типа `AccessError`.

Параметр `forLocation` — название текущего местоположения. Тип — `String`.

Параметр `completionHandler` — объект, реализующий методы протокола [`RawLocationConfigCompletionHandler`](#raw-location-config-completion-handler). Тип опциональный.

### Метод `getServerSideSettings(completionHandler:)` { #get-server-side-settings }

С помощью этого метода можно получить настройки сервера.

Параметр `completionHandler` – объект, реализующий методы протокола [`ServerSideSettingsCompletionHandler`](#server-side-settings-completion-handler). Тип опциональный.

Может выбрасывать ошибки типа `AccessError`.

### Метод `getChatId()`

С помощью этого метода можно получить id текущего чата.

Возвращает id текущего чата или `nil`, если его нет. Тип опциональный `Int`.

### Метод `resend(message:completionHandler:)` { #message-stream-resend-messagecompletionhandler }

Метод используется для повторной отправки сообщения посетителя в сервис **Webim**, если оно не было отправлено.

Параметр `message` — повторно отправляемое сообщение. Тип — `String`.

Параметр `completionHandler` — объект, реализующий методы протокола [`ResendMessageCompletionHandler`](#resend-message-completion-handler). Тип опциональный.

Может выбрасывать ошибки типа `AccessError`.

### Метод `cancelResend(message:)`

Метод используется для прекращения повторной отправки сообщения посетителя в сервис **Webim**.

Параметр `message` — сообщение, повторная отправка которого отменяется. Тип — `String`.

Может выбрасывать ошибки типа `AccessError`.

### Метод `getLastResolutionSurveyWith(operatorId:)`

Метод позволяет получить предыдущий ответ на опрос для конкретного оператора.

Параметр `operatorId` — ID оператора, для которого запрашивается ответ опроса. Тип — `String`.

Возвращает `Int?`: `1` или `0` в зависимости от выбранного ранее ответа, либо `nil`, если ответа не было.

### Метод `sendResolutionSurvey(id:answer:completionHandler:)` { #message-stream-sendresolutionsurvey-idanswercompletionhandler }

Метод используется для отправки ответа посетителя на опрос качества консультации.

Параметр `id` — ID оператора, которого оценивает посетитель. Тип — `String`.

Параметр `answer` — ответ посетителя (`1` — положительный, `0` — отрицательный). Тип — `Int`.

Параметр `completionHandler` — объект [`SendResolutionCompletionHandler`](#send-resolution-completion-handler). Тип опциональный.

Может выбрасывать ошибки типа `AccessError`.

---

## Протокол `ContactsCompletionHandler` { #contacts-completion-handler }

Объект передаётся в параметре `completionHandler` метода [`sendContacts(contacts:completionHandler:)`](#message-stream-send-contacts). Сигнатуры колбэков совпадают с объявлениями в **WebimMobileSDK**.

## Протокол `OfflineMessageCompletionHandler` { #offline-message-completion-handler }

Объект передаётся в параметре `completionHandler` метода [`sendOfflineMessage(message:fields:file:fileName:mimeType:completionHandler:)`](#message-stream-send-offline-message).

## Протокол `SessionLanguageListener` { #session-language-listener }

Наблюдатель, который передаётся в [`set(sessionLanguageListener:)`](#set-session-language-listener). Подробности вызовов — в заголовках **WebimMobileSDK**.

---

## Протокол `SendResolutionCompletionHandler` { #send-resolution-completion-handler }

Объект передаётся в параметре `completionHandler` метода [`sendResolutionSurvey(id:answer:completionHandler:)`](#message-stream-sendresolutionsurvey-idanswercompletionhandler) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess()`

Вызывается при успешной отправке ответа на опрос качества.

### Метод `onFailure(error:)`

Вызывается при ошибке. Параметр `error` — значение типа [`SendResolutionError`](#send-resolution-error).

---

## Перечисляемый тип `SendResolutionError` { #send-resolution-error }

Ошибки, передаваемые в `onFailure(error:)` протокола [`SendResolutionCompletionHandler`](#send-resolution-completion-handler). Имена кейсов совпадают с публичным API Swift.

### Случай `noChat`

Чата не существует.

### Случай `rateDisabled`

Оценка или опрос на стороне сервера отключены.

### Случай `operatorNotInChat`

В чате нет оператора.

### Случай `resolutionSurveyValueIncorrect`

Некорректное значение ответа опроса.

### Случай `unknown`

Неизвестная ошибка.

### Случай `rateFormMismatch`

Несоответствие формы оценки.

### Случай `visitorSegmentMismatch`

Несоответствие сегмента посетителя.

### Случай `ratedEntityMismatch`

Несоответствие оцениваемой сущности.

---

## Протокол `ResendMessageCompletionHandler` { #resend-message-completion-handler }

Объект, реализующий данный протокол, может быть передан в параметр `completionHandler` метода [`resend(message:completionHandler:)`](#message-stream-resend-messagecompletionhandler) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess(messageID:)`

Вызывается при успешном результате вызова метода `resend(message:completionHandler:)` протокола `MessageStream`.

Параметр `messageID` — ID соответствующего сообщения. Тип — `String`.

### Метод `onFailure()`

Вызывается при неуспешном результате вызова метода `resend(message:completionHandler:)` протокола `MessageStream`.

---

## Перечисляемый тип `SendFileProgressState` { #send-file-progress-state }

Возможные состояния процесса отправки файла. В публичном API Swift только два значения — они передаются на сервер как строковое поле состояния файла.

### Случай `upload`

Загрузка файла на сервер (промежуточные обновления прогресса).

### Случай `error`

Ошибка при загрузке файла.

---

## Протокол `ServerSideSettingsCompletionHandler` { #server-side-settings-completion-handler }

Объект, реализующий данный протокол, может быть передан в параметр `completionHandler` метода [`getServerSideSettings(completionHandler:)`](#get-server-side-settings) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess(webimServerSideSettings:)`

Вызывается при успешном результате вызова метода `getServerSideSettings(completionHandler:)` протокола `MessageStream`.

Параметр `webimServerSideSettings` — агрегированные настройки сервера. Тип — [`ServerSettings`](#server-settings).

### Метод `onFailure()`

Вызывается при неудачном запросе метода `getServerSideSettings(completionHandler:)` протокола `MessageStream`.

---

## Протокол `ServerSettings` { #server-settings }

Сводная модель настроек, возвращаемая в колбэке [`onSuccess(webimServerSideSettings:)`](#server-side-settings-completion-handler) при вызове [`getServerSideSettings(completionHandler:)`](#get-server-side-settings). Позволяет читать конфигурацию аккаунта, размещения и чата без парсинга сырого JSON в приложении.

### Метод `getAccountConfig()`

Возвращает [`AccountConfig`](#account-config) — в том числе сырые параметры аккаунта, лимиты загрузки файлов и пр.

### Метод `getLocationSettings()`

Возвращает словарь настроек размещения (`[String: Any?]`).

### Метод `getChatConfig()`

Возвращает [`ChatConfig`](#chat-config) — настройки форм контактов и подписей полей посетителя для построения UI.

### Метод `getResources()`

Возвращает [`ResourcesConfig`](#resources-config) — локализованные строки интерфейса (прощание, первый вопрос, заголовок оператора и др.), согласованные с настройками сервера.

---

## Протокол `AccountConfig` { #account-config }

Фрагмент конфигурации аккаунта: «сырой» словарь настроек, endpoint подсказок, лимиты загрузки файлов и другие поля, приходящие с сервера. Детальный состав зависит от версии **Webim Server** и настроек аккаунта.

---

## Протокол `ChatConfig` { #chat-config }

Конфигурация чата и форм сбора контактов на стороне размещения.

### Метод `getVisitorFields()`

Возвращает [`ContactsSettings`](#contacts-settings) — набор сценариев полей (по умолчанию, офлайн, первый вопрос, запрос контактов) для построения формы.

### Метод `getVisitorFieldLabels()`

Возвращает словарь подписей пользовательских полей посетителя: ключ — идентификатор поля, значение — локализованная подпись (или `nil`). Используется для отображения имён полей в интерфейсе приложения.

---

## Протокол `ContactsSettings` { #contacts-settings }

Описание вариантов наборов полей контактной формы.

### Метод `getDef()`

Настройки полей по умолчанию: словарь [`Contact`](#contact) по внутреннему ключу поля.

### Метод `getOfflineModeVsDef()`, `getFirstQuestionVsDef()`, `getContactsRequestVsDef()`

Альтернативные наборы полей для режима офлайн, первого вопроса и запроса контактов соответственно.

---

## Протокол `Contact` { #contact }

Описание одного поля формы: [`getPresence()`](#presence), [`getValidation()`](#validation) (тип, маска, максимальная длина).

## Перечисляемый тип `Presence` { #presence }

`none`, `optional`, `mandatory` — требование заполнения поля.

## Протокол `Validation` { #validation }

Параметры проверки ввода для поля формы.

---

## Протокол `ResourcesConfig` { #resources-config }

Строки интерфейса, отдаваемые сервером для согласования с языковыми настройками аккаунта.

### Метод `getLeaveMessage()`, `getFirstQuestionMessage()`, `getChatOperatorTitle()`, `getPersonalAgreement()`

Тексты для соответствующих элементов интерфейса (прощание, первый вопрос, заголовок оператора, согласие на обработку данных) или `nil`, если не заданы.

---

## Протокол `DataMessageCompletionHandler` { #data-message-completion-handler }

Объект, подчиняющийся протоколу, может быть передан в параметре `completionHandler` метода [`send(message:data:completionHandler:)`](#send-message-data) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess(messageID:)`

Метод вызывается при успешной отправке сообщения и обработке сервером переданного словаря `data` (если не `nil`) методом [`send(message:data:completionHandler:)`](#send-message-data) протокола [`MessageStream`](#message-stream).

Параметр `messageid` — ID соответствующего сообщения. Тип — `String`.

### Метод `onFailure(messageID:error:)` { #on-failure-message-id-error-data-message-completion-handler }

Вызывается при неудачной обработке сервером переданного словаря `data` (если не `nil`) методом [`send(message:data:completionHandler:)`](#send-message-data) протокола [`MessageStream`](#message-stream). Само сообщение в этом случае сервером будет обработано.

Параметр `messageid` — ID соответствующего сообщения. Тип — `String`.

Параметр `error` — ошибка, воспрепятствовавшая успешной обработке словаря `data` на сервере. Тип — [`DataMessageError`](#data-message-error).

---

## Перечисляемый тип `DataMessageError` { #data-message-error }

Ошибки, передаваемые в параметр `error` метода [`onFailure(messageID:error:)`](#on-failure-message-id-error-data-message-completion-handler) протокола [`DataMessageCompletionHandler`](#data-message-completion-handler).

### Случай `unknown`

Ошибка не поддерживается данной версией библиотеки.

### Случай `quotedMessageCanNotBeReplied`

Цитируемое сообщение не помечено как допускающее ответ (флаг на стороне сервера).

### Случай `quotedMessageFromAnotherVisitor`

ID цитаты относится к чату другого посетителя.

### Случай `quotedMessageMultipleIds`

ID цитаты соответствует нескольким сообщениям (ошибка данных на сервере).

### Случай `quotedMessageRequiredArgumentsMissing`

Не переданы обязательные аргументы механизма цитирования.

### Случай `quotedMessageWrongId`

Неверный идентификатор цитируемого сообщения.

!!! attention
    Цитирование — нестандартная возможность: должна быть поддержана вашим **Webim Server**.

---

## Протокол `DeleteMessageCompletionHandler` { #delete-message-completion-handler }

Объект, подчиняющийся протоколу, может быть передан в параметре `completionHandler` метода [`delete(message:completionHandler:)`](#message-stream-delete-message-completion-handler) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess(messageID:)`

Вызывается при успешном результате вызова метода [`delete(message:completionHandler:)`](#message-stream-delete-message-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `messageid` — ID соответствующего сообщения. Тип — `String`.

### Метод `onFailure(messageID:error:)`

Вызывается при неуспешном результате вызова метода [`delete(message:completionHandler:)`](#message-stream-delete-message-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `messageid` — ID соответствующего сообщения. Тип — `String`.

Параметр `error` — ошибка, воспрепятствовавшая успешному удалению сообщения. Тип — [`DeleteMessageError`](#delete-message-error).

---

## Протокол `RawLocationConfigCompletionHandler` { #raw-location-config-completion-handler }

Объект, подчиняющийся протоколу, может быть передан в параметре `completionHandler` метода [`getRawConfig(forLocation:completionHandler:)`](#message-stream-getrawconfig) протокола `MessageStream`.

### Метод `onSuccess(rawLocationConfig:)`

Метод вызывается при успешном запросе методом [`getRawConfig(forLocation:completionHandler:)`](#message-stream-getrawconfig) протокола `MessageStream`.

Параметр `rawLocationConfig` — конфигурация местоположения. Тип — `[String: Any?]`.

### Метод `onFailure()`

Вызывается при неудачном запросе метода [`getRawConfig(forLocation:completionHandler:)`](#message-stream-getrawconfig).

---

## Протокол `SendDialogToEmailAddressCompletionHandler` { #send-dialog-to-email-address-completion-handler }

Объект, реализующий данный протокол, может быть передан в параметр `completionHandler` метода [`sendDialogTo(emailAddress:completionHandler:)`](#message-stream-send-dialog-to-emailaddress-completion-handler) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess()`

Вызывается при успешном результате вызова метода [`sendDialogTo(emailAddress:completionHandler:)`](#message-stream-send-dialog-to-emailaddress-completion-handler) протокола [`MessageStream`](#message-stream).

### Метод `onFailure(error:)` { #send-dialog-to-email-address-completion-handler-on-failure }

Вызывается при неуспешном результате вызова метода [`sendDialogTo(emailAddress:completionHandler:)`](#message-stream-send-dialog-to-emailaddress-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `error` — ошибка, воспрепятствовавшая успешному вызову метода. Тип — [`SendDialogToEmailAddressError`](#send-dialog-to-email-address-error).

---

## Перечисляемый тип `SendDialogToEmailAddressError` { #send-dialog-to-email-address-error }

Возможные ошибки, которые могут быть переданы в параметр `error` при вызове метода [`SendDialogToEmailAddressCompletionHandler.onFailure(error:)`](#send-dialog-to-email-address-completion-handler-on-failure).

### Случай `noChat`

Чата не существует.

### Случай `sentTooManyTimes`

Превышен лимит попыток отправки.

### Случай `unknown`

Неизвестная ошибка.

---

## Протокол `SendFileCompletionHandler` { #send-file-completion-handler }

Объект, подчиняющийся протоколу, может быть передан в параметре `completionHandler` метода [`send(file:filename:mimeType:completionHandler:)`](#send-file-filename-mime-type-completion-handler) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess(messageID:)`

Метод вызывается при успешной отправке файла методом [`send(file:filename:mimeType:completionHandler:)`](#send-file-filename-mime-type-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `messageid` — ID соответствующего сообщения. Тип — `String`.

### Метод `onFailure(messageID:error:)` { #on-failure-message-id-error }

Вызывается при неудачной отправке файла методом [`send(file:filename:mimeType:completionHandler:)`](#send-file-filename-mime-type-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `messageid` — ID соответствующего сообщения. Тип — `String`.

Параметр `error` — ошибка, воспрепятствовавшая успешной отправке файла. Тип — [`SendFileError`](#send-file-error).

## Протокол `SendKeyboardRequestCompletionHandler` { #send-keyboard-request-completion-handler }

Объект, реализующий данный протокол, может быть передан в параметр `completionHandler` метода [`sendKeyboardRequest`](#message-stream-send-keyboard-request-button-message-completion-handler) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess(messageID:)`

Вызывается при успешном результате вызова метода [`sendKeyboardRequest`](#message-stream-send-keyboard-request-button-message-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `messageid` — ID соответствующего сообщения. Тип — `String`.

### Метод `onFailure(messageID:error:)`

Вызывается при неуспешном результате вызова метода [`sendKeyboardRequest`](#message-stream-send-keyboard-request-button-message-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `messageid` — ID соответствующего сообщения. Тип — `String`.

Параметр `error` — ошибка, воспрепятствовавшая успешному вызову метода. Тип — [`KeyboardResponseError`](#keyboard-response-error).

---

## Протокол `SendMessageCompletionHandler` { #send-message-completion-handler }

Объект, реализующий данный протокол, может быть передан в параметр `completionHandler` метода [`send(message:completionHandler:)`](#message-stream-send-message-completion-handler) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess(messageID:)`

Вызывается при успешном результате вызова метода [`send(message:completionHandler:)`](#message-stream-send-message-completion-handler) протокола [`MessageStream`](#message-stream).

Параметр `messageid` — ID соответствующего сообщения. Тип — `String`.

---

## Протокол `Sticker` { #sticker }

### Метод `getStickerId()`

С помощью этого метода можно получить ID стикера.

Возвращает ID стикера. Тип — `Int`.

### Метод `isEqual(to:)`

Сравнивает текущий стикер с другим.

Параметр `to` — второй объект типа `Sticker`.

Возвращает `Bool`: `true`, если содержимое совпадает, иначе `false`.

---

## Протокол `RateOperatorCompletionHandler` { #rate-operator-completion-handler }

Объект, подчиняющийся протоколу, может быть передан в параметре `completionHandler` метода [`rateOperatorWith(id:rating:completionHandler:)`](#rate-operator-with-id-by-rating-rating) протокола [`MessageStream`](#message-stream).

### Метод `onSuccess()`

Метод вызывается при успешном результате вызова метода [`rateOperatorWith(id:rating:completionHandler:)`](#rate-operator-with-id-by-rating-rating) протокола [`MessageStream`](#message-stream).

### Метод `onFailure(error:)` { #on-failure-error }

Метод вызывается при неуспешном результате вызова метода [`rateOperatorWith(id:rating:completionHandler:)`](#rate-operator-with-id-by-rating-rating) протокола [`MessageStream`](#message-stream).

Параметр `error` — возникшая ошибка. Тип — [`RateOperatorError`](#rate-operator-error).

---

## Протокол `VisitSessionStateListener` { #visit-session-state-listener }

Протокол, адаптация которого позволяет отслеживать изменения [`VisitSessionState`](#visit-session-state).

### Метод `changed(state:to:)`

Метод вызывается при изменении [`VisitSessionState`](#visit-session-state).

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

---

## Протокол `DepartmentListChangeListener` { #department-list-change-listener }

Протокол, адаптация которого позволяет отслеживать изменения списка отделов.

### Метод `received(departmentList:)`

Метод вызывается при получении нового списка отделов.

В параметр метода передаётся массив объектов [`Department`](#department).

---

## Протокол `LocationSettings` { #location-settings }

Экземпляр класса, подчиняющегося протоколу, может быть получен методом [`getLocationSettings()`](#get-location-settings) объекта [`MessageStream`](#message-stream). С помощью методов данного протокола могут быть получены специфические настройки текущей локации.


### Метод `areHintsEnabled()`

Метод позволяет узнать, включено ли отображение подсказок в текущей локации.

Возвращает `Bool`: `true`, если подсказки нужно показывать, `false`, если нет.

---

## Протокол `ChatStateListener` { #chat-state-listener }

Протокол, методы которого реализуются каким-либо классом приложения. Объект, подчиняющийся протоколу, может быть передан в параметре `chatStateListener` метода [`set(chatStateListener:)`](#set-chat-state-listener) протокола [`MessageStream`](#message-stream). Используется для отслеживания изменений состояния текущего чата.

### Метод `changed(state previousState:to newState:)` { #changed-state-previous-state-to-new-state }

Метод вызывается, когда состояние текущего чата изменилось.

Параметр `previousState` — предыдущее состояние чата. Тип — [`ChatState`](#chat-state).

Параметр `newState` — новое состояние чата. Тип — [`ChatState`](#chat-state).

---

## Протокол `CurrentOperatorChangeListener` { #current-operator-change-listener }

Протокол, методы которого реализуются каким-либо классом приложения. Объект, подчиняющийся протоколу, может быть передан в параметре currentOperatorChangeListener метода [`set(currentOperatorChangeListener:)`](#set-current-operator-change-listener) протокола [`MessageStream`](#message-stream).Используется для отслеживания изменения оператора текущего чата.

### Метод `changed(operator previousOperator:to newOperator:)`

Метод вызывается, когда оператор текущего чата изменился (или оператора не стало).

Параметр `previousOperator` — предыдущий оператор. Тип — [`Operator`](#protocol-operator).

Параметр `newOperator` — новое состояние чата. Тип — опциональный [`Operator`](#protocol-operator). Принимает значение `nil` в случае, если оператор покинул чат.

---

## Протокол `OperatorTypingListener` { #operator-typing-listener }

Объект, подчиняющийся протоколу, может быть передан в параметре `operatorTypingListener` метода [`set(operatorTypingListener:)`](#set-operator-typing-listener) протокола [`MessageStream`](#message-stream).Используется для оповещения, когда оператор начинает вводить сообщение.

### Метод `onOperatorTypingStateChanged(isTyping:)`

Метод вызывается, когда оператор текущего чата начал вводить сообщение.

Параметр `isTyping` `true`, если оператор вводить сообщение, и `false` — в противном случае. Тип — `Bool`.

---

## Протокол `LocationSettingsChangeListener` { #location-settings-change-listener }

Протокол, методы которого реализуются каким-либо классом мобильного приложения. Объект класса, подчиняющийся протоколу, может быть передан в параметре `locationSettingsChangeListener` метода [`set(locationSettingsChangeListener:)`](#set-location-settings-change-listener) протокола [`MessageStream`](#message-stream). Используется для отслеживания изменений в текущих настройках локации.

### Метод `changed(locationSettings previousLocationSettings:to newLocationSettings:)`

Метод вызывается, когда настройки текущей локации изменились.

Параметр `previousLocationSettings` — предыдущее значение настроек текущей локации. Тип — [`LocationSettings`](#location-settings).

Параметр `newLocationSettings` — новое значение настроек текущей локации. Тип — [`LocationSettings`](#location-settings).

---

## Протокол `OnlineStatusChangeListener` { #session-online-status-change-listener }

Протокол адаптируется сущностями мобильного приложения. Объект класса, адаптировавшего протокол может быть передан в параметре `sessionOnlineStatusChangeListener` метода [`set(onlineStatusChangeListener:)`](#set-session-online-status-change-listener) протокола [`MessageStream`](#message-stream). Используется для получения оповещений при изменении статуса сессии. Статус сессии описан в значениях перечисляемого типа [`OnlineStatus`](#online-status).

### Метод `changed(onlineStatus previousOnlineStatus:to newOnlineStatus:)` { #changed-session-online-status-previous-session-online-status-to-new-session-online-status }

Метод вызывается при изменении статуса сессии.

Параметр `previousSessionOnlineStatus` — предыдущее состояние сессии. Тип — [`OnlineStatus`](#online-status).

Параметр `newSessionOnlineStatus` — новое (полученное) состояние сессии. Тип — [`OnlineStatus`](#online-status).

Метод вызывается в результате полученного уведомления от сервиса **Webim**.

---

## Протокол `UnreadByOperatorTimestampChangeListener` { #unread-by-operator-timestamp-change-listener }

Протокол, предоставляющий методы для обработки изменений параметра, возвращаемого методом [`getUnreadByOperatorTimestamp()`](#get-unread-by-operator-timestamp). Объект, адаптирующий протокол, передаётся с помощью метода [`set(unreadByOperatorTimestampChangeListener:)`](#set-unread-by-operator-timestamp-change-listener).

### Метод `changedUnreadByOperatorTimestampTo(newValue:)`

Метод, который вызывается при изменении параметра, возвращаемого методом [`getUnreadByOperatorTimestamp()`](#get-unread-by-operator-timestamp).

Параметр `newValue` — новое значение, возвращаемое методом [`getUnreadByOperatorTimestamp()`](#get-unread-by-operator-timestamp). Тип — опциональный `Date`.

---

## Протокол `UnreadByVisitorMessageCountChangeListener` { #unread-by-visitor-message-count-change-listener }

Протокол, предоставляющий методы для обработки изменений параметра, возвращаемого методом [`getUnreadByVisitorMessageCount()`](#get-unread-by-visitor-message-count).Объект, адаптирующий протокол, передаётся с помощью метода [`set(unreadByVisitorMessageCountChangeListener:)`](#set-unread-by-visitor-message-count-change-listener).

!!! Note "N.B."
    Объект класса, реализующий данный протокол, может быть получен только после старта сессии методом [`resume()`](#resume). Данный объект увеличивает значение количества непрочитанных сообщений, посылая каждые 30 секунд соответствующие запросы на сервер.

### Метод `changedUnreadByVisitorMessageCountTo(newValue:)`

Метод, который вызывается при изменении параметра, возвращаемого методом [`getUnreadByVisitorMessageCount()`](#get-unread-by-visitor-message-count).

Параметр `newValue` — новое значение, возвращаемое методом [`getUnreadByVisitorMessageCount()`](#get-unread-by-visitor-message-count). Тип — `Int`.

---

## Протокол `UnreadByVisitorTimestampChangeListener` { #unread-by-visitor-timestamp-change-listener }

Протокол, предоставляющий методы для обработки изменений параметра, возвращаемого методом [`getUnreadByVisitorTimestamp()`](#get-unread-by-visitor-timestamp). Объект, адаптирующий протокол, передаётся с помощью метода [`set(unreadByVisitorTimestampChangeListener:)`](#set-unread-by-visitor-timestamp-change-listener).

### Метод `changedUnreadByVisitorTimestampTo(newValue:)`

Метод, который вызывается при изменении параметра, возвращаемого методом [`getUnreadByVisitorTimestamp()`](#get-unread-by-visitor-timestamp).

Параметр `newValue` — новое значение, возвращаемое методом [`getUnreadByVisitorTimestamp()`](#get-unread-by-visitor-timestamp). Тип — опциональный `Date`.

---

## Протокол `UploadedFile` { #uploaded-file }

Содержит методы, с помощью которых можно получить информацию о файле.

### Метод `getSize()`

Метод, с помощью которого может быть получен размер файла вложения.

Возвращает размер файла вложения в байтах. Тип — `Int64`.

### Метод `getGuid()`

Метод, с помощью которого может быть получен `guid` файла вложения.

Возвращает значение в текстовом виде. Тип — `String`.

### Метод `getFileName()`

Метод, с помощью которого может быть получено имя файла вложения.

Возвращает имя файла вложения в текстовом виде. Тип — `String`.

### Метод `getContentType()`

Метод, с помощью которого может быть получен MIME-тип вложения.

Возвращает MIME-тип вложения в текстовом виде. Тип — опциональный `String`.

### Метод `getVisitorId()`

Метод, с помощью которого может быть получен id отправителя файла.

Возвращает значение в текстовом виде. Тип — `String`.

### Метод `getClientContentType()`

Метод, с помощью которого может быть получен MIME-тип вложения.

Возвращает MIME-тип вложения в текстовом виде. Тип — `String`.

### Метод `getImageInfo()`

См. описание [`getImageInfo()`](#get-image-info) у [`MessageAttachment`](#message-attachment) — назначение то же.

---

## Перечисляемый тип `ChatState` { #chat-state }

Возможные состояния чата (см. метод [`getChatState()`](#get-chat-state) протокола [`MessageStream`](#message-stream)). Ниже — имена кейсов как в публичном API Swift (camelCase). Типичный жизненный цикл: от [`closed`](#chat-state-closed) (чата ещё нет) или [`unknown`](#chat-state-unknown) до [`queue`](#queue) после первого сообщения посетителя или `startChat()`, затем [`chatting`](#chatting) после подключения оператора; закрытие оператором — [`closedByOperator`](#closed-by-operator); когда обе стороны завершили диалог или при длительной неактивности возможен переход в [`closed`](#chat-state-closed). Подробности переходов зависят от настроек **Webim Server**.

### Случай `chatting` { #chatting }

Оператор взял чат в обработку. Из этого состояния возможны переходы в [`closedByOperator`](#closed-by-operator), [`closed`](#chat-state-closed) и другие — по ответам сервера.

### Случай `chattingWithRobot` { #chatting-with-robot }

Чат обрабатывается ботом. Далее возможны [`chatting`](#chatting) или [`closed`](#chat-state-closed).

### Случай `closedByOperator` { #closed-by-operator }

Чат закрыт оператором. Далее — [`closed`](#chat-state-closed), [`queue`](#queue) при новом сообщении посетителя и т.п.

### Случай `invitation` { #invitation }

Чат начат оператором, ожидается ответ посетителя. Далее — [`chatting`](#chatting) или [`closed`](#chat-state-closed).

### Случай `closed` { #chat-state-closed }

Нет активного чата: диалог не начат или полностью завершён (в том числе после закрытия посетителем и оператором), либо при автозакрытии по неактивности. Из этого состояния — в [`queue`](#queue) или [`invitation`](#invitation).

### Случай `queue` { #queue }

Чат начат посетителем и стоит в очереди на обработку. Далее — [`chatting`](#chatting), [`closedByOperator`](#closed-by-operator) и т.д.

### Случай `unknown` { #chat-state-unknown }

Состояние ещё не получено с сервера либо не поддерживается данной версией SDK (например, на сервере появились новые значения).

### Случай `hold` { #chat-state-hold }

Чат удерживается оператором (серверный сценарий).

### Случай `deleted` { #chat-state-deleted }

Чат удалён (серверный сценарий).

### Случай `routing` { #chat-state-routing }

Чат в маршрутизации (серверный сценарий).

---

## Перечисляемый тип `OnlineStatus` { #online-status }

Возможные статусы онлайн. Могут быть получены с помощью метода [`changed(onlineStatus previousOnlineStatus:to newOnlineStatus:)`](#changed-session-online-status-previous-session-online-status-to-new-session-online-status) протокола [`SessionOnlineStatusChangeListener`](#session-online-status-change-listener). Имена кейсов совпадают с публичным API Swift.

### Случай `busyOffline`

Офлайн-состояние с превышенным количеством лимита чатов.

Означает, что посетитель не может отправлять сообщения вообще.

### Случай `busyOnline`

Онлайн-состояние с превышенным количеством лимита чатов.

Означает, что посетитель может отправлять сообщения в офлайн-зону, но сервер может их отклонить и вернуть ошибку.

### Случай `offline`

Означает, что посетитель может отправлять сообщения в офлайн-зону.

### Случай `online`

Означает, что посетитель может отправлять сообщения без каких-либо ограничений.

### Случай `unknown`

Означает, что либо SDK пока не получил первое обновление статуса сессии от сервиса **Webim**, либо статус сессии не поддерживается в текущей версии SDK.

---

## Перечисляемый тип `VisitSessionState` { #visit-session-state }

Возможные статусы сессии. Имена кейсов совпадают с публичным API Swift.

### Случай `chat`

Сессия в режиме активного чата.

### Случай `departmentSelection` { #department-selection }

Была попытка начать чат без выбора отдела, а на сервере выбор отдела обязателен.

Сессия ожидает вызов [`startChat(departmentKey:)`](#start-chat-department-key).

### Случай `firstQuestion`

Чат нужно начать с ответа на первый вопрос (см. метод [`startChat(firstQuestion:)`](#start-chat-first-question) протокола [`MessageStream`](#message-stream)).

### Случай `idle`

Сессия активна, чат ещё не начат.

### Случай `idleAfterChat`

Сессия активна, чат недавно был закрыт.

### Случай `offlineMessage`

Офлайн-состояние сессии.

### Случай `unknown`

Статус ещё не получен или не поддерживается текущей версией `WebimMobileSDK`.

## Перечисляемый тип `SendFileError` { #send-file-error }

Возможные ошибки, которые могут быть переданы в параметр `error` метода [`onFailure(messageID:error:)`](#on-failure-message-id-error) протокола [`SendFileCompletionHandler`](#send-file-completion-handler).

### Случай `fileSizeExceeded`

Размер файла превышает лимит, заданный на сервере.

### Случай `fileSizeTooSmall`

Означает, что размер файла меньше минимально допустимого.

### Случай `fileTypeNotAllowed`

Тип файла не входит в список разрешённых на сервере.

### Случай `maxFilesCountPerChatExceeded`

Означает, что превышено максимальное число файлов на один чат.

### Случай `uploadedFileNotFound`

Означает, что файл был передан недопустимым способом (например, не через multipart).

### Случай `uploadCanceled`

Означает, что загрузка файла отменена из-за деактивированной сессии или по другим причинам.

### Случай `maliciousFileDetected`

Означает, что файл не прошел проверку безопасности.

### Случай `uploadNotAllowed`

Означает, что загрузка файла запрещена настройками или сценарием.

### Случай `unknown`

Неизвестная ошибка.

### Случай `unauthorized`

Ошибка авторизации посетителя на сервере.

## Перечисляемый тип `RateOperatorError` { #rate-operator-error }

### Случай `noChat`

Возникает при попытке отправить оценку оператора, когда чата не существует.

### Случай `wrongOperatorId`

Возникает, когда при попытке отправить оценку оператора был передан ID оператора, не принадлежащего текущему чату.

### Случай `noteIsTooLong`

Слишком длинный комментарий. Максимальная длина 2000 символов.

### Случай `rateDisabled`

Оценка оператора отключена для текущего аккаунта.

### Случай `operatorNotInChat`

Возникает, когда в чате нет оператора.

### Случай `rateValueIncorrect`

Возникает, когда передано некорректное значение оценки.

### Случай `unknown`

Неизвестная ошибка.

---

## Протокол `MessageTracker` { #message-tracker }

Экземпляр класса, подчиняющегося протоколу, может быть получен с помощью метода [`new(messageTracker:)`](#new-message-tracker-message-listener) протокола [`MessageStream`](#message-stream). Методы протокола используются для манипуляций с сообщениями, существующими в истории сообщений.

### Метод `getLastMessages(byLimit:completion:)`

Метод используется для запроса сообщений с начала истории сообщений.

Параметр `limitOfMessages` — количество следующих сообщений, не более которого должен запросить метод. Тип — `Int`, значение может быть любым положительным больше 1 (если передано значение меньше 1, метод не выполнит никакой работы).

Параметр `completion` — замыкание, которое выполняется после завершения выполнения метода. Замыкание содержит один параметр типа массив `Message` и не имеет возвращаемого типа. Как правило, в параметр передаётся ожидаемый набор сообщений из истории сообщений. Если параметр не содержит ни одного объекта типа [`Message`](#message) (массив пуст) — это означает, что достигнут конец истории сообщений. Если при выполнении метод не выбросил никакую ошибку, переданное замыкание будет выполнено гарантированно (с пустым или нет результатом).

Каждый последующий вызов данного метода может быть совершен только после того, как предыдущий запрос был завершен (было вызвано замыкание).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Метод не выполнит никакой работы, если соответствующий объект [`MessageTracker`](#message-tracker) был деактивирован (см. метод [`destroy()`](#message-tracker-destroy)).

Метод может вернуть количество сообщений меньше лимита, однако это не будет означать, что сообщений больше не осталось. В такой ситуации метод можно использовать повторно для дальнейшей выгрузки сообщений. Если сообщений не осталось, метод вернёт ноль.

### Метод `getNextMessages(byLimit:completion:)`

Метод используется для запроса сообщений из истории сообщений, которая ещё не отображается в текущей ленте сообщений.

Параметр `limitOfMessages` — количество следующих сообщений, не более которого должен запросить метод. Тип — `Int`, значение может быть любым положительным больше 1 (если передано значение меньше 1, метод не выполнит никакой работы).

Параметр `completion` — замыкание, которое выполняется после завершения выполнения метода. Замыкание содержит один параметр типа массив [`Message`](#message) и не имеет возвращаемого типа. Как правило, в параметр передаётся ожидаемый набор сообщений из истории сообщений. Если параметр не содержит ни одного объекта типа [`Message`](#message)(массив пуст) — это означает, что достигнут конец истории сообщений. Если при выполнении метод не выбросил никакую ошибку, переданное замыкание будет выполнено гарантированно (с пустым или нет результатом).

Каждый последующий вызов данного метода может быть совершен только после того, как предыдущий запрос был завершен (было вызвано замыкание).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Метод не выполнит никакой работы, если соответствующий объект [`MessageTracker`](#message-tracker) был деактивирован (см. метод [`destroy()`](#message-tracker-destroy)).

### Метод `getAllMessages(completion:)`

Метод используется для запроса сразу всей истории сообщений.

Параметр `completion` — замыкание, которое выполняется после завершения выполнения метода. Замыкание содержит один параметр типа массив [`Message`](#message) и не имеет возвращаемого типа. Как правило, в параметр передаётся ожидаемый набор сообщений из истории сообщений. Если параметр не содержит ни одного объекта типа [`Message`](#message)(массив пуст) — это означает, что достигнут конец истории сообщений. Если при выполнении метод не выбросил никакую ошибку, переданное замыкание будет выполнено гарантированно (с пустым или нет результатом).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Метод не выполнит никакой работы, если соответствующий объект [`MessageTracker`](#message-tracker) был деактивирован (см. метод [`destroy()`](#message-tracker-destroy)).

### Метод `resetTo(message:)`

Объект [`MessageTracker`](#message-tracker) хранит текущий диапазон сообщений. Вызов данного метода может «сбросить» предел, до которого объект хранит историю сообщений, до определенного сообщения.

Параметр `message` — сообщение, до которого необходимо «сбросить» предел хранимой истории сообщений. Тип — [`Message`](#message).

Может выбрасывать ошибки типа [`AccessError`](#access-error).

Метод может быть вызван только после того, как предыдущее обращение к объекту [`MessageTracker`](#message-tracker) вернуло результат, иначе метод не выполнит никакой работы.

### Метод `destroy()` { #message-tracker-destroy }

Деактивирует текущий объект [`MessageTracker`](#message-tracker), после чего никакие методы протокола не могут быть использованы.

Может выбрасывать ошибки типа [`AccessError`](#access-error).

---

## Протокол `MessageListener` { #message-listener }

Протокол должен быть адаптирован каким-либо классом приложения. Методы протокола вызываются при изменениях в ленте сообщений.

### Метод `added(message:after:)` { #added-message-new-message-after-previous-message }

Метод вызывается при добавлении сообщений в текущую ленту. Важно, что вызов метода не является признаком получения именно нового сообщения: это логическая вставка сообщений в ленту. Например, при первом успешном соединении с сервером, SDK получает всю историю сообщений. Если она содержит сообщения, находящиеся в уже отображаемом в ленте временном промежутке, на каждое такое сообщение также будет вызван этот метод.

Параметр `newMessage` — полученное сообщение. Тип — [`Message`](#message).

Параметр `previousMessage` — сообщение, после которого необходимо вставить полученное сообщение. Тип — опциональный [`Message`](#message). Если значение данного параметра `nil`, полученное сообщение необходимо вставить в конце списка.

### Метод `removed(message:)` { #removed-message }

Метод вызывается при удалении сообщения из ленты.

Параметр `message` — удаленное сообщение. Тип — [`Message`](#message).

### Метод `removedAllMessages()`

Метод вызывается при удалении всех сообщений из ленты.

### Метод `changed(oldVersion:newVersion:)` { #changed-message-old-version-to-new-version }

Метод вызывается при изменении какого-либо сообщения.

Сообщения как таковые не меняются: происходит замена одного объекта другим. Поэтому при вызове данного метода можно сравнивать поля сообщения, чтобы выяснить, какие из них отличаются.

Параметр `oldVersion` — прежний объект сообщения. Тип — [`Message`](#message).

Параметр `newVersion` — новый объект сообщения. Тип — [`Message`](#message).

---

## Протокол `Message` { #message }

Протокол является абстракцией, представляющей отдельное сообщение внутри SDK. Объекты [`Message`](#message) могут быть получены в вызовах методов протокола [`MessageListener`](#message-listener).

Объекты [`Message`](#message) — неизменяемые. Изменения каких-либо его полей создает новый объект. На идентичность полей два объекта `Message` можно проверить методом [`isEqual(to:)`](#is-equal-to-message). Логическое соответствие объектов сообщения можно проверить, сравнив их ID (см. метод [`getID()`](#get-id)).

### Метод `getRawData()`

С помощью этого метода можно получить произвольный словарь, формируемый сервером, при использовании `MessageType` `actionRequest`.

Возвращает словарь типа `[String: Any?]` или `nil`, если он отсутствует.

### Метод `getData()` { #get-data }

Сообщения типа `fileFromOperator` или `fileFromVisitor` могут содержать вложенные файлы. С помощью этого метода можно получить файл.

Возвращает экземпляр класса [`MessageData`](#message-data) или `nil`, если файл находится в процессе отправки.

### Метод `getCurrentChatID()`

С помощью этого метода можно получить уникальный ID текущего чата.

Возвращает ID чата. Тип — `String` или `nil`, если ID отсутствует.

### Метод `getKeyboard()`

С помощью этого метода можно получить элемент клавиатуры чат-бота.

Возвращает клавиатуру с кнопками. Тип — опциональный [`Keyboard`](#keyboard).

### Метод `getKeyboardRequest()`

С помощью этого метода можно получить элемент клавиатуры, который выбрал пользователь.

Возвращает элемент клавиатуры, выбранный пользователем. Тип — опциональный [`KeyboardRequest`](#keyboard-request).

### Метод `getQuote()`

С помощью этого метода можно получить информацию о цитируемом сообщении.

Возвращает цитированное сообщение. Тип — класса опциональный [`Quote`](#quote).

### Метод `isReadByOperator()`

С помощью этого метода можно получить информацию о статусе сообщения. Прочитано ли оно оператором или нет.

Возвращает `true`, если сообщение прочитано оператором, и `false`, если нет. Тип — `Bool`.

### Метод `canBeEdited()`

С помощью этого метода можно получить информацию о том, может ли сообщение быть изменено или удалено.

Возвращает `true`, если может, и `false`, если нет. Тип — `Bool`.

Чтобы метод мог возвращать `true` в принципе, соответствующая методу функциональность (редактирование и удаление сообщений) должна быть активна на аккаунте. В данном случае значение параметра настроек аккаунта (`account config`) `visitor_message_editing` должно быть `true`. В противном случае, метод всегда будет возвращать `false`.

### Метод `canBeReplied()`

С помощью этого метода можно получить информацию о том, можно ли ответить на данное сообщение.

Возвращает `true`, если можно, и `false`, если нет. Тип — `Bool`.

Чтобы метод мог возвращать `true` в принципе, соответствующая методу функциональность (цитирование сообщений) должна быть активна на аккаунте. В данном случае значение параметра настроек аккаунта (`account config`) `web_and_mobile_quoting` должно быть `true`. В противном случае, метод всегда будет возвращать `false`.

### Метод `getID()` { #get-id }

С помощью этого метода можно получить уникальный ID сообщения.

Возвращает ID сообщения. Тип — `String`.

### Метод `getOperatorID()`

С помощью этого метода можно получить ID оператора, отправившего сообщение.

Возвращает ID оператора или `nil`, если сообщение было отправлено не оператором. Тип — опциональный `String`.

### Метод `getSenderAvatarFullURL()`

С помощью этого метода можно получить URL для загрузки аватара отправителя сообщения (если есть).

Возвращает полный URL аватара отправителя сообщения или `nil`, если аватар отсутствует. Тип — опциональный URL.

### Метод `getSenderName()`

С помощью этого метода можно получить имя отправителя сообщения.

Возвращает имя отправителя сообщения. Тип — `String`.

### Метод `getSendStatus()` { #get-send-status }

С помощью этого метода можно получить статус отправки сообщения.

Возвращает значение перечисляемого типа [`MessageSendStatus`](#message-send-status).

### Метод `getText()` { #get-text }

С помощью этого метода можно получить текст сообщения.

Возвращает текст сообщения. Тип — `String`.

### Метод `getTime()`

С помощью этого метода можно получить время отправки сообщения.

Тип — `Date`.

### Метод `getType()` { #get-type }

С помощью этого метода можно получить тип сообщения.

Возвращает значение перечисляемого типа [`MessageType`](#message-type).

### Метод `isEqual(to message:)` { #is-equal-to-message }

С помощью этого метода можно узнать, идентичны ли два сообщения.

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

```
if messageOne.isEqual(to: messageTwo) { /* ... */ }
```

Где `messageOne` и `messageTwo` — любые экземпляры типа [`Message`](#message).

Параметр `message` — сообщение, с которым сравнивается сообщение, на котором вызывается метод. Тип — [`Message`](#message).

Возвращает true, если поля сообщений идентичны, и `false` — если это не так. Тип — `Bool`.

### Метод `getSticker()`

С помощью этого метода можно получить стикер в сообщении.

Возвращает стикер. Тип — опциональный [`Sticker`](#sticker).

### Метод `isEdited()`

С помощью этого метода можно узнать, было ли сообщение отредактировано или нет.

Возвращает `true`, если сообщение было изменено, и `false`, если нет. Тип — `Bool`.

### Метод `canVisitorReact()`

С помощью этого метода можно получить информацию о том, можно ли посетителю оставить реакцию на данное сообщение.

Возвращает `true`, если можно, и `false`, если нет. Тип — `Bool`.

### Метод `getServerSideID()`

С помощью этого метода можно получить идентификатор сообщения в базе сервера.

Возвращает `String` или `nil`, если он отсутствует.

---

## Протокол `MessageAttachment` { #message-attachment }

Протокол является абстракцией, представляющей файловое вложение в сообщение. Объект [`MessageAttachment`](#message-attachment) может быть получен в помощью метода [`getAttachment()`](#get-attachment) [`Message`](#message).

### Метод `getFileInfo()`

Метод, с помощью которого может быть получена информация о вложенном файле.

Возвращает информацию о файле. Тип — [`FileInfo`](#file-info).

### Метод `getState()` { #message-attachment-get-state }

Метод, с помощью которого можно получить состояние загрузки файла на сервер.

Возвращает информацию о состоянии загрузки файла. Тип — [`AttachmentState`](https://webim.ru/kb/mobile/sdk/v-4-0/ios-additional-features.html#attachment-state).

### Метод `getDownloadProgress()`

Метод, с помощью которого можно получить ход передачи файла в процентах — при **отправке** вложения посетителем и при **скачивании** вложения с сервера (обновляется по мере поступления данных).

Возвращает значение прогресса. Тип — опциональный `Int64`.

### Метод `getErrorType()` { #message-attachment-get-error-type }

Метод, с помощью которого можно получить тип ошибки, из-за которой возникли проблемы с загрузкой файла.

Возвращает тип ошибки. Тип — опциональный `String`.

### Метод `getErrorMessage()` { #message-attachment-get-error-message }

Метод, с помощью которого можно получить текст ошибки из-за которой возникли проблемы с загрузкой файла.

Возвращает текст ошибки. Тип — опциональный `String`.

### Дополнительные возможности

#### Метод `getVisitorErrorMessage()` { #message-attachment-get-visitor-error-message }

Текст ошибки после проверки файла на стороне, ориентированной на посетителя. Тип — опциональный `String`.

#### Метод `getExtraText()` { #message-attachment-get-extra-text }

Дополнительный текст, связанный с вложением. Тип — опциональный `String`.

### Метод `getFilesInfo()`

Метод, с помощью которого может быть получена информация о вложенных файлах.

Возвращает информацию о файлах. Тип — [`FileInfo`](#file-info).

### Метод `getImageInfo()` { #get-image-info }

Метод, с помощью которого может быть получена информация об изображении, если вложение является изображением.

Возвращает информацию об изображении. Тип — опциональный [`ImageInfo`](#image-info).

### Метод `isEqual(to:)`

С помощью данного метода можно сравнить объект MessageAttachment с другим, передаваемым в параметрах.

Параметр `to` — объект для сравнения. Тип — `MessageAttachment`.

Возвращает `Bool`. 'true', если объекты идентичны, и 'false' - если нет.

---

## Протокол `ImageInfo` { #image-info }

Протокол является абстракцией, представляющей информацию о вложении, если оно является изображением. Объект `ImageInfo` может быть получен методом [`getImageInfo()`](#get-image-info) протокола [`MessageAttachment`](#message-attachment) (аналогичный метод есть у протокола [`UploadedFile`](#uploaded-file)).

### Метод `getThumbURL()`

Метод позволяет получить URL для скачивания превью изображения. Максимальные размеры по вертикали и горизонтали — 300 пикселей, но могут быть изменены на сервере. Для того, чтобы узнать точные размеры превью до тех пор, пока изображение ещё не загружено, можно использовать следующий код:

```
let THUMB_SIZE = 300

var width = imageInfo.getWidth()

var height = imageInfo.getHeight()

if (height > width) {

width = (THUMB_SIZE * width) / height

height = THUMB_SIZE

} else {

height = (THUMB_SIZE * height) / width

width = THUMB_SIZE

}
```

Возвращает URL для скачивания превью изображения. Полученная ссылка действительна только для текущей сессии.

### Метод `getHeight()`

Метод, с помощью которого может быть получена высота изображения.

Возвращает высоту изображения в пикселях или `nil`. Тип — опциональный `Int`.

### Метод `getWidth()`

Метод, с помощью которого может быть получена ширина изображения.

Возвращает ширину изображения в пикселях или `nil`. Тип — опциональный `Int`.

### Метод `isEqual(to:)`

С помощью данного метода можно сравнить объект ImageInfo с другим, передаваемым в параметрах.

Параметр `to` — объект для сравнения. Тип — `ImageInfo`.

Возвращает `Bool`. 'true', если объекты идентичны, и 'false' - если нет.

---

## Перечисляемый тип `MessageType` { #message-type }

Используется для определения типа сообщения (см. метод [`getType()`](#get-type) протокола [`Message`](#message)).

### Случай `actionRequest`

Сообщение, содержащее словарь с произвольными данными, который будет обработан приложением исходя из определяемой клиентом логики (см. метод [`getData()`](#get-data) протокола [`Message`](#message)).

### Случай `contactInformationRequest`

Сообщение после запроса контактов со стороны оператора. Автоматической обработки нет: данные обычно в [`getText()`](#get-text).

### Случай `fileFromOperator`

Файл от оператора.

### Случай `fileFromVisitor`

Файл от посетителя.

### Случай `info`

Системное сообщение сервера (приветствие, события чата и т.п.).

### Случай `keyboard`

Сообщение с клавиатурой от чат-бота.

### Случай `keyboardResponse`

Ответ посетителя по клавиатуре.

### Случай `operatorMessage`

Текстовое сообщение оператора.

### Случай `operatorBusy`

Системное сообщение: оператор занят.

### Случай `visitorMessage`

Текстовое сообщение посетителя.

### Случай `stickerVisitor`

Стикер от посетителя.

### Случай `contacts`

Контактное сообщение от посетителя.

---

## Перечисляемый тип `MessageSendStatus` { #message-send-status }

Используется для определения статуса отправки сообщения (см. метод [`getSendStatus()`](#get-send-status) протокола [`Message`](#message)).

### Случай `sending` { #sending }

Сообщение ещё доставляется на сервер и не разослано всем получателям.

### Случай `sent`

Означает любое состояние сообщения после событий, перечисленных в описании значения [`sending`](#sending).

---

## Протокол `Department` { #department }

Представление одного отдела. Предоставляет методы получения информации об отделе. Объекты `Department` могут быть получены с помощью адаптации протокола [`DepartmentListChangeListener`](#department-list-change-listener) либо в результате вызова метода [`getDepartmentList()`](#get-department-list) протокола [`MessageStream`](#message-stream).

### Метод `getKey()` { #get-key }

Ключ отдела необходим для начала чата с определенным отделом метод ([`startChat(departmentKey:)`](#start-chat-department-key) метод [`MessageStream`](#message-stream)).

Тип возвращаемого значения — `String`.

### Метод `getName()`

Возвращает публичное имя отдела.

Тип возвращаемого значения — `String`.

### Метод `getDepartmentOnlineStatus()` { #get-department-online-status }

Возвращает онлайн-статус отдела.

Тип возвращаемого значения — [`DepartmentOnlineStatus`](#department-online-status).

### Метод `getOrder()`

Возвращает номер, представляющий порядок вывода отдела в списке. Более высокое число означает более высокий приоритет вывода отдела в списке.

Тип возвращаемого значения — `Int`.

### Метод `getLocalizedNames()`

Возвращает словарь локализованных имен отдела, если таковой существует.

Тип возвращаемого значения — опциональный `[String: String]`. Ключ — название локали, значение — соответствующее локали название отдела.

### Метод `getLogoURL()`

Возвращает URL логотипа отдела (если таковой существует).

Тип возвращаемого значения — опциональный URL.

---

## Перечисляемый тип `DepartmentOnlineStatus` { #department-online-status }

Возможные статусы отдела. Могут быть получены в результате вызова метода [`getDepartmentOnlineStatus()`](#get-department-online-status) протокола [`Department`](#department).

### Случай `busyOffline`

Офлайн, лимит чатов превышен.

### Случай `busyOnline`

Онлайн, лимит чатов превышен.

### Случай `offline`

Посетитель может отправлять офлайн-сообщения.

### Случай `online`

Посетитель может отправлять онлайн-сообщения.

### Случай `unknown`

Текущий статус не поддерживается данной версией `WebimMobileSDK`.

---

## Перечисляемый тип `DeleteMessageError` { #delete-message-error }

Возможные ошибки, которые могут быть переданы в параметр `error` при вызове метода `DeleteMessageCompletionHandler.onFailure(messageID:error:)`.

### Случай `unknown`

Неизвестная ошибка.

### Случай `notAllowed`

На сервере отключена возможность удаления сообщений.

### Случай `messageNotOwned`

Посетитель может удалять только свои сообщения. Указанный идентификатор принадлежит чужому сообщению.

### Случай `messageNotFound`

Выбранное сообщение не найдено.

---

## Протокол `Operator` { #protocol-operator }

Объект протокола — это абстрактное представление каждого конкретного оператора чата. Объекты протокола `Operator` могут быть получены в методах протокола [`CurrentOperatorChangeListener`](#current-operator-change-listener) и методом [`getCurrentOperator()`](#get-current-operator) протокола [`MessageStream`](#message-stream).

### Метод `getID()` { #operator-get-id }

Метод позволяет получить ID конкретного оператора.

Возвращает ID конкретного оператора. Тип — `String`.

### Метод `getName()` { #operator-get-name }

Метод позволяет получить имя конкретного оператора.

Возвращает имя конкретного оператора. Тип — `String`.

### Метод `getAvatarURL()`

Метод позволяет получить URL для скачивания аватара конкретного оператора (если есть).

Возвращает URL  для скачивания аватара конкретного оператора или `nil`.

### Метод `getTitle()`

Метод позволяет получить заголовок сотрудника.

Возвращает заголовок сотрудника. Тип — опциональный `String`.

---

## Протокол `Visitor` { #visitor }

Объект протокола предоставляет сведения о текущем посетителе. Может быть получен методом [`getVisitor()`](#get-visitor) протокола [`MessageStream`](#message-stream).

### Метод `getIcon()`

Возвращает иконку посетителя. Тип — опциональный [`Icon`](#icon).

### Метод `getID()` { #visitor-get-id }

Возвращает уникальный идентификатор посетителя. Тип — `String`.

### Метод `getVisitorFields()`

Возвращает поля посетителя. Тип — опциональный [`VisitorFields`](#visitor-fields).

### Метод `getVisitorFieldsInDictionary()`

Возвращает поля посетителя в виде словаря. Тип — опциональный `[String: String]`.

---

## Протокол `VisitorFields` { #visitor-fields }

Предоставляет поля посетителя, полученные из серверной конфигурации. Может быть получен методом `getVisitorFields()` протокола [`Visitor`](#visitor).

### Метод `getName()`

Возвращает имя посетителя. Тип — опциональный `String`.

### Метод `getEmail()`

Возвращает email посетителя. Тип — опциональный `String`.

### Метод `getPhone()`

Возвращает телефон посетителя. Тип — опциональный `String`.

### Метод `getFirstCustomField()`

Возвращает первое пользовательское поле. Тип — опциональный `String`.

### Метод `getSecondCustomField()`

Возвращает второе пользовательское поле. Тип — опциональный `String`.

### Метод `getThirdCustomField()`

Возвращает третье пользовательское поле. Тип — опциональный `String`.

---

## Протокол `Icon` { #icon }

Предоставляет иконку посетителя. Может быть получен методом `getIcon()` протокола [`Visitor`](#visitor).

### Метод `getColor()`

Возвращает цвет иконки. Тип — опциональный `UIColor`.

### Метод `getShape()`

Возвращает форму иконки. Тип — опциональный `String`.

---

## Протокол `WebimRemoteNotification` { #webim-remote-notification }

Объект протокола — это абстрактное представление конкретного push-уведомления, полученного приложением от сервиса **Webim**. Объекты протокола `WebimRemoteNotification` могут быть получены с помощью метода [`parse(remoteNotification:)`](#parse-remote-notification) класса [`Webim`](#webim).

### Метод `getType()` { #webim-remote-notification-get-type }

С помощью этого метода можно уточнить полезную информацию конкретного объекта [`WebimRemoteNotification`](#webim-remote-notification).

Возвращает значение перечисляемого типа [`NotificationType`](#notification-type).

### Метод `getEvent()` { #get-event }

С помощью этого метода можно уточнить предполагаемое действие, которое подразумевает получение данного конкретного объекта [`WebimRemoteNotification`](#webim-remote-notification).

Возвращает значение перечисляемого типа [`NotificationEvent`](#notification-event) или `nil`.

### Метод `getParameters()` { #get-parameters }

С помощью этого метода можно уточнить полезную нагрузку конкретного объекта [`WebimRemoteNotification`](#webim-remote-notification), зависящую от его типа и содержащуюся в массиве.

Возвращает массив типа `String`. Возможные варианты содержания массива — см. в описании перечисляемого типа [`NotificationType`](#notification-type).

### Метод `getLocation()`

Метод может быть вызван для получения местоположение чата.

Возвращает опциональное значение типа `String`.

### Метод `getUnreadByVisitorMessagesCount()`

Метод может быть вызван для получения количества непрочитанных пользователем сообщений.

Возвращает количество сообщений. Тип — `Int`.

---

## Протокол `WebimAlert` { #webim-alert }

Протокол предназначен для работы с предупреждениями (алертами).

### Метод `present(title:message)`

Метод используется для показа предупреждений о стандартных ошибках.
Параметр `title` — заголовок предупреждения, тип — `WebimAlertTitle`.
Параметр `message` — содержимое предупреждения, тип — `WebimAlertMessage`.

---

## Перечисляемый тип `WebimAlertTitle` { #webim-alert-title }

Тип содержит варианты заголовка предупреждения.

### Случай `accountError`

Ошибка доступа к аккаунту.

### Случай `networkError`

Ошибка доступа к сети.

### Случай `visitorActionError`

Означает тип ошибки, связанной с действиями посетителя.

---

## Перечисляемый тип `WebimAlertMessage` { #webim-alert-message }

Тип содержит варианты текста предупреждения.

### Случай `accountConnectionError`

Аккаунт недоступен или неактивен.

### Случай `fileDeletingError`

Не удалось удалить файл.

### Случай `fileSendingError`

Не удалось отправить файл.

### Случай `operatorRatingError`

Означает содержимое ошибки, связанной с оценкой оператора.

### Случай `noNetworkConnection`

Нет сетевого подключения.

---

## Перечисляемый тип `NotificationType` { #notification-type }

Значения типа указывают на тип полезной информации в конкретном push-уведомлении — получаются методом [`getType()`](#webim-remote-notification-get-type) протокола [`WebimRemoteNotification`](#webim-remote-notification). Имена кейсов совпадают с публичным API Swift.

### Случай `contactInformationRequest`

Оператор отправил посетителю запрос контактных данных.

Массив параметров (см. [`getParameters()`](#get-parameters)) в этом случае пустой.

### Случай `operatorAccepted`

Оператор подключился к чату.

Словарь параметров (см. метод [`getParameters()`](#get-parameters) протокола [`WebimRemoteNotification`](#webim-remote-notification)) в этом случае содержит только одно значение — имя оператора.

### Случай `operatorFile`

Означает событие, когда оператор прислал файл в чат.

Словарь параметров (см. метод [`getParameters()`](#get-parameters) протокола [`WebimRemoteNotification`](#webim-remote-notification)) в этом случае содержит два значения — имя оператора и название файла.

### Случай `operatorMessage`

Оператор прислал текстовое сообщение.

Словарь параметров (см. метод [`getParameters()`](#get-parameters) протокола [`WebimRemoteNotification`](#webim-remote-notification)) в этом случае содержит два значения — имя оператора и текст сообщения.

### Случай `widget`

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

Словарь параметров (см. метод [`getParameters()`](#get-parameters) протокола [`WebimRemoteNotification`](#webim-remote-notification)) в этом случае пустой.

### Случай `rateOperator`

Оператор отправил посетителю запрос оценки.

Словарь параметров (см. метод [`getParameters()`](#get-parameters) протокола [`WebimRemoteNotification`](#webim-remote-notification)) в этом случае пустой.

---

## Перечисляемый тип `NotificationEvent` { #notification-event }

Ожидаемое действие приложения при получении push-уведомления — значение возвращает метод [`getEvent()`](#get-event) протокола [`WebimRemoteNotification`](#webim-remote-notification).

### Случай `add`

Добавить информацию из уведомления (см. [`getType()`](#webim-remote-notification-get-type) и [`getParameters()`](#get-parameters)).

### Случай `delete`

Удалить информацию, на которую указывает уведомление (см. [`getType()`](#webim-remote-notification-get-type) и [`getParameters()`](#get-parameters)).

---

## Протокол `FatalErrorHandler` { #fatal-error-handler }

Методы протокола вызываются при необходимости обработке ошибок, которые может возвращать сервис **Webim** в процессе работы. Описания ошибок см. в значениях перечисляемого типа [`FatalErrorType`](#fatal-error-type)

### Метод `on(error:)` { #on-error }

Вызывается при получении ошибки сервиса **Webim**. В параметр передаётся объект протокола [`WebimError`](#webim-error).

!!! Warning "Внимание!"
    Метод вызывается не из главного потока!

---

## Перечисляемый тип `FatalErrorType` { #fatal-error-type }

Возможные ошибки сервиса **Webim** (см. [`getErrorType()`](#get-error-type) у [`WebimError`](#webim-error)). Имена кейсов совпадают с публичным API Swift. Большинство вариантов фатальны и приводят к уничтожению сессии.

### Случай `accountBlocked`

Аккаунт в **Webim** заблокирован (например, за неуплату). К действиям посетителя не привязано. Обычно показывают сообщение с предложением зайти в чат позже.

Вызывает уничтожение сессии.

### Случай `providedVisitorFieldsExpired`

Данные посетителя, переданные при создании сессии (см. [`set(visitorFieldsJSONString:)`](#set-visitor-fields-json-string-json-string) и [`set(visitorFieldsJSONData:)`](#set-visitor-fields-json-data-json-data) у [`SessionBuilder`](#session-builder)), устарели. Нужно заново сформировать данные и создать новую сессию.

Вызывает уничтожение сессии.

### Случай `unknown`

Неожиданная ошибка. Имеет смысл отправить отчёт об ошибке и показать пользователю общее сообщение. Текст см. в [`getErrorString()`](#webim-error-get-error-string) у [`WebimError`](#webim-error).

Вызывает уничтожение сессии.

### Случай `visitorBanned`

Посетитель с переданными данными заблокирован оператором и не может писать в чат.

Вызывает уничтожение сессии.

### Случай `wrongProvidedVisitorHash`

Ошибка в механизме авторизации приложения: передана неверная подпись или хеш данных посетителя. К действиям пользователя обычно не привязано.

Вызывает уничтожение сессии.

### Случай `initializationFailed`

Ошибка при инициализации сессии (в том числе ответ сервера с ошибкой на этапе установления сессии). Уточняющий текст — в [`getErrorString()`](#webim-error-get-error-string) у [`WebimError`](#webim-error).

Вызывает уничтожение сессии.

---

## Протокол `WebimError` { #webim-error }

Объекты `WebimError` передаются в параметр `error` метода [`on(error:)`](#on-error) протокола [`FatalErrorHandler`](#fatal-error-handler). Методы протокола предназначены для обработки фатальных ошибок, которые могут возникать при работе с сервисом **Webim**.

### Метод `getErrorType()` { #get-error-type }

Метод предназначен для получения конкретного типа возникшей ошибки.

Возвращает значение перечисляемого типа [`FatalErrorType`](#fatal-error-type).

### Метод `getErrorString()` { #webim-error-get-error-string }

Метод может быть вызван для получения текстового представления возникшей ошибки.

Возвращает текстовое представление возникшей ошибки. Тип — `String`.

---

## Протокол `WebimNotFatalError` { #webim-not-fatal-error }

Объекты `WebimNotFatalError` передаются в параметр `error` метода [`onError(error:)`](#not-fatal-error-handler-on-error) протокола [`NotFatalErrorHandler`](#not-fatal-error-handler).

### Метод `getErrorType()` { #webim-not-fatal-error-get-error-type }

Метод предназначен для получения конкретного типа возникшей ошибки.

Возвращает значение типа [`NotFatalErrorType`](#not-fatal-error-type).

### Метод `getErrorString()`

Метод может быть вызван для получения текстового представления возникшей ошибки.

Возвращает текстовое представление возникшей ошибки. Тип — `String`.

---

## Перечисляемый тип `AccessError` { #access-error }

Ошибки, которые могут выбрасывать методы протоколов [`WebimSession`](#webim-session), [`MessageStream`](#message-stream) и [`MessageTracker`](#message-tracker). Имена кейсов совпадают с публичным API Swift.

### Случай `invalidThread`

Метод вызван не из потока, в котором был создан экземпляр сессии.

### Случай `invalidSession`

Вызов методов у уже уничтоженной или недействительной сессии (например, после [`destroy()`](#destroy)).

---

## Протокол `WebimLogger` { #webim-logger }

Протокол, предоставляющий методы для реализации «логирования» сетевой активности `WebimMobileSDK`. Механизм может быть полезен, например, при отладке продуктовых-релизов, в которых не доступны `DEBUG`-логи.

### Метод `log(entry:)`

Метод, который вызывается автоматически при выходе новой записи для лога сетевой активности `WebimMobileSDK`.

Новая запись передаётся в параметре `entry` (тип — `String`).

---

## Возвращаемые HTTP-коды ошибок

| Категория                                                            | Код ошибки                               | Значение и возможный путь решения                                                                                                                                                                                                                                                                                                                                                                                                     |
|----------------------------------------------------------------------|------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Общие ошибки                                                         |                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|                                                                      | `account-blocked`                        | Аккаунт клиента в сервисе **Webim** заблокирован (например, за неуплату). Обратитесь за помощью в техподдержку сервиса **Webim**                                                                                                                                                                                                                                                                                                      |
|                                                                      | `chat-required`                          | Ответ на действие в чате без чата                                                                                                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `content_type_not_recognized`            | MIME-тип вложения не распознан. Проверьте, не повреждён ли отправляемый вами файл. Также удостоверьтесь, что его содержимое соответствует одному из [MIME-типов](https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_MIME-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2)                                                                                                                                                              |
|                                                                      | `domain-not-from-whitelist`              | Домен не находится в белом списке                                                                                                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `max_file_size_exceeded`                 | Размер загружаемого файла слишком велик. Попробуйте уменьшить размер файла или увеличить лимит на вес загружаемых файлов                                                                                                                                                                                                                                                                                                              |
|                                                                      | `file_size_too_small`                    | Размер загружаемого файла слишком мал. Возможно, вы пытаетесь загрузить пустой файл                                                                                                                                                                                                                                                                                                                                                   |
|                                                                      | `not_allowed_file_type`                  | Загрузка файла данного формата запрещена или не поддерживается. Измените параметр, отвечающий за допустимые к загрузке типы файлов в настройках сервера                                                                                                                                                                                                                                                                               |
|                                                                      | `not_allowed_mime_type`                  | Загрузка файла данного MIME-типа запрещена или не поддерживается. Измените параметр, отвечающий за допустимые к загрузке MIME-типы файлов в настройках сервера                                                                                                                                                                                                                                                                        |
|                                                                      | `no_previous_chats`                      | Отсутствуют предыдущие чаты                                                                                                                                                                                                                                                                                                                                                                                                           |
|                                                                      | `no-sticker-id`                          | Для данного ID не существует привязанного к нему стикера. Проверьте свой запрос на предмет ошибок                                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `not_matching_magic_numbers`             | Магические числа не совпадают                                                                                                                                                                                                                                                                                                                                                                                                         |
|                                                                      | `max_files_count_per_chat_exceeded`      | Достигнуто максимальное количество отправляемых в один чат файлов                                                                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `provided-visitor-expired`               | Представленные при создании сессии пользовательские данные более недействительны. Эта ошибка разрешается автоматически путём реинициализации                                                                                                                                                                                                                                                                                          |
|                                                                      | `reinit-required`                        | Необходима реинициализация — вероятнее всего, устарел AuthToken. Эта ошибка разрешается автоматически путём реинициализации                                                                                                                                                                                                                                                                                                           |
|                                                                      | `setting_disabled`                       | Запрашиваемая настройка отключена                                                                                                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `server-not-ready`                       | Сервер не готов ответить на запрос. Эта ошибка появляется при попытке обратиться к серверу до его полного включения. Попробуйте немного подождать                                                                                                                                                                                                                                                                                     |
|                                                                      | `session_not_found`                      | Искомая сессия не найдена                                                                                                                                                                                                                                                                                                                                                                                                             |
|                                                                      | `unathorized`                            | Попытка неавторизованного доступа. Необходима авторизация                                                                                                                                                                                                                                                                                                                                                                             |
|                                                                      | `uploaded-file-not-found`                | Загруженный файл не найден                                                                                                                                                                                                                                                                                                                                                                                                            |
|                                                                      | `visitor_banned`                         | Посетитель был заблокирован оператором                                                                                                                                                                                                                                                                                                                                                                                                |
|                                                                      | `wrong-argument-value`                   | Ошибка возникает при поступлении на сервер запроса с неверным типом аргумента (например, String вместо int)                                                                                                                                                                                                                                                                                                                           |
|                                                                      | `wrong-provided-visitor-hash-value`      | Ошибка возникает при попытке авторизации посетителя с невалидной подписью                                                                                                                                                                                                                                                                                                                                                             |
| Ошибки цитирования сообщений в чате                                  |                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|                                                                      | `quoting-message-that-cannot-be-replied` | Сообщение не может быть процитировано — оно не отмечено флагом `canBeReplied` или флаг не стоит в значении `true`                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `quoting-message-from-another-visitor`   | Отправленный ID сообщения соответствует другому посетителю                                                                                                                                                                                                                                                                                                                                                                            |
|                                                                      | `corrupted-quoted-message-id`            | Неверный ID цитируемого сообщения                                                                                                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `multiple-quoted-messages-found`         | Отправленный ID сообщения соответствует нескольким сообщениям (скорее всего, имеет место ошибка в базе данных)                                                                                                                                                                                                                                                                                                                        |
|                                                                      | `quoted-message-not-found`               | Отправленный ID не соответствует какому-либо сообщению в базе данных                                                                                                                                                                                                                                                                                                                                                                  |
|                                                                      | `required-quote-args-missing`            | Один или более аргумент реализованной на сервере системы цитирования не был отправлен                                                                                                                                                                                                                                                                                                                                                 |
| Ошибки, связанные с аутентификацией                                  |                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|                                                                      | `provided-auth-token-not-found`          | Токен аутентификации не найден на сервере. Данная ошибка возникает только в случае использования кастомного клиентского механизма аутентификации через токен. Вероятнее всего, токен ещё не дошёл до сервиса **Webim** с клиентского сервера и надо немного подождать                                                                                                                                                                   |
| Ошибки, связанные с отправкой, редактированием и удалением сообщений |                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|                                                                      | `message_empty`                          | Попытка отправить пустое сообщение                                                                                                                                                                                                                                                                                                                                                                                                    |
|                                                                      | `max-message-length-exceeded`            | Достигнута максимально допустимая длина сообщения                                                                                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `message_not_found`                      | Сообщение с искомым ID не найдено                                                                                                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `not_allowed`                            | На сервере отключена возможность редактирования/удаления сообщений                                                                                                                                                                                                                                                                                                                                                                    |
|                                                                      | `message_not_owned`                      | Посетитель пытается редактировать/удалить сообщение оператора или указанный идентификатор принадлежит другому сообщению                                                                                                                                                                                                                                                                                                               |
|                                                                      | `wrong_message_kind`                     | Посетитель пытается отредактировать нетекстовое сообщение                                                                                                                                                                                                                                                                                                                                                                             |
| Ошибки оценки операторов                                             |                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|                                                                      | `no-chat`                                | Возникает в следующих случаях:<br><br><ul><li>При попытке отправить оценку оператора, когда чата не существует</li><li>При попытке отправить нажатие на клавиатуру бота, когда чата не существует</li><li>При отправке сообщения посетителю, когда чата не существует и в [account config](https://webim.ru/kb/for-admins/service-pages/account-config-editor.html) значение свойста `force_start_chat_on_visitor_message` равно `false`</li></ul> |
|                                                                      | `operator-not-in-chat`                   | Возникает, когда при попытке отправить оценку оператора был передан ID оператора, не принадлежащего текущему чату                                                                                                                                                                                                                                                                                                                     |
|                                                                      | `note-is-too-long`                       | Превышен лимит максимальной длины комментария — 2000 символов                                                                                                                                                                                                                                                                                                                                                                         |
| Ошибки ответов клавиатуры                                            |                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|                                                                      | `button-id-not-set`                      | Не установлен идентификатор кнопки                                                                                                                                                                                                                                                                                                                                                                                                    |
|                                                                      | `requset-message-id-not-set`             | Не установлен идентификатор сообщения запроса                                                                                                                                                                                                                                                                                                                                                                                         |
|                                                                      | `can-not-create-response`                | Невозможно создать ответ                                                                                                                                                                                                                                                                                                                                                                                                               |
| Ошибки отправки диалогов по электронной почте                        |                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|                                                                      | `chat-history-sent-too-many-times`       | История переписки была отправлена слишком много раз                                                                                                                                                                                                                                                                                                                                                                                   |
| Ошибки опросов                                                       |                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|                                                                      | `survey_disabled`                        | Возникает при попытке отправить ответ на вопрос при выключенной возможности опросов на сервере                                                                                                                                                                                                                                                                                                                                         |
|                                                                      | `no-current-survey`                      | Возникает при попытке отправить ответ на вопрос, когда текущий опрос на сервере уже был закрыт или ещё не был начат                                                                                                                                                                                                                                                                                                                   |
|                                                                      | `incorrect-survey-id`                    | Возникает при попытке отправить ответ на вопрос, передавая неверный ID опроса                                                                                                                                                                                                                                                                                                                                                         |
|                                                                      | `incorrect-stars-value`                  | Возникает, когда был передан неправильный ответ на вопрос типа 'stars'                                                                                                                                                                                                                                                                                                                                                                |
|                                                                      | `incorrect-radio-value`                  | Возникает, когда был передан неправильный ответ на вопрос типа 'radio'                                                                                                                                                                                                                                                                                                                                                                |
|                                                                      | `max-comment-length-exceeded`            | Возникает, когда был отправлен ответ на вопрос типа 'comment', превосходящий максимально разрешенную длину                                                                                                                                                                                                                                                                                                                            |
|                                                                      | `question-not-found`                     | Вопрос не найден                                                                                                                                                                                                                                                                                                                                                                                                                      |
| Ошибки удаления файлов                                               |                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|                                                                      | `file-has-been-sent`                     | Файл прикреплён к сообщению и не может быть удалён                                                                                                                                                                                                                                                                                                                                                                                    |
|                                                                      | `file-not-found`                         | Файл не найден                                                                                                                                                                                                                                                                                                                                                                                                                        |

---

Источник: https://webim.ru/kb/mobile/sdk/v-4-0/ios-sdk-handbook.html
