Управление пользователем
Авторизация пользователя
func authorize(user: ChatUser, auth: ChatAuth = ChatAuth())
Вызывается до открытия экрана чата, когда в родительском приложении становится известен пользователь.
Параметры:
user: ОбъектChatUser, содержащий информацию о пользователе. (обязательный параметр)auth:ChatAuth. Настройки кастомной авторизации (опционально, обговаривается при интеграции).
Требования к идентификатору пользователя
Поле identifier объекта ChatUser должно быть:
- Уникальным — один ID соответствует ровно одному пользователю
- Постоянным — не меняется при переустановке приложения или смене сессии
- Устойчивым к подбору — не используйте номера телефонов, email и другие публично известные данные
Если использование таких данных неизбежно — обязательно применяйте RSA-шифрование. По вопросам шифрования: support@edna.ru
Параметры ChatAuth
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
token | String? | Нет (default nil) | Токен авторизации |
scheme | String? | Нет (default nil) | Схема авторизации |
method | ChatAuthMethod | Нет (default .headers) | Способ передачи: .headers или .cookies |
signature | String? | Нет (default nil) | Подпись |
isEncrypted | Bool | Нет (default false) | Используется ли шифрование подписи |
Параметры ChatUser
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
identifier | String | Да | Уникальный, постоянный, устойчивый к подбору ID пользователя. См. Требования к идентификатору. |
name | String? | Нет (default nil) | Имя для отображения в АРМ оператора |
data | [String: String]? | Нет (default nil) | Произвольные атрибуты пользователя; передаются в АРМ оператора и могут использоваться правилами маршрутизации при наличии соответствующих серверных настроек. Можно обновлять через updateData(data:). |
ChatAuth нужен только при кастомной авторизации (значения согласуются при интеграции); по умолчанию вызывайте authorize(user:) без второго параметра.
Пример использования:
// Создание модели пользователя
let chatUser = ChatUser(identifier: "user_uuid",
name: "Иван Иванов",
data: ["email": "ivan.ivanov@example.ru"])
// Авторизация пользователя в SDK
chatCenterSDK.authorize(user: chatUser)
authorize не возвращает результатМетод не бросает исключение и возвращается мгновенно — сетевой запрос идёт асинхронно. Сетевые ошибки приходят только через delegate.didReceiveNetwork(error:), поэтому назначьте делегат до вызова authorize.
Переключение между пользователями
Если в приложении возможен переход между разными аккаунтами (например, смена клиента в банковском приложении), выберите один из сценариев ниже в зависимости от того, нужно ли отписать предыдущего пользователя от пуш-уведомлений на сервере.
Сценарий 1: Полный выход (logout-кнопка, удаление аккаунта)
try chatCenterSDK?.logout()
// после успешного logout() — авторизация нового пользователя
chatCenterSDK?.authorize(user: newUser)
logout() закрывает сессию на сервере и отписывает устройство от пушей. После — authorize(user:) для нового пользователя. Подробности про асинхронность и сценарии сетевых ошибок — в секции Логаут пользователя ниже.
Сценарий 2: Смена пользователя в рамках сессии, прежний валиден на сервере
chatCenterSDK?.deauthorizeUser()
chatCenterSDK?.authorize(user: newUser)
deauthorizeUser() очищает только локальное состояние SDK. Пуши прежнему пользователю на этом устройстве продолжат приходить до его явного logout() или истечения серверной сессии. Подробности — в секции Удаление пользователя.
authorize с новым пользователем без logout или deauthorizeUserПрямой переход authorize(alice) → authorize(bob) без промежуточного logout()/deauthorizeUser() приводит к полной переконфигурации, но сессия и подписка на пуши прежнего пользователя не закрываются. Всегда вызывайте logout() (полный выход) или deauthorizeUser() (без серверной отписки) перед сменой пользователя.
Сценарий 3: Повторная авторизация того же пользователя
| Сценарий | Поведение |
|---|---|
| Между вызовами ничего не происходило | Состояние сохраняется, повторных сетевых запросов нет |
Между вызовами был deauthorizeUser() или logout() | Полная переконфигурация: WebSocket переоткрывается, история перезагружается |
logout() — асинхронная серверная отпискаlogout() сначала открывает WebSocket и только при успехе отправляет offline-сигнал, чистит кэш и сбрасывает локальное состояние. При сетевой ошибке (WebSocket не открылся) метод не бросает исключение и не сообщает делегату, но и локальное состояние не очищается: пользователь остаётся авторизован в SDK, prefill не сбрасывается, устройство продолжает получать пуши. Отслеживайте сбой через логи SDK и при необходимости повторяйте logout().
Обновление данных пользователя
mutating func updateData(data: [String: String]?)
Обновляет данные пользователя. Отправляются на сервер при открытии экрана чата, если в момент открытия WebSocket-соединение активно.
Параметры:
data: Словарь[String: String]?с произвольными атрибутами пользователя. Передайтеnilдля очистки данных.
Пример использования:
// 1. Создание и авторизация пользователя с базовыми данными
var chatUser = ChatUser(identifier: "user_uuid",
name: "Иван Иванов")
chatCenterSDK.authorize(user: chatUser)
// 2. Позднее — обновление данных пользователя
chatUser.updateData(data: ["email": "ivan.ivanov@example.ru",
"segment": "premium",
"city": "Москва"])
updateData- Отправка привязана к
viewDidAppearконтроллера чата и срабатывает только при активном WebSocket. Если соединение было закрыто, при первом открытии чата SDK его лишь переоткрывает — данные уйдут при следующем открытии чата с активным соединением. - Метод объявлен как
mutating— переменнаяChatUserдолжна бытьvar, неlet. ВызывайтеupdateDataна той же переменной, которую передавали вauthorize— изменения сразу видны SDK, повторныйauthorizeне нужен.
updateData не персистится — если приложение завершится до открытия экрана чата, изменения теряются. Для гарантии доставки пересобирайте ChatUser с актуальными значениями при applicationDidBecomeActive или перед каждым authorize(user:).
Предзаполнение поля ввода
func prefill(message: String)
Устанавливает текст, который будет подставлен в поле ввода при следующем открытии экрана чата. Текст подставляется однократно — при первом вызове getChat() после prefill, затем сбрасывается.
Пример использования:
// Установка предзаполненного сообщения
chatCenterSDK.prefill(message: "Здравствуйте, у меня вопрос по заказу №12345")
// При следующем открытии чата текст будет в поле ввода
do {
let chatController = try chatCenterSDK.getChat()
navigationController?.pushViewController(chatController, animated: true)
} catch {
print("Ошибка открытия чата: \(error)")
}
prefill- Передача пустой строки сбрасывает предзаполненный текст.
- Повторный вызов
prefill(message:)перезаписывает предыдущее значение. deauthorizeUser()сбрасывает предзаполненный текст синхронно.logout()сбрасывает его только при успешном завершении серверной отписки — при сетевой ошибке текст сохраняется (см. предупреждение про асинхронностьlogout()).
Логаут пользователя
func logout() throws(ChatCenterUIError)
Завершает сессию: отписывает устройство от пушей на сервере и очищает локальное состояние SDK. Перед повторным открытием чата необходима повторная authorize.
Выбрасывает: ChatCenterUIError.userNotAuthorized, если пользователь не был авторизован.
Пример использования:
do {
try chatCenterSDK?.logout()
// Пользователь успешно вышел
} catch {
print("Ошибка при выходе: \(error)")
}
Удаление пользователя
func deauthorizeUser()
Очищает локальное состояние SDK и закрывает WebSocket-соединение. Используйте при выходе в неавторизованную зону приложения (например, на экран ввода ПИН-кода). Перед повторным открытием чата необходима повторная authorize.
deauthorizeUser() не отписывает от пушейВ отличие от logout(), метод deauthorizeUser() не отписывает устройство от пуш-уведомлений на сервере. Пуши продолжат приходить до вызова logout() или до истечения сессии на сервере.
Пример использования:
chatCenterSDK?.deauthorizeUser()
Связанные разделы
- Отображение чата — открытие чата после авторизации
- Внедрение в жизненный цикл — полная схема интеграции
- Сообщения и счётчик непрочитанных — отправка сообщений и счётчик
- Справочник ошибок — ошибки
ChatCenterUIError