Внедрение в жизненный цикл приложения
Описание процесса интеграции ChatCenterUI SDK, с синхронизацией жизненных циклов основного приложения (App Lifecycle) и SDK.
Общая схема взаимодействия
Диаграмма ниже демонстрирует, как события жизненного цикла приложения должны инициировать соответствующие методы SDK для типовой интеграции.
1. Запуск приложения
Инициализация SDK должна происходить как можно раньше, обычно в методе application(_:didFinishLaunchingWithOptions:). Это критично для корректной работы и минимизации возможных ошибок интеграции.
Создание экземпляра класса ChatCenterUISDK происходит максимально быстро и в процессе не выполняется никаких сетевых запросов.
Файл: AppDelegate.swift
import ChatCenterUI
var chatCenterSDK: ChatCenterUISDK?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 1. Конфигурация (заглушка; заполните реальными URL/ключами)
let transport = ChatTransportConfig(cloudHost: "cloud.edna.ru")
let chatConfig = ChatConfig(transportConfig: transport)
// 2. Инициализация SDK
// providerUid — уникальный ID приложения, выданный edna
chatCenterSDK = ChatCenterUISDK(
providerUid: "YOUR_PROVIDER_UID",
chatConfig: chatConfig
)
return true
}
2. Авторизация пользователя
После того как ваше приложение авторизовало пользователя (например, выполнен вход в авторизованную зону), необходимо сообщить SDK данные пользователя. Это позволяет загрузить историю переписки конкретного клиента.
Файл: AuthService.swift / LoginViewModel.swift
func handleSuccessfulLogin(userId: String, userName: String?) {
guard let chatCenterSDK = (UIApplication.shared.delegate as? AppDelegate)?.chatCenterSDK else { return }
// Формируем объект пользователя
let chatUser = ChatUser(
identifier: userId, // устойчивый ID в вашей системе
name: userName, // опционально
data: ["segment": "premium"] // опционально, произвольные атрибуты, отображаемые в АРМ в профиле клиента
)
// Установка пользователя в СДК
chatCenterSDK.authorize(user: chatUser)
}
3. Открытие чата
Для отображения интерфейса чата SDK предоставляет готовый UIViewController. Его можно показать модально или запушить в ваш навигационный стек и т.д.
Файл: MainViewController.swift
@objc func openSupportChat() {
guard let chatCenterSDK = (UIApplication.shared.delegate as? AppDelegate)?.chatCenterSDK else { return }
// Получение контроллера чата
let result = Result { try chatCenterSDK.getChat() }
switch result {
case let .success(chatController):
// Открытие экрана чата
// Вариант А: Push (если есть NavigationController)
self.navigationController?.pushViewController(chatController, animated: true)
// Вариант Б: Modal
// self.present(chatController, animated: true, completion: nil)
case let .failure(error):
// Обработка ошибок жизненного цикла SDK
switch error {
case ChatCenterUIError.userNotAuthorized:
print("Не задан пользователь для чата")
case ChatCenterUIError.chatNotOpened:
print("Чат не открыт")
default:
print("Ошибка открытия чата: \(error)")
}
}
}
4. Выход пользователя
При выходе пользователя из аккаунта приложения необходимо разорвать сессию в SDK. Это удаляет локальные данные и отписывает устройство от пуш-уведомлений для этого пользователя.
Файл: ProfileViewModel.swift
func performLogout() {
guard let chatCenterSDK = (UIApplication.shared.delegate as? AppDelegate)?.chatCenterSDK else { return }
do {
// Очистка данных пользователя и разрыв соединения
try chatCenterSDK.logout()
print("Chat SDK: Logged out successfully")
} catch {
print("Chat SDK: Logout error: \(error)")
}
// Далее следует логика перехода на экран авторизации приложения
}
В случае наличия в приложении авторизованной зоны (закрытой вводом пин-кода) и необходимости завершения текущией сессии при выходе из нее, можно использовать метод deauthorizeUser(), для локального удаления пользователя и прекращения сетевой активности СДК.
func performLogout() {
guard let chatCenterSDK = (UIApplication.shared.delegate as? AppDelegate)?.chatCenterSDK else { return }
// Локальное удаление пользователя и разрыв соединения
chatCenterSDK.deauthorizeUser()
// Далее следует логика перехода на экран авторизации приложения
}
При повторном входе в авторизованную зону пользователь должен быть установлен