Внедрение в жизненный цикл приложения
Где в жизненном цикле приложения вызывать методы SDK.
Общая схема взаимодействия
Этапы интеграции
| # | Этап | Метод SDK | Когда вызывать | Подробнее |
|---|---|---|---|---|
| 1 | Инициализация SDK | init(providerUid:appMarker:chatConfig:loggerConfig:) | application(_:didFinishLaunchingWithOptions:) | Инициализация SDK |
| 2 | Регистрация APNS-токена | ChatCenterUISDK.setDeviceToken(_:) | application(_:didRegisterForRemoteNotificationsWithDeviceToken:) (асинхронный системный коллбэк, не зависит от шага 1) | Уведомления |
| 3 | Авторизация пользователя | authorize(user:auth:) | После входа пользователя в авторизованную зону приложения | Управление пользователем |
| 4 | Открытие чата | try getChat(userInfo:) → present / push | По действию пользователя (например, нажатие кнопки «Поддержка»). Бросает ChatCenterUIError.userNotAuthorized, если вызван до authorize | Отображение чата |
| 5 | Выход пользователя | try logout() или deauthorizeUser() | logout() — при полном выходе из аккаунта (бросает ChatCenterUIError.userNotAuthorized, если пользователь не авторизован). deauthorizeUser() — при выходе из авторизованной зоны (например, на экран ПИН-кода); не бросает ошибок | Управление пользователем |
Потокобезопасность
SDK не гарантирует потокобезопасность — вызывайте все методы с главного потока. Вызов с фонового потока может нарушить внутреннее состояние SDK или вызвать UIKit-предупреждения.
| Метод | Поток вызова | Примечания |
|---|---|---|
init(...) | Main thread | Регистрирует наблюдателей на уведомления UIApplication (didBecomeActive, didEnterBackground) и на внутреннее уведомление об изменении APNS-токена — SDK начинает реагировать на жизненный цикл и смену токена сразу после init |
setDeviceToken(_:) | Main thread | Статический метод. Можно вызывать до создания экземпляра ChatCenterUISDK |
authorize(user:auth:) | Main thread | Инициирует REST-запросы настроек и истории. WebSocket открывается при первом viewDidAppear контроллера чата; может открыться раньше, если сервер вернёт registerAtFirstStart |
getChat(userInfo:) | Main thread | Возвращает UIViewController — UIKit требует main thread. Бросает ChatCenterUIError.userNotAuthorized |
send(message:) | Main thread | Бросает ChatCenterUISendMessageError; см. Ошибки SDK |
getUnreadMessagesCount(completion:) | Main thread | Бросает ChatCenterUIError.userNotAuthorized. Completion вызывается на main thread |
logout() | Main thread | Бросает ChatCenterUIError.userNotAuthorized, если пользователь не авторизован или его identifier пуст |
deauthorizeUser() | Main thread | Ошибок не бросает |
prefill(message:) | Main thread | Сохраняется до первого открытия чата; пустая строка очищает |
handleNotification(userInfo:) | Main thread | Бросает ChatCenterUIError.chatNotOpened, если чат не открыт. В текущей версии не выполняет видимых действий при открытом чате |
Методы ChatCenterUISDKDelegate | Main thread (фактически) | В текущей версии все методы делегата (didChangeUnreadMessages, didReceiveNetwork, didLog, chatCenterUI(chatCenter:didOpen url:) -> Bool — обработчик нажатия на ссылку в чате) фактически приходят с main thread, но это не зафиксировано контрактом. Для надёжности оборачивайте UI-обновления в DispatchQueue.main.async |