Android-разработка
Эта инструкция предназначена для разработчиков мобильных приложений на платформе Android, желающих интегрировать компонент ЕЛК (Единый Личный Кабинет) в свое приложение. Здесь подробно описан процесс интеграции и настройка внешнего вида элемента.
Шаг 1. Подключение Android SDK
Минимальная поддерживая версия Android: 26
Для корректной работы необходимо также установить и подключить SIDSDK_CORE.
Android SDK для работы с Единым личным кабинетом.
1.1 Добавьте репозиторий:
repositories {
mavenCentral()
}
1.2 Подключите зависимость на SIDSDK_ELK:
implementation("io.github.sid-sdk:SIDSDK_ELK:1.1.1")
Версия может отличаться. Информацию об актуальной версии SDK вы найдете в Release notes Android SIDSDK-ELK.
Шаг 2. Инициализировать SDK
Необходимо убедиться, что выполнена инициализация SDK.
Руководство по инициализации SDK для Android
Шаг 3. Настроить переход на веб-интерфейс партнера
Настройте бесшовный переход на веб-интерфейс партнера для мобильных приложений.
Подробная инструкция по настройке бесшовного перехода на веб-интерфейс партнера:
AppToken — это специальный токен, необходимый для авторизации пользователя. Для его получения добавьте в запрос на авторизацию дополнительный скоуп mapp_sso.
val uri = SID.Login.createUriForLogin(
scope = "openid mapp_sso", // добавьте все необходимые вам scope
state = "random_state",
nonce = "random_nonce",
redirectUrl= "partner://redirect",
codeChallenge: "code_challenge",
codeChallengeMethod: PkceUtils.getCodeChallengeMethod()
)
Для сохранения необходимо вызвать метод SID.Login.getIDAuthResult(intent: Intent) для проверки результата авторизации.
Без данного метода appToken не сохранится.
val resultModel = SID.Login.getIDAuthResult(intent)
После успешной авторизации, мы сохраним токен в защищенном хранилище и он будет валиден около трех месяцев. По умолчанию токен обновляется каждый день. Если вам нужно изменить частоту обновления токена, пожалуйста, свяжитесь с нашей службой поддержки.
Проверку AppToken на валидность следует выполнять при каждом запуске вашего приложения, после инициализации SDK Сбер ID.
//Подпишитесь на получение событий.
SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
...
AppTokenEvents.HasExpire -> {
//Необходимо обновить токен
}
AppTokenEvents.IsValid -> {
// Токен валиден
}
...
}
}
//Старт проверки токена на проверку
SID.AppToken.checkAppTokenForValid()
Стоит отметить, что методы, работающие с AppToken, используют общую шину SID.AppToken.subscribeToEvents(this) для всех ответов. Это означает, что вам достаточно подписаться на события один раз, и вы сможете обрабатывать все запросы, связанные с AppToken, в одном месте.
Такой подход позволяет упростить и централизовать обработку событий, связанных с AppToken, что делает код более чистым и поддерживаемым.
Во всех последующих примерах будут указаны только необходимые AppTokenEvents для соответствующих шагов. Полное описание можно найти в конце статьи.
При провале проверки на валидность токена, обновите его. Новый токен будет автоматичски перезаписан в случае успешного запроса.
SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
...
AppTokenEvents.HasExpire -> {
updateAppToken() // Запускаем обновление
}
...
}
private fun updateAppToken() {
val codeVerifide = PkceUtils.generateRandomCodeVerifier(SecureRandom())
val codeChallenge = PkceUtils.deriveCodeVerifierChallenge(codeVerifide)
val oidcParams = OIDCParams(
clientId = "clientId вашего сервиса", // на данный момент необходимо дублировать параметр
scope = "openid mapp_sso", //+добавьте все необходимые вам scope
redirectUrl = "partner://redirect",
state = "random_state",
nonce = "random_nonce",
codeChallenge = codeChallenge,
codeChallengeMethod = PkceUtils.getCodeChallengeMethod()
)
SID.AppToken.updateAppToken(oidcParams)
}
Для перехода используйте метод goToPartnerSSO с необходимыми параметрами:
- webLink — Ссылка на сайт партнера;
- clientId — Уникальный идентификор партнера, использующего Сбер ID;
- partnerColorInt? — Предпочтительный цвет для лоадера и окраса UI элементов;
- openIn — Тип контроллера для открытия страницы партнера
SIDOpenInType.webviewилиSIDOpenInType.browser.
val activity = requireActivity()
val color: Int? = kotlin.runCatching {
Color.parseColor(appTokenColor?.text.toString())
}.getOrNull()
val info = LinkInformation(
webLink = "https://partner.ru/sso_auth",
clientId = "сlientId партнера",
partnerColorInt = color ?: Color.GREEN,
openIn = OpenInConstants.WEB_VIEW / OpenInConstants.BROWSER,
)
SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
...
AppTokenEvents.Success -> Unit //Удачный переход на партнера
...
}
}
SID.AppToken.goToPartnerSSO(currentActivity = activity, linkInformation = info)
При выходе пользователя из системы не забудьте удалить AppToken.
SID.Login.logout()
Все события при работе с AppToken подробно описаны здесь
Шаг 4. Встроить UI ЕЛК
Для интеграции контейнера ЕЛК в ваше Android-приложение существует два основных способа:
ELKContainerView — View-контейнер для отображения динамических элементов ЕЛК (ELK) на основе Jetpack Compose. Реализует гибкую систему управления контентом через XML-атрибуты и программные методы.
Основные особенности
- Поддержка нескольких версий одного контей нера
- Адаптивное изменение размеров и отступов
- Обработка событий загрузки/ошибок
- Возможность программного обновления параметров
Примеры использования
Базовый контейнер
<sid.sdk.elk.presentation.container.ELKContainerView
android:id="@+id/elk_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Специализированный контейнер
<sid.sdk.elk.presentation.container.ELKContainerView
android:id="@+id/elk_offer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:containerName="offer"
app:containerVersion="3"
app:horizontalPadding="16"
app:elkMinimalLoaderContainerHeight="100" />
Программное управление
elkContainer.setContainerName("promo")
elkContainer.setContainerVersion(2)
elkContainer.setMinimalLoaderHeights(80)
Жизненный цикл
Контейнер автоматически:
- Загружает данные при
VISIBLE/INVISIBLE - Приостанавливает загрузку при
GONE - Перезагружается при изменении параметров
Настройка через XML
| Атрибут | Тип | Описание |
|---|---|---|
app:containerName | String | Имя контейнера |
app:containerVersion | Integer | Версия контейнера |
app:horizontalPadding | Integer | Горизонтальный отступ в dp |
app:spaceUserInfoMini | Integer | Отступ под мини-профиль в dp |
app:elkMinimalLoaderContainerHeight | Integer | Минимальная высота лоадера в dp |
Методы управления
// Установка имени контейнера (его не нужно указывать, если вы не знаете его, вероятно вам пока это не нужно)
setContainerName("offer")
// Установка версии контейнера
setContainerVersion(3)
// Установка размеров контейнера
setDimensions(
dimensions = SIDDimensionsELK(
elkHorizontalPadding = 16,
elkSpaceUserInfoMini = 8,
elkMinimalLoaderContainerHeight = 100
)
)
// Установка обработчика событий
subscribeOnContainerEvents { event ->
when(event) {
is ELKEvents.ClickELK -> handleWidgetClick(event)
is ELKEvents.WidgetErrorELK -> showErrorMessage(event)
}
}
Логика загрузки Формирование URL:
https://адрес.ру/[clientID]_[containerName]_v[containerVersion].json
- При
containerName= null → игнорируется в URL - При
containerVersion = null→ игнорируется в URL
ELKContainer — Composable-компонент для отображения динамического контента ЕЛК (ELK) на основе параметров. Реализует гибкую систему управления контентом через Jetpack Compose.
Основные особенности
- Поддержка нескольких версий одного контейнера
- Автоматическая обработка ошибок загрузки
- Обработка событий кликов и ошибок
- Обрезка длинных имен контейнеров до 36 символов
Примеры использования
Базовый контейнер
val parameters = remember {
mutableStateOf(ELKContainerParameters())
}
ELKContainer(
modifier = Modifier.fillMaxWidth(),
activity = { activity },
parameters = parameters.value,
containerEvents = { event ->
when(event) {
is ELKEvents.ClickELK -> handleWidgetClick(event.widgetName)
is ELKEvents.WidgetErrorELK -> showNetworkError(event.httpStatusCode, event.partnerErrorCode)
}
}
)
Специализированный контейнер
val offerParams = remember {
mutableStateOf(ELKContainerParameters(
containerName = "offer",
containerVersion = 3,
dimensions = SIDDimensionsELK(
elkHorizontalPadding = 16,
elkMinimalLoaderContainerHeight = 100
)
))
}
ELKContainer(
modifier = Modifier.fillMaxWidth(),
activity = { activity },
parameters = offerParams.value
)
modifier - Модификаторы для настройки размеров и поведения
activity - Текущая активность для взаимодействия с UI
parameters - Параметры контейнера (имя, версия, размеры)
containerEvents - Обработчик событий ЕЛК
Логика загрузки Формирование URL
https://адрес.ру/[clientID]_[containerName]_v[containerVersion].json
- Если
containerName= null → игнорируется в URL - Если
containerVersion = null→ игнорируется в URL - Имя контейнера длиннее 36 символов автоматически обрезается
События ЕЛК
Все события доступны через:
SID.Events.subscribeForELKEvents(owner = lifecycleOwner) { events ->
when(events){
is AppTokenEvents -> {"События апптокен"}
is AuthEvents -> {"События авторизации"}
is ELKEvents -> when(events){
is ELKEvents.ClickELK -> {"Событие на клик по виджету"}
is ELKEvents.ErrorELK -> {"Событие на ошибку root элемента ЕЛК"}
is ELKEvents.HideELK -> {"Событие на скрытие ЕЛК"}
is ELKEvents.ReloadELK -> {"Событие на перезагрузку ЕЛК"}
is ELKEvents.ShowELK -> {"Событие на показ ЕЛК"}
is ELKEvents.WidgetErrorELK -> {"Событие на ошибку загрузки ЕЛК элемента с бекенда партнера"}
is ELKEvents.OpenWidgetELK -> {"Событие на открытие ЕЛК элемента"}
is ELKEvents.ShowWidgetELK -> {"Событие на показ ЕЛК элемента"}
}
}
}
Подробное описание событий ELKEvents можно посмотреть в разделе
Шаг 5. Встроить бейдж
Для интеграции бейджа в ваше Android-приложение можно воспользоваться одним из способов:
BadgeElement Представляет собой точку входа в витрину выгод и привилегий пользователя. Саморегулирует размеры в зависимости от контента.
Ключевые особенности:
- Автоматическая загрузка данных при монтировании через [ViewModel]
- Отслеживание состояния загрузки ([state])
- Обработка кликов через [BadgeIntent.ClickBadge]
Использование в Composable-компонентах
fun MyScreen() {
// Получение activity через LocalContext
val activity = remember { (LocalContext.current as? FragmentActivity) }
// Убедитесь, что контекст действительно является FragmentActivity
if (activity != null) {
BadgeElement(
activity = { activity },
modifier = Modifier.padding(8.dp),
place = Byte.MIN_VALUE // Не изменяйте вручную
)
} else {
Text("Невозможно отобразить значок")
}
}
- activity - лямбда-функция для получения [FragmentActivity], необходимого для навигации при клике. Используется вместо прямой передачи объекта для предотвращения утечек памяти.
- modifier - модификаторы для настройки внешнего вида компонента
- place - не должен изменяться вручную.
BadgeView
Как работает:
- Использует ComposeView для отрисовки Composable-компонента [BadgeElement]
- Саморегулирует размеры в зависимости от контента
- Отслеживает видимость через переопределенные методы [onVisibilityChanged] и [onWindowVisibilityChanged]
Ключевые особенности:
- Поддержка реактивного UI через Compose
- Автоматическая загрузка данных при монтировании
- Управление видимостью через флаг
containerIsVisible
Добавление через XML
<sid.sdk.elk.badge.presentation.BadgeView
android:id="@+id/badge_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Программное добавление
// Пример создания и добавления в родительский контейнер
val badgeView = BadgeView(context)
val parentLayout = findViewById<FrameLayout>(R.id.parent_layout)
parentLayout.addView(badgeView)
- context - контекст, необходимый для создания View
- attrs - атрибуты из XML (не используются в текущей реализации)
- defStyleAttr - стиль по умолчанию (не используется)
Важные моменты при настройке мобильного SDK:
- Установите клиентские параметры (
clientID) через методsetMainSettings(). - Используйте кастомизацию интерфейса методами типа
setUIMode()иsetUIPreferences()для обеспечения единого опыта пользователя. - Поддерживайте регулярную проверку токенов авторизации через метод
checkAppTokenForValid(). - Обрабатывайте события, подписавшись на соответствующие уведомления через API SDK.
- Проведите тестирование всех аспектов взаимодействия приложения с сервером и сторонними элементами.