# Как интегрировать серверную проверку Liveness в ваше мобильное приложение

Из этой статьи вы узнаете, как интегрировать Oz Liveness Mobile SDK в клиентское мобильное приложение: для съемки видео с лицом и дальнейшей его проверки на сервере.

<figure><img src="https://2041336905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FHLoHbtSPFA1Ul7oKM5SC%2Fuploads%2Fjc5vldA6baZUfzO6rlZ3%2Fpic%20for%20mobile%20ru-scheme-v8.drawio.svg?alt=media&#x26;token=1cd93a9b-de1c-4e2f-978b-2d92281615f9" alt=""><figcaption></figcaption></figure>

Oz Liveness Mobile SDK – это:

* Готовый интерфейс для съемки видео, который легко встроить в приложение клиента.
* Высокое качество видео, которое обеспечивает точность проверки Liveness.

«Под капотом» Oz SDK взаимодействует с OZ API.

Для интеграции необходимо связаться с нами для получения всех нужных ссылок и доступов:

Логин: <ivan.ivanov@yourcompany.com>

Пароль: …

API: <https://sandbox.ohio.ozforensics.com>

Web-консоль: <https://sandbox.ohio.ozforensics.com>

&#x20;Для работы Oz Liveness Mobile SDK нужна лицензия, которая привязывается к bundle\_id приложения, например `com.yourcompany.yourapp`. Тестовую лицензию на месяц вы можете оформить самостоятельно [на нашем веб-сайте](https://ozforensics.com/developers/try_mobile_sdk),  если вам требуется лицензия на более длительный срок – [свяжитесь с нами](mailto:info@ozforensics.com).

Мы также рекомендуем использовать наш сервис логирования – телеметрию. Записи телеметрии помогают в расследовании деталей атак. Для пользователей Oz API логирование подключается автоматически. Для локальных установок мы предоставим вам необходимые учетные данные.

### Android

{% stepper %}
{% step %}

#### Добавьте SDK в проект

В build.gradle проекта добавьте строки:

```kotlin
allprojects {
    repositories {
        maven { url "https://ozforensics.jfrog.io/artifactory/main" }
    }
}
```

В build.gradle модуля добавьте строки:

```kotlin
dependencies {
    implementation 'com.ozforensics.liveness:full:<version>'
    // You can find the version needed in the Android changelog
}
```

{% endstep %}

{% step %}

### Инициализируйте SDK

Переименуйте файл лицензии в **forensics.license** и поместите его в папку res/raw в вашем проекте.

{% code title="Kotlin" %}

```kotlin
OzLivenessSDK.init(
    context,
    listOf(LicenseSource.LicenseAssetId(R.raw.forensics))
)
```

{% endcode %}
{% endstep %}

{% step %}

### Подключите SDK к Oz API

Вам потребуются полученные от нас логин, пароль и адрес API-сервера.&#x20;

{% code title="Kotlin" %}

```kotlin
OzLivenessSDK.setApiConnection(
    OzConnection.fromCredentials(host, username, password),
    statusListener(
        { token -> /* token */ },
        { ex -> /* error */ }
    )
)
```

{% endcode %}

На стадии продакшна рекомендуется использовать в коде не логин и пароль, а полученный с помощью [метода авторизации](https://documenter.getpostman.com/view/23712118/2s93m1Z4bP#36a86a61-5e53-41bb-b760-78690826f494) на их основе токен доступа `access_token`. Передайте токен в приложение:

{% code title="Kotlin" %}

```kotlin
OzLivenessSDK.setApiConnection(OzConnection.fromServiceToken(host, token))
```

{% endcode %}
{% endstep %}

{% step %}

### Запустите съемку видео

Для запуска используйте `startActivityForResult`:

{% code title="Kotlin" %}

```kotlin
val sessionToken: String = getSessionToken()
val captureRequest = CaptureRequest(
    listOf(
        AnalysisProfile(
            Analysis.Type.QUALITY,
            listOf(MediaRequest.ActionMedia(OzAction.Blank)),
        )
    )
)
val intent = OzLivenessSDK.createMediaCaptureScreen(captureRequest, sessionToken)
startActivityForResult(intent, REQUEST_LIVENESS_CONTAINER)
```

{% endcode %}

Для получения готового видео используйте `onActivityResult`:

{% code title="Kotlin" %}

```kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_LIVENESS_CONTAINER) {
        when (resultCode) {
            OzLivenessResultCode.SUCCESS -> runAnalysis(OzLivenessSDK.getContainerFromIntent(data))
            OzLivenessResultCode.USER_CLOSED_LIVENESS -> { /* user closed the screen */ }
            else -> {
                val errorMessage = OzLivenessSDK.getErrorFromIntent(data)
                /* show error */
            }
        }
    }
}
```

{% endcode %}
{% endstep %}

{% step %}

### Запустите анализы

Для запуска анализов используйте код:

{% code title="Kotlin" %}

```kotlin
private fun runAnalysis(container: DataContainer?) {
    if (container == null) return
    AnalysisRequest.Builder()
        .addContainer(container)
        .build()
        .run(
            { result ->
                val isSuccess = result.analysisResults.all { it.resolution == Resolution.SUCCESS }
            },
            { /* show error */ },
            { /* update status */ },
        )
}
```

{% endcode %}
{% endstep %}
{% endstepper %}

### iOS

{% stepper %}
{% step %}

#### Добавьте SDK в проект

[**CocoaPods**](https://cocoapods.org/)

Для интеграции OZLivenessSDK в проект Xcode добавьте в Podfile строку:

```swift
pod 'OZLivenessSDK', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios', :tag => '<version>' // You can find the version needed in  iOS changelog

```

**SPM**

Добавьте через SPM зависимости: <https://gitlab.com/oz-forensics/oz-mobile-ios-sdk> (процесс добавления зависимостей описан в [документации Apple](https://developer.apple.com/documentation/xcode/adding-package-dependencies-to-your-app)). **OzLivenessSDK** обязателен. **OzLivenessSDKOnDevice** можно не добавлять.
{% endstep %}

{% step %}

### Инициализируйте SDK

Переименуйте файл лицензии в **forensics.license** и добавьте его в проект.

```swift
OZSDK(licenseSources: [.licenseFileName("forensics.license")]) { licenseData, error in
    if let error = error {
        print(error.errorDescription)
    }
}
```

{% endstep %}

{% step %}

### Подключите SDK к Oz API

Вам потребуются полученные от нас логин, пароль и адрес API-сервера.&#x20;

```swift
OZSDK.setApiConnection(Connection.fromCredentials(host: “https://sandbox.ohio.ozforensics.com”, login: login, password: p)) { (token, error) in
    // код для обработки токена или ошибки
}
```

На стадии продакшна рекомендуется использовать в коде не логин и пароль, а полученный с помощью [метода авторизации](https://documenter.getpostman.com/view/23712118/2s93m1Z4bP#36a86a61-5e53-41bb-b760-78690826f494) на их основе токен доступа `access_token`. Передайте токен в приложение:

```swift
OZSDK.setApiConnection(Connection.fromServiceToken(host: "https://sandbox.ohio.ozforensics.com", token: token)) { (token, error) in
}
```

{% endstep %}

{% step %}

### Запустите съемку видео

Создайте контроллер для запуска съемки:

```swift
getSessionToken() { sessionToken in
            DispatchQueue.main.async {
                do {
                    let action:OZVerificationMovement = .selfie
                    let mediaRequest = MediaRequest.action(action)
                    let profile = AnalysisProfile(mediaList: [mediaRequest],
                                                  type: .quality,
                                                  params: [:] )
                    let request = CaptureRequest(analysisProfileList: [profile], cameraPosition: .front)
                    let ozLivenessVC = try OZSDK.createMediaCaptureScreen(self, request, sessionToken: sessionToken)
                    self.present(ozLivenessVC, animated: true)
                } catch let error {
                    print(error.localizedDescription)
                }
            }
        }
```

В объекте delegate необходим протокол `OZLivenessDelegate`:

```swift
extension ViewController: LivenessDelegate {
    func onResult(container: DataContainer) {
    }
    func onError(status: OZVerificationStatus?) {
    }
}
```

{% endstep %}

{% step %}

### Запустите анализы

Для запуска анализов используйте `AnalysisRequestBuilder`. Метод `run` «под капотом» обратится к Oz API.

```swift
func onResult(container: DataContainer) {
  let analysisRequest = AnalysisRequestBuilder()
  analysisRequest.addContainer(container)
  analysisRequest.run(
            statusHandler: { status in
            },
            errorHandler: { error in
            }
        ) { result in
        }
}
```

{% endstep %}
{% endstepper %}

Шаги выше помогут вам в базовой интеграции наших мобильных SDK в ваше приложение. Чтобы получить доступ к снятым видео и результатам анализов, воспользуйтесь [веб-консолью](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-polzovatelya/oz-webui) или API-запросами.&#x20;

В руководстве разработчика вы также найдете инструкции по настройке внешнего вида SDK и список методов SDK как для iOS, так и для Android:&#x20;

| [Образец кода](https://gitlab.com/oz-forensics/oz-liveness-android) для Android                                                                 | [Образец кода](https://gitlab.com/oz-forensics/public/oz-liveness-ios-sample/-/tree/main) для iOS                                       |
| ----------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| [Руководство разработчика](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/oz-mobile-sdk/android) Android | [Руководство разработчика](https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/oz-mobile-sdk/ios) iOS |
| [Demo app](https://play.google.com/store/apps/details?id=com.ozforensics.liveness.demo\&hl=en) в PlayMarket                                     | [Demo app](https://testflight.apple.com/join/mBbPQqnM) в TestFlight                                                                     |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.ozforensics.com/oz-knowledge-ru/obshaya-informaciya/kratkie-rukovodstva-po-integracii/proverka-liveness-na-servere/kak-integrirovat-servernuyu-proverku-liveness-v-vashe-mobilnoe-prilozhenie.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
