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

Управление пользователем

Авторизация пользователя

func authorize(user: ChatUser, auth: ChatAuth = ChatAuth())

Вызывается до открытия экрана чата, когда в родительском приложении становится известен пользователь.

Параметры:

  • user: Объект ChatUser, содержащий информацию о пользователе. (обязательный параметр)
  • auth: ChatAuth. Настройки кастомной авторизации (опционально, обговаривается при интеграции).

Требования к идентификатору пользователя

Identifier — критично для безопасности и уникальности

Поле identifier объекта ChatUser должно быть:

  • Уникальным — один ID соответствует ровно одному пользователю
  • Постоянным — не меняется при переустановке приложения или смене сессии
  • Устойчивым к подбору — не используйте номера телефонов, email и другие публично известные данные

Если использование таких данных неизбежно — обязательно применяйте RSA-шифрование. По вопросам шифрования: support@edna.ru

Параметры ChatAuth

ПолеТипОбязательныйОписание
tokenString?Нет (default nil)Токен авторизации
schemeString?Нет (default nil)Схема авторизации
methodChatAuthMethodНет (default .headers)Способ передачи: .headers или .cookies
signatureString?Нет (default nil)Подпись
isEncryptedBoolНет (default false)Используется ли шифрование подписи

Параметры ChatUser

ПолеТипОбязательныйОписание
identifierStringДаУникальный, постоянный, устойчивый к подбору ID пользователя. См. Требования к идентификатору.
nameString?Нет (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()

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