Mobile SDK

SDK предназначен для распознавания данных заявителя в мобильных приложениях. SDK поддерживает следующие функции:

Когда использовать

Используйте Mobile SDK, если KYC-сценарий должен проходить внутри мобильного приложения клиента. SDK помогает собрать фото, документы и данные пользователя без перехода во внешний web-flow.

  • Снятие селфи пользователя
  • Сканирование паспортных данных пользователя
  • Ввод адреса прописки
  • Сохранение фото страницы паспорта прописки

iOS SDK

Добавление SDK к проекту

Чтобы добавить SDK, необходимо архив .xcframework добавить к Frameworks в проекте:

  1. Откройте настройки проекта (ссылка “General”)
  2. Прокрутите ниже и найдите Frameworks, Libraries, and Embedded content
  3. Нажмите “+” → “Add other…” → “Add Files…
  4. Найдите 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 требуется:

  1. Распаковать архив в папку libs в проекте
  2. Подключить зависимость в файле 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")
    }
}