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

Внедрение в жизненный цикл приложения

Описание процесса интеграции 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()

// Далее следует логика перехода на экран авторизации приложения
}
примечание

При повторном входе в авторизованную зону пользователь должен быть установлен