Внедрение в жизненный цикл приложения
Описание процесса интеграции ChatCenterUI SDK, с синхронизацией жизненных циклов основного приложения (App Lifecycle) и SDK.
Общая схема взаимодействия
Диаграмма ниже демонстрирует, как события жизненного цикла приложения должны инициировать соответствующие методы SDK для типовой интеграции.
1. Запуск приложения
Инициализацию SDK рекомендуется проводить в классе Application в методе onCreate(), чтобы SDK был готов к обработке входящих push-уведомлений независимо от того, какая Activity запущена.
Создание экземпляра класса ChatCenterUI происходит максимально быстро и в процессе не выполняется никаких сетевых запросов.
Файл: App.kt
import android.app.Application
import edna.chatcenter.ui.visual.core.ChatCenterUI
class App : Application() {
lateinit var chatCenterUI: ChatCenterUI
override fun onCreate() {
super.onCreate()
// Создание экземпляра
chatCenterUI = ChatCenterUI(applicationContext, loggerConfig).apply {
// providerUid — уникальный ID приложения, выданный edna
init("providerUid", ChatConfig())
}
}
}
Объект
ChatCenterUIимеет смысл хранить как Singleton (через классApplicationили DI), чтобы к нему был доступ из любых слоёв приложения.
2. Авторизация пользователя
После того как ваше приложение авторизовало пользователя (например, выполнен вход в авторизованную зону), необходимо сообщить SDK данные пользователя. Это позволяет загрузить историю переписки конкретного клиента.
Файл: AuthViewModel.kt
import edna.chatcenter.ui.visual.core.ChatCenterUI
import edna.chatcenter.ui.core.models.UserInfo
fun handleSuccessfulLogin(
userId: String,
userName: String,
userEmail: String?
) {
// Получаем инстанс SDK (например, через DI или из Application)
val chatCenterUI: ChatCenterUI = /* получить экземпляр */
// Формируем объект пользователя
// uuid — неизменяемый идентификатор клиента в вашей системе
val userInfo = ChatUser(
userId,
userName,
mapOf(
"email" to (userEmail ?: "")
)
)
// Авторизация в SDK
chatCenterUI.authorize(userInfo)
}
3. Открытие чата
SDK предоставляет готовый ChatFragment, который можно встроить в Activity через FragmentManager или через Navigation Component.
Файл: MainActivity.kt
import edna.chatcenter.ui.visual.fragments.ChatFragment
fun openSupportChat() {
// Получаем инстанс SDK (например, через DI или из Application)
val chatCenterUI: ChatCenterUI = /* получить экземпляр */
val chatFragment = chatCenterUI.getChatFragment()
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, chatFragment)
.addToBackStack(null)
.commit()
// Вариант с Navigation Component (если настроен graph):
// findNavController(R.id.nav_host_fragment)
// .navigate(R.id.action_global_chatFragment)
}
Перед открытием чата убедитесь, что пользователь уже авторизован в SDK (см. раздел «Логин пользователя»), иначе при открытии отобразится ошибка.
4. Выход пользователя
При выходе пользователя из аккаунта приложения необходимо разорвать сессию в SDK. Это удаляет локальные данные и отписывает устройство от пуш-уведомлений для этого пользователя.
Файл: ProfileViewModel.kt
import edna.chatcenter.ui.visual.core.ChatCenterUI
fun performLogout() {
val chatCenterUI: ChatCenterUI = /* получить экземпляр */
// Полная очистка сессии и данных пользователя
chatCenterUI.logout()
// Далее — навигация на экран логина приложения
navigateToLoginScreen()
}
В случае наличия в приложении авторизованной зоны (закрытой вводом пин-кода) и необходимости завершения текущией сессии при выходе из нее, можно использовать метод deauthorizeUser(), для локального удаления пользователя и прекращения сетевой активности СДК.
func performLogout() {
val chatCenterUI: ChatCenterUI = /* получить экземпляр */
// Локальное удаление пользователя и разрыв соединения
chatCenterUI.deauthorizeUser()
// Далее — навигация на экран логина приложения
navigateToLoginScreen()
}
При повторном входе в авторизованную зону пользователь должен быть установлен