Mobile SDK
SDK предназначен для распознавания данных заявителя в мобильных приложениях. SDK поддерживает следующие функции:
Когда использовать
Используйте Mobile SDK, если KYC-сценарий должен проходить внутри мобильного приложения клиента. SDK помогает собрать фото, документы и данные пользователя без перехода во внешний web-flow.
- Снятие селфи пользователя
- Сканирование паспортных данных пользователя
- Ввод адреса прописки
- Сохранение фото страницы паспорта прописки
iOS SDK
Добавление SDK к проекту
Чтобы добавить SDK, необходимо архив .xcframework добавить к Frameworks в проекте:
- Откройте настройки проекта (ссылка “General”)
- Прокрутите ниже и найдите Frameworks, Libraries, and Embedded content
- Нажмите “+” → “Add other…” → “Add Files…“
- Найдите BiometrySDK.xcframework и кликните “Open“
На этом этапе SDK встроен в проект.
Инициализация SDK
Для инициализации SDK необходимо импортировать Biometry:
import Biometry
Чтобы воспользоваться и запустить SDK, необходимо его проинициализировать:
private func initializeBiometrySDK() {
guard let navigationController = self.navigationController else { return }
let coordinator = BiometryCoordinator(navigationController: navigationController)
coordinator.onSuccess = { result in
// Обработка результата
print("User photo: (result.userPhoto)")
print("Passport photo: (result.passportPhoto)")
print("Address photo: (result.addressPhoto)")
print("User data: (result.userData)")
print("Registration address: (result.registrationAddress)")
}
coordinator.start(with: "token")
}
Модель возвращаемых данных
Замыкание onSuccess отдаёт собранные данные по результатам прохождения флоу:
struct BiometryResult {
let userPhoto: UIImage?
let passportPhoto: UIImage?
let addressPhoto: UIImage?
let userData: UserFormModel?
let registrationAddress: RegisterFormModel?
}
UserFormModel
class UserFormModel {
var surname: String? // Фамилия
var name: String? // Имя
var patronymic: String? // Отчество
var birthDate: String? // Дата рождения
var gender: String? // Пол
var series: String? // Серия паспорта
var number: String? // Номер паспорта
var birthPlace: String? // Место рождения
var deliveryDate: String? // Дата выдачи паспорта
var deliveryPlace: String? // Кем выдан паспорт
var departmentCode: String? // Код подразделения
}
RegisterFormModel
struct RegisterFormModel {
var zip: String // Индекс
var region: String // Регион
var district: String // Область/Край
var city: String // Город
var street: String // Улица
var house: String // Номер дома
var housing: String // Корпус дома
var flat: String // Номер квартиры
}
Android SDK
Подключение
Для работы с библиотекой SDK требуется:
- Распаковать архив в папку
libsв проекте - Подключить зависимость в файле
build.gradle.ktsприложения:
dependencies {
implementation(files("libs/sdk-release.aar"))
implementation(files("libs/api-release.aar"))
implementation(files("libs/core-1.2.4.aar"))
}
Также необходимо обеспечить подключение к проекту транзитивных зависимостей.
dependencies {
implementation("com.google.code.gson:gson:2.8.8")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.jakewharton.timber:timber:5.0.1")
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("androidx.fragment:fragment-ktx:1.3.4")
implementation("com.google.android.material:material:1.8.0")
implementation("androidx.annotation:annotation:1.2.0")
implementation("androidx.activity:activity-ktx:1.3.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.exifinterface:exifinterface:1.3.3")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.5.1")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.5.1")
implementation("com.facebook.shimmer:shimmer:0.5.0")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4")
implementation("androidx.camera:camera-camera2:1.0.0")
implementation("androidx.camera:camera-lifecycle:1.0.0")
implementation("androidx.camera:camera-view:1.0.0-alpha29")
implementation("org.tensorflow:tensorflow-lite-support:0.2.0")
implementation("com.github.android:renderscript-intrinsics-replacement-toolkit:b6363490c3")
}
Для загрузки renderscript нужно указать репозиторий в settings.gradle.kts:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven { setUrl("https://jitpack.io") }
}
}
Использование
Intent(this, BiometryActivity::class.java).apply {
putExtra(BiometryActivity.CLIENT_TOKEN, "id_вида_87dgyg7wf8wgf8gfgcs8gd")
putExtra(BiometryActivity.AUTH_TYPE, "RIM(KYC)")
putExtra(BiometryActivity.USE_INN, true)
}.also {
biometryResult.launch(it)
}
CLIENT_TOKEN берется из ответа метода запуска идентификации по workflow:
POST /api/v2/identifications/workflow-instances
Для получения данных нужно обработать результат BiometryActivity.
val biometryResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
// В intent будут содержаться отсканированные поля
}
Результат может содержать:
| Атрибут | Описание |
|---|---|
name |
Имя. |
surname |
Фамилия. |
patronymic |
Отчество. |
birthDate |
Дата рождения. |
gender |
Пол. |
series |
Серия паспорта. |
number |
Номер паспорта. |
birthPlace |
Место рождения. |
deliveryDate |
Дата выдачи. |
deliveryPlace |
Орган, выдавший паспорт. |
departmentCode |
Код подразделения. |
fullAddress |
Полный адрес с индексом. |
shortAddress |
Короткая версия адреса. |
Также результат можно получить напрямую из BiometryStore, который содержит метод release(). Метод зануляет поля, но не делает recycle() у изображений.
BiometryStore может содержать:
selfie– изображение селфи в максимальном разрешении;passportPhoto– изображение паспорта в максимальном разрешении;registrationPhoto– изображение страницы регистрации паспорта в максимальном разрешении;passportFields– поля паспорта.
Настройка внешнего вида
SDK поддерживает кастомизацию внешнего вида через стили:
- Цвета интерфейса
- Шрифты
- Размеры элементов
- Иконки
Подробнее см. раздел Кастомизация интерфейса.
Подробно про темы Android SDK см. Стили Mobile SDK.
Связанные API методы
- Workflow instances — рекомендуемый запуск идентификации и получение ссылки/токена
- Получить заявку — для получения результатов после завершения
Переопределение стилей текста
Вы можете переопределить стили текста в SDK, настроив соответствующие параметры в конфигурации.
Уменьшение размера APK
Для уменьшения размера APK можно:
- Использовать ProGuard/R8 для удаления неиспользуемого кода
- Оптимизировать ресурсы (изображения, шрифты)
- Использовать App Bundle вместо APK
Получение токена
Токен для запуска SDK получается при создании заявки на идентификацию через API. Для новых интеграций используйте workflow:
POST /api/v2/identifications/workflow-instances
Подробнее см. API: Workflow instances.
В ответе будет ссылка/токен запуска сценария.
Обработка ошибок
SDK может возвращать различные ошибки в процессе работы:
- Ошибки камеры
- Ошибки распознавания
- Ошибки сети
- Ошибки валидации данных
Все ошибки обрабатываются через callback onError:
coordinator.onError = { error in
print("Ошибка: (error.localizedDescription)")
}
Примеры использования
iOS
import UIKit
import Biometry
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func startIdentification(_ sender: UIButton) {
initializeBiometrySDK()
}
private func initializeBiometrySDK() {
guard let navigationController = self.navigationController else { return }
let coordinator = BiometryCoordinator(navigationController: navigationController)
coordinator.onSuccess = { result in
// Отправка данных на сервер
self.sendDataToServer(result)
}
coordinator.onError = { error in
// Обработка ошибки
self.showError(error)
}
coordinator.start(with: "your_token_here")
}
}
Android
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.startButton).setOnClickListener {
startIdentification()
}
}
private fun startIdentification() {
val coordinator = BiometryCoordinator(
activity = this,
navigationController = supportFragmentManager
)
coordinator.onSuccess = { result ->
// Отправка данных на сервер
sendDataToServer(result)
}
coordinator.onError = { error ->
// Обработка ошибки
showError(error)
}
coordinator.start(token = "your_token_here")
}
}