Методы взаимодействия
Инициализация
Перед использованием СДК необходимо инициализировать один раз при старте приложения.
Метод ChatHDE.shared.configure(...) принимает следующие параметры:
serverOptions- данные сервера, такие как:socketUrl- URL сокетаoriginUrl- исходный URL системыuploadUrl- URL для загрузки файлов- Во процессе работы приложения эти настройки можно изменить с помощью метода
setServerOptions(options: ServerOptions), в качестве заглушки можно использовать любой домен
В большинстве стандартных установок эти параметры можно получить автоматически, вызвав: ServerOptions.fromDomain(domain: String)
Если же сервер был настроен индивидуально (нестандартные адреса для загрузки или сокета), используйте явное создание объекта ServerOptions с нужными значениями.
-
chatOptions- настройки чата, такие как:saveUserAfterConnection- сохранение данных пользователя после подключения и автоматическое их восстановление при подвторном открытии чатаmaxUploadFileSizeMB- максимальный размер загружаемых файлов (в мегабайтах)welcomeMessageтекст приветственного сообщения (если есть)botName- имя бота, оправившего приветственного сообщения (если есть)maxRateCommentLength- максимальный размер комментария на странице оцениванияrateSuccessTime- длительность показа сообщения об успешной оценкеerrorTime- длительность показа баннера ошибки в чате
-
ticketOptions- настройки тикета, (по умолчанию все null, при установке значений параметров, при загрузке чата с новым пользователем, перед ичпользованим чата будет отображена страница, где нужно будет заполнить данные). Доступные параметры:showNameField- показывать ли поле ввода имениshowEmailField- показывать ли поле ввода эл-почтыisEmailRequired- обязательно ли указание эл-почтыconsentLink- ссылка на согласие на обработку персональных данных
-
uiConfig- настройки UI (подробнее см. UI) -
logs- показывать ли логи (по тегу ChatHDE)
Пример использования:
ChatHDE.shared.configure(
serverOptions: ServerOptions.fromDomain("example.com"),
chatOptions: ChatOptions(
welcomeMessage: "hello",
botName: "bot",
saveUserAfterConnection: true,
maxUploadFileSizeMB: 20
),
ticketOptions: TicketOptions(
showNameField: true,
showEmailField: true,
isEmailRequired: true,
consentLink: "https://google.com"
),
logs: true
)
Подключение к серверу
Во время работы SDK можно задать параметры сервера
await ChatHDE.shared.setServerOptions(ServerOptions.fromDomain("example.com"))
Для старта работы чата необходимо подключиться к серверу
await ChatHDE.shared.connect()
Отключение от сервера
await ChatHDE.shared.disconnect()
Работа с пользователями
Для открытия чата определенного пользователя, перед подключением необходимо установить данные пользователя
// Сначала указание пользователя
await ChatHDE.shared.setUser(
UserData(
id: "d4fa689d-ae1c-4402-800b-c234ec1078d7",
name: "Client 123",
email: ""
)
)
...
// Потом подключение
await ChatHDE.shared.connect()
Данные нового пользоватея приходят от сервера в составе инициирующего сообщения. Для их получения требуется подписаться на поток ChatHDE.shared.messagingEventsStream() и отследить сообщение MessagingEvent.server.initWidget (подробнее см. События)
Task { @MainActor in
let stream = await ChatHDE.shared.messagingEventsStream()
for await event in stream {
if case .server(.initWidget(response: let resp)) = event {
let userData = resp.data.userData
}
}
}
Чтобы открыть новый чат с новым пользователем, нужно очистить данные старого, если они были
// Сбросить данные
await ChatHDE.shared.clearUser()
...
// Подключиться заново
await ChatHDE.shared.connect()
Отправка сообщений
Для отправки сообщения из кода, можно использовать метод sendMessage
await ChatHDE.shared.sendMessage(VisitorMessage(text: "Hello"))
Локальные сообщения
SDK поддерживает отображение виртуальных сообщений — они создаются приложением и видны только пользователю. Такие сообщения исчезают при появлении новых реальных сообщений от сервера или пользователя.
Можно добавить кастомную обработку нажатия на кнопки, см. Обработчики
await ChatHDE.shared.sendVirtualMessage(
name: "Shop",
text: "Выберите категорию товаров",
chatButtons: [
ChatButton(text: "Телефоны", type: "custom"),
ChatButton(text: "Наушники"),
ChatButton(text: "Планшеты"),
]
)
Передача дополнительных данных
В SDK присутствует возможность передавать дополнительные данные при отправке сообщений на сервер. Для этого можно переопределить функции:
- старта нового чата
setStartVisitorChatAction - отправки сообщений
clickSendAction - нажатия на текстовую кнопку
clickChatButtonAction.on
- Передача дополнительных данных при старте чата после ввода данных пользователя.
ChatHDE.shared.setStartVisitorChatAction {data in
let wrap = data.withAdditionalData([
"comment": "System comment"
])
await ChatHDE.shared.startVisitorChat(wrap)
}
- Передача дополнительных данных при отправке первого сообщения пользователя. (Стоит использовать при отсутствии стартовой страницы указания данных пользователя и его запроса)
ChatHDE.shared.clickSendAction = {txt in
Task {
var message = VisitorMessage(text: txt)
if await ChatHDE.shared.isUserMessageHistoryEmpty() {
message = message.withAdditionalData(["comment": "System comment"])
}
await ChatHDE.shared.sendMessage(message)
}
}
- Передача дополнительных данных при нажатии на текстовую кнопку в сообщении
ChatHDE.shared.clickChatButtonAction.on(ButtonTypes.text) {btn in
Task {
var message = VisitorMessage(text: btn.text)
if await ChatHDE.shared.isUserMessageHistoryEmpty() {
message = message.withAdditionalData(["comment": "System comment"])
}
await ChatHDE.shared.sendMessage(message)
}
}
Метод isUserMessageHistoryEmpty возвращает true если в чате еще не было сообщений от пользователя и при этом чат активный. Если заявка была закрыта (следующее сообщение пользователя запустит новый чат), функиця также вернет true.
await ChatHDE.shared.isUserMessageHistoryEmpty()
При необходимости передать данные явно в тексте первого сообщения пользователя, можно переопределить метод clickSendAction и реализовать там подобную логику.
ChatHDE.shared.clickSendAction = {txt in
Task {
var message = VisitorMessage(text: txt)
if await ChatHDE.shared.isUserMessageHistoryEmpty() {
message.text = "Prepend message\n" + message.text
}
await ChatHDE.shared.sendMessage(message)
}
}
Сохранение состояния чата
SDK поддерживает сохранение и восстановление дополнительного состояния чата, которое не приходит с сервера при повторном подключении. К таким данным относятся, например:
- кнопки последнего сообщения (текст приходит с сервера, но кнопки сохраняются на клиенте),
- список сообщений, находящихся в процессе загрузки,
- другие временные данные, которые должны восстанавливаться при возврате в чат.
Чтобы получить текущее состояние, используйте метод:
let savedData = await ChatHDE.shared.getSavedData()
Полученное значение можно сохранить, например в Shared Preferences, затем восстановить состояние чата перед подключением.
await ChatHDE.shared.setSavedData(savedData)
...
await ChatHDE.shared.connect()
Данные функции корректно работают только при saveUserAfterConnection = true, задаваемом в ChatHDE.shared.configure(...)
Чтобы удалить из памяти SDK данные чата, можно использовать
await ChatHDE.shared.clearSavedData()