arrow-left

All pages
gitbookPowered by GitBook
1 of 9

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Проверка Liveness на устройстве

В этом разделе находится инструкция по интеграции проверки Liveness на устройстве.

circle-info

Мы рекомендуем использовать режим анализа на сервере, поскольку он обеспечивает более точные результаты по сравнению с анализом на устройстве.

Проверка Liveness на сервере

В этом разделе собраны инструкции по интеграции серверных проверок Liveness.

Как интегрировать проверку Liveness на устройстве в ваше мобильное приложениеchevron-right
Как интегрировать серверную проверку Liveness в ваше Web-приложениеchevron-right
Как интегрировать серверную проверку Liveness в ваше мобильное приложениеchevron-right
Как провести проверку медиафайла на Liveness без использования фронтенда Ozchevron-right

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

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

Преимущества Oz Liveness Web SDK:

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

  • Высокое качество видео, которое обеспечивает точность проверки Liveness.

  • Возможность обнаружения и презентационных, и инъекционных атак. Инъекционная атака – попытка выдать за свежеснятое видео другое, снятое ранее с помощью виртуальной камеры.

  • Возможность использования как SaaS-модели, так и локальной установки – с теми же функциями, но без необходимости слать какие-либо данные в облако.

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

Мы рекомендуем начать с SaaS-модели и затем перейти к локальной установке – чтобы настроить бесшовную интеграцию Web SDK с вашими фронтендом и бэкендом. В этой инструкции приводятся шаги, благодаря которым процесс интеграции будет простым и ясным.

1

hashtag
Получите доступ к персональной копии Web Adapter

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

Шаги выше помогут вам в базовой интеграции Web SDK в ваше веб-приложение. Чтобы получить доступ к снятым видео и результатам анализов, воспользуйтесь или API-запросами (получение и ).

Дальнейшие шаги описаны в :

  • Настройка внешнего вида плагина

  • Добавление дополнительного языка

  • Настройка поведения плагина

Образец кода Oz Liveness Web SDK находится . Чтобы все работало корректно, нужно заменить <web-adapter-url> на полученную от нас ссылку на Web Adapter.

Для Angular и React нужно заменить https://web-sdk.sandbox.ohio.ozforensics.com в index.html.

  • Образец кода для

  • Образец кода для

  • Образец кода для

Мы направим вам ссылки и логин с паролем для дальнейшей интеграции и использования Web SDK.

Логин: [email protected]

Пароль: …

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

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

Web Adapter: https://web-sdk.cdn.sandbox.ozforensics.com/your_company_name/

Для локальной установки Oz API вам нужно будет создать пользователя или запросить его создание у команды, которая поддерживает API. Задайте пользователю роль: чаще всего достаточно CLIENT, но если вам нужно будет, чтобы SDK работал с папками, созданными другими пользователями, роль должна быть CLIENT ADMIN. В конце вам потребуются логин и пароль так же, как и при сценарии SaaS.

2

hashtag
Запросите в Oz API session_token

Токен сессии необходим для работы OzCapsula.

  1. (Опционально, только при использовании Full API) Авторизуйтесь с любой ролью, кроме OPERATOR.

  2. Вызовите метод GET {{host}}/api/authorize/session_token.

Пример запроса

3

hashtag
Добавьте Web Plugin на вашу страницу

В HTML-коде страницы разместите следующее. web-adapter-url необходимо заменить на полученную от нас ссылку.

4

hashtag
Реализуйте собственную логику для использования Web Plugin

Добавьте код, который будет запускать плагин и обрабатывать результаты:

circle-check

Обратите внимание: в целях безопасности мы рекомендуем настроить логику принятия решений на стороне вашего бэкенда. Более детальную информацию и примеры кода вы можете найти .

Настройка параметров и коллбэк-функций
  • Рекомендации по безопасности

  • Образец кода для Sveltearrow-up-right

    Доменные имена:

    1. www.yourbrand.com

    2. www.yourbrand2.com

    Электронная почта:

    • [email protected]

    веб-консолью
    видео в MP4
    результатов анализов
    руководстве разработчика по Web Plugin
    здесьarrow-up-right
    Angulararrow-up-right
    Reactarrow-up-right
    Vuearrow-up-right
    <script src="https://<web-adapter-url>/plugin_liveness.php"></script>
    OzLiveness.open({
      session_token,
      lang: 'en',
      action: [
        // 'photo_id_front', // фото документа
        'video_selfie_blank' // видео с пассивным Liveness
      ],
      on_complete: function (result) {
        // эта функция вызывается по завершении анализа
        console.log('on_complete', result);
      }
    });
    здесь
    curl -L 'https://{{host}}/api/authorize/session_token' \
    -H 'X-Forensic-Access-Token: <token>' \
    -H 'Content-Type: application/json'

    Краткие руководства по интеграции

    В этом разделе собраны описания наиболее часто встречающихся примеров интеграции системы Oz Forensics Liveness and Face Biometry. Сценарии могут как использоваться по отдельности, так и комбинироваться – например, интеграция Liveness сразу и в мобильное, и в веб-приложение или интеграция и Liveness-решения, и решения для сравнения лиц.

    Сравнение лиц

    В этом разделе находятся инструкции по интеграции для проверок, связанных с сопоставлением лиц.

    triangle-exclamation

    Обратите внимание: инструкции применимы для версий, которые не работают с контейнером данных.

    Как сравнить лицо из снятого для проверки Liveness видео с лицом из вашей базы данныхchevron-right
    Как добавить съемку документа и возможность сопоставления лиц в ваше веб- или мобильное приложениеchevron-right

    Как добавить съемку документа и возможность сопоставления лиц в ваше веб- или мобильное приложение

    circle-exclamation

    Обратите внимание: инструкции применимы для версий, которые не работают с контейнером данных.

    circle-info

    Обратите внимание: в мобильных SDK Oz отсутствует интерфейс для съемки документов. Для этого вам потребуется ПО стороннего производителя или ваше собственное. В Web SDK есть базовая функциональность съемки документа.

    Ниже описаны шаги, которые потребуется пройти для добавления сравнения лиц к Liveness-проверке.

    К этому моменту вы, скорее всего, уже разобрались с тем, как снимать видео и проводить Liveness-проверки. Если нет, пожалуйста, ознакомьтесь со статьями:

    hashtag
    Добавление съемки документа в Web SDK

    Добавьте photo_id_front в список действий для плагина.

    hashtag
    Добавление сравнения лиц в Android SDK

    Внимание: в данном случае мы предполагаем, что фотография (например, документа) хранится на устройстве под названием reference.jpg.

    Измените код, запускающий анализ:

    Для анализа на устройстве вместо Analysis.Mode.SERVER_BASED укажите Analysis.Mode.ON_DEVICE.

    Код образца для Android находится .

    hashtag
    Добавление сравнения лиц в iOS SDK

    Внимание: в данном случае мы предполагаем, что фотография (например, документа) хранится на устройстве под названием reference.jpg.

    Измените код, запускающий анализ:

    Для анализа на устройстве вместо .serverBased укажите .onDevice.

    Код образца для iOS находится .

    hashtag
    Для всех SDK

    Чтобы получить доступ к снятым видео и результатам анализов, воспользуйтесь или API-запросами.

    Методы как API, так и SDK могут гибко комбинироваться. Подробнее об этом вы можете прочитать в .

    Интеграция Oz Liveness Web SDK
    Интеграция Oz Liveness Mobile SDKarrow-up-right
    здесьarrow-up-right
    здесьarrow-up-right
    веб-консолью
    руководстве разработчика
    OzLiveness.open({
      lang: 'en',
      action: [
        'photo_id_front', 
        'video_selfie_blank'
      ],
      ...
    });
    private fun analyzeMedia(mediaList: List<OzAbstractMedia>) {
    
        val refFile = File(context.filesDir, "reference.jpg")
        val refMedia = OzAbstractMedia.OzDocumentPhoto(
            OzMediaTag.PhotoIdFront , // OzMediaTag.PhotoSelfie для не являющегося документом фото
            refFile.absolutePath
        )
    
        AnalysisRequest.Builder()
            .addAnalysis(Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaList))
            .addAnalysis(Analysis(Analysis.Type.BIOMETRY, Analysis.Mode.SERVER_BASED, mediaList + refMedia))
            .build()
            .run(object : AnalysisRequest.AnalysisListener {
                override fun onSuccess(result: List<OzAnalysisResult>) {
                    result.forEach { 
                        println(it.resolution.name)
                        println(it.folderId)
                    }
                }
                override fun onError(error: OzException) {
                    error.printStackTrace()
                }
            })
    } 
    private void analyzeMedia(List<OzAbstractMedia> mediaList) {
        File refFile = new File(context.getFilesDir(), "reference.jpg");
        OzAbstractMedia refMedia = new OzAbstractMedia.OzDocumentPhoto(
                OzMediaTag.PhotoIdFront , // OzMediaTag.PhotoSelfie for a non-ID photo
                refFile.getAbsolutePath()
        );
        ArrayList<OzAbstractMedia> mediaWithReferencePhoto = new ArrayList<>(mediaList);
        mediaWithReferencePhoto.add(refMedia);
        new AnalysisRequest.Builder()
                .addAnalysis(new Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaList, Collections.emptyMap()))
                .addAnalysis(new Analysis(Analysis.Type.BIOMETRY, Analysis.Mode.SERVER_BASED, mediaWithReferencePhoto, Collections.emptyMap()))
                .build()
                .run(new AnalysisRequest.AnalysisListener() {
                    @Override public void onStatusChange(@NonNull AnalysisRequest.AnalysisStatus analysisStatus) {}
                    @Override
                    public void onSuccess(@NonNull List<OzAnalysisResult> list) {
                        String folderId = list.get(0).getFolderId();
                    }
                    @Override
                    public void onError(@NonNull OzException e) { e.printStackTrace(); }
        });
    }
    let imageURL = URL(fileURLWithPath: NSTemporaryDirectory())
        .appendingPathComponent("reference.jpg")
    
    let refMedia = OZMedia.init(movement: .selfie,
                       mediaType: .movement,
                       metaData: nil,
                       videoURL: nil,
                       bestShotURL: imageUrl,
                       preferredMediaURL: nil,
                       timestamp: Date())
       
    var mediaBiometry = [OZMedia]()
    mediaBiometry.append(refMedia)
    mediaBiometry.append(contentsOf: mediaToAnalyze)
    let analysisRequest = AnalysisRequestBuilder()
    let analysisBiometry = Analysis.init(media: mediaBiometry, type: .biometry, mode: .serverBased)
    let analysisQuality = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased)
    analysisRequest.addAnalysis(analysisBiometry)
    analysisRequest.addAnalysis(analysisQuality)
    analysisRequest.uploadMedia(mediaBiometry)
    analysisRequest.run(
        scenarioStateHandler: { state in }, // обработчик шагов сценария
        uploadProgressHandler: { (progress) in } // обработчик для загрузки файлов
    ) { (analysisResults : [OzAnalysisResult], error) in
        // получение и обработка анализов
        for result in analysisResults {
            print(result.resolution)
            print(result.folderID)
        }
    }

    Как сравнить лицо из снятого для проверки Liveness видео с лицом из вашей базы данных

    В этой статье вы узнаете, как сравнить лицо из готового Liveness-видео с лицом на референтной фотографии, сохраненной в вашей базе данных.

    circle-exclamation

    Обратите внимание: инструкции применимы для версий, которые не работают с контейнером данных.

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

    К этому моменту вы, скорее всего, уже разобрались с тем, как снимать видео и проводить Liveness-проверки. Если нет, пожалуйста, ознакомьтесь со статьями:

    В данном сценарии описывается, как загрузить референтное фото в ту же папку, где находится снятое ранее Liveness-видео, запустить анализ BIOMETRY и получить результаты.

    hashtag
    1. Получите идентификатор папки, где находится нужное видео –folder_id

    Сравнение лиц должно происходить в одной папке, поэтому вам необходим идентификатор папки, где лежит нужное вам Liveness-видео. Получите идентификатор папки, как показано ниже, и передайте его на свой бэкенд.

    • Для видео, записанного через Web SDK, процесс получения идентификатора папки описан .

    • Для видео, записанного через наши мобильные SDK, получите идентификатор папки из результатов анализа:

    Android:

    iOS:

    hashtag
    2. Загрузите в папку референтное фото из своей базы данных

    Вызовите POST /api/folders/{{folder_id}}/media/. Замените folder_id на полученный на предыдущем шаге идентификатор папки. Так ваше изображение попадет в папку с нужным видео.

    Установите в запросе теги в соответствии с тем, что за фото вы загружаете – фото документа или селфи. Это нужно сделать в поле Payload.

    hashtag
    3. Запустите анализ

    Для запуска анализа вызовите POST /api/folders/{{folder_id}}/analyses/. Замените folder_id на полученный ранее идентификатор папки. В теле запроса укажите анализ BIOMETRY.

    hashtag
    4. Запустите опрос для получения результатов

    Раз в секунду отправляйте GET /api/analyses/{{analyse_id}} с полученным ранее analyse_id, пока состояние анализа не изменится с PROCESSING на какое-либо другое. Когда анализ завершится, вы можете оценить результаты:

    • качественные – в resolution (SUCCESS или DECLINED).

    • количественные – в analyses.results_data.min_confidence

    Коллекция Postman для описанных в статье шагов.

    Эти шаги помогут вам провести сравнение лиц с использованием Oz API. Чтобы получить доступ к снятым видео и результатам анализов, воспользуйтесь или API-запросами.

    Детальную информацию о том, как применять инструменты Oz API, вы можете найти в .

    Интеграция Oz Liveness Web SDK
    Интеграция Oz Liveness Mobile SDKarrow-up-right
    здесь
    методarrow-up-right
    методarrow-up-right
    запросarrow-up-right
    file-download
    6KB
    Face Matching with a Reference Photo.postman_collection.json
    arrow-up-right-from-squareOpen
    веб-консолью
    руководстве разработчика
    AnalysisRequest.Builder()
            ...
            .run(object : AnalysisRequest.AnalysisListener {
                override fun onSuccess(result: List<OzAnalysisResult>) {
                    // сохраните folder_id, он потребуется далее
                    val folderId = result.firstOrNull()?.folderId
                }
                ...
            })
    private void analyzeMedia(List<OzAbstractMedia> mediaList) {
        new AnalysisRequest.Builder()
                ...
                .run(new AnalysisRequest.AnalysisListener() {
                    @Override public void onStatusChange(@NonNull AnalysisRequest.AnalysisStatus analysisStatus) {}
                    @Override
                    public void onSuccess(@NonNull List<OzAnalysisResult> list) {
                        String folderId = list.get(0).getFolderId();
                        }
                    }
                    ...
        });
    }
    analysisRequest.run(
    scenarioStateHandler: { state in }, 
    uploadProgressHandler: { (progress) in }  
    )   { (analysisResults : [OzAnalysisResult], error) in 
            // сохраните folder_id, он потребуется далее
            let folderID = analysisResults.first?.folderID
        }
    }
    {
      "media:tags": { 
        "photo1": [
            "photo_id", "photo_id_front" // для фото лицевой стороны документа
            // ИЛИ
            "photo_selfie" // для фото, не являющегося документом
        ]
      }
    }
    {
        "analyses": [
            {
                "type": "biometry"
            }
        ]
    }

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

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

    Oz Liveness Mobile SDK – это:

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

    • Высокое качество видео, которое обеспечивает точность проверки Liveness.

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

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

    Логин: [email protected]

    Пароль: …

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

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

    Для работы Oz Liveness Mobile SDK нужна лицензия, которая привязывается к bundle_id приложения, например com.yourcompany.yourapp. Тестовую лицензию на месяц вы можете оформить самостоятельно , если вам требуется лицензия на более длительный срок – .

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

    hashtag
    Android

    1

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

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

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

    2

    hashtag
    iOS

    1

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

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

    SPM

    Шаги выше помогут вам в базовой интеграции наших мобильных SDK в ваше приложение. Чтобы получить доступ к снятым видео и результатам анализов, воспользуйтесь или API-запросами.

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

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

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

    3

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

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

    На стадии продакшна рекомендуется использовать в коде не логин и пароль, а полученный с помощью метода авторизацииarrow-up-right на их основе токен доступа access_token. Передайте токен в приложение:

    4

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

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

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

    5

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

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

    Добавьте через SPM зависимости: https://gitlab.com/oz-forensics/oz-mobile-ios-sdkarrow-up-right (процесс добавления зависимостей описан в документации Applearrow-up-right). OzLivenessSDK обязателен. OzLivenessSDKOnDevice можно не добавлять.
    2

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

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

    3

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

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

    На стадии продакшна рекомендуется использовать в коде не логин и пароль, а полученный с помощью метода авторизацииarrow-up-right на их основе токен доступа access_token. Передайте токен в приложение:

    4

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

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

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

    5

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

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

    Образец кодаarrow-up-right для Android

    Образец кодаarrow-up-right для iOS

    Руководство разработчика Android

    Руководство разработчика iOS

    Demo apparrow-up-right в PlayMarket

    Demo apparrow-up-right в TestFlight

    на нашем веб-сайтеarrow-up-right
    свяжитесь с намиenvelope
    CocoaPodsarrow-up-right
    веб-консолью
    Kotlin
    OzLivenessSDK.init(
        context,
        listOf(LicenseSource.LicenseAssetId(R.raw.forensics))
    )
    Kotlin
    OzLivenessSDK.setApiConnection(
        OzConnection.fromCredentials(host, username, password),
        statusListener(
            { token -> /* token */ },
            { ex -> /* error */ }
        )
    )
    Kotlin
    OzLivenessSDK.setApiConnection(OzConnection.fromServiceToken(host, token))
    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)
    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 */
                }
            }
        }
    }
    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 */ },
            )
    }
    OZSDK(licenseSources: [.licenseFileName("forensics.license")]) { licenseData, error in
        if let error = error {
            print(error.errorDescription)
        }
    }
    OZSDK.setApiConnection(Connection.fromCredentials(host: “https://sandbox.ohio.ozforensics.com”, login: login, password: p)) { (token, error) in
        // код для обработки токена или ошибки
    }
    OZSDK.setApiConnection(Connection.fromServiceToken(host: "https://sandbox.ohio.ozforensics.com", token: token)) { (token, error) in
    }
    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)
                    }
                }
            }
    extension ViewController: LivenessDelegate {
        func onResult(container: DataContainer) {
        }
        func onError(status: OZVerificationStatus?) {
        }
    }
    func onResult(container: DataContainer) {
      let analysisRequest = AnalysisRequestBuilder()
      analysisRequest.addContainer(container)
      analysisRequest.run(
                statusHandler: { status in
                },
                errorHandler: { error in
                }
            ) { result in
            }
    }
    allprojects {
        repositories {
            maven { url "https://ozforensics.jfrog.io/artifactory/main" }
        }
    }
    dependencies {
        implementation 'com.ozforensics.liveness:full:<version>'
        // You can find the version needed in the Android changelog
    }
    pod 'OZLivenessSDK', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios', :tag => '<version>' // You can find the version needed in  iOS changelog
    

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

    circle-info

    Мы рекомендуем использовать режим анализа на сервере, поскольку он обеспечивает более точные результаты по сравнению с анализом на устройстве.

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

    Oz Liveness Mobile SDK – это:

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

    • Высокое качество видео, которое обеспечивает точность проверки Liveness.

    Для работы Oz Liveness Mobile SDK нужна лицензия, которая привязывается к bundle_id приложения, например com.yourcompany.yourapp. Тестовую лицензию на месяц вы можете оформить самостоятельно , если вам требуется лицензия на более длительный срок – .

    hashtag
    Android

    hashtag
    1. Добавьте SDK в проект

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

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

    hashtag
    2. Инициализируйте SDK

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

    hashtag
    3. Запустите съемку видео

    Для начала съемки используйте метод startActivityForResult:

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

    Готовые видео содержатся в объекте sdkMediaResult.

    hashtag
    4. Запустите анализы

    Для запуска анализов используйте код ниже. mediaList – массив объектов, полученных из sdkMediaResult или извне (если вы снимали видео без использования нашего SDK).

    hashtag
    iOS

    hashtag
    1. Добавьте SDK в проект

    Установите OZLivenessSDK через . Чтобы встроить SDK в проект Xcode, в Podfile добавьте:

    hashtag
    2. Инициализируйте SDK

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

    hashtag
    3. Запустите съемку видео

    Создайте контроллер, который будет снимать видео:

    В делегате используйте протокол OZLivenessDelegate:

    hashtag
    4. Запустите анализы

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

    Шаги выше помогут вам в базовой интеграции наших мобильных SDK в ваше приложение. Данные анализов, выполненных в режиме «на устройстве» никуда не отправляются, поэтому, в отличие от данных серверных проверок, они не будут доступны через API или в веб-консоли. Однако обратите внимание: для проверки лицензии потребуется подключение к интернету. Мы также рекомендуем использовать наш сервис логирования – телеметрию. Записи телеметрии помогают в расследовании деталей атак. Необходимые учетные данные мы предоставим.

    для Android

    для iOS

    Android

    iOS

    в PlayMarket

    в TestFlight

    на нашем веб-сайтеarrow-up-right
    свяжитесь с намиenvelope
    CocoaPodsarrow-up-right
    allprojects {
        repositories {
            maven { url "https://ozforensics.jfrog.io/artifactory/main" }
        }
    }
    dependencies {
        implementation 'com.ozforensics.liveness:full:<version>'
        // номер версии можно найти в журнале изменений для Android
    }
    OzLivenessSDK.init(
        context,
        listOf(LicenseSource.LicenseAssetId(R.raw.forensics))
    )
    OzLivenessSDK.INSTANCE.init(
            context,
            Collections.singletonList(new LicenseSource.LicenseAssetId(R.raw.forensics)),
            null
    );
    val OZ_LIVENESS_REQUEST_CODE = 1
    val intent = OzLivenessSDK.createStartIntent(listOf( OzAction.Blank)) startActivityForResult(intent, OZ_LIVENESS_REQUEST_CODE)
    int OZ_LIVENESS_REQUEST_CODE = 1;
    Intent intent = OzLivenessSDK.INSTANCE.createStartIntent(Collections.singletonList(OzAction.Blank));
    startActivityForResult(intent, OZ_LIVENESS_REQUEST_CODE);
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
            if (requestCode == OZ_LIVENESS_REQUEST_CODE) {
                val sdkMediaResult = OzLivenessSDK.getResultFromIntent(data)
                val sdkErrorString = OzLivenessSDK.getErrorFromIntent(data)
                if (!sdkMediaResult.isNullOrEmpty()) {
                    analyzeMedia(sdkMediaResult)
                } else println(sdkErrorString)
            }
        }
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == OZ_LIVENESS_REQUEST_CODE) {
            List<OzAbstractMedia> sdkMediaResult = OzLivenessSDK.INSTANCE.getResultFromIntent(data);
            String sdkErrorString = OzLivenessSDK.INSTANCE.getErrorFromIntent(data);
            if (sdkMediaResult != null && !sdkMediaResult.isEmpty()) {
                analyzeMedia(sdkMediaResult);
            } else System.out.println(sdkErrorString);
        }
    }
    private fun analyzeMedia(mediaList: List<OzAbstractMedia>) {
        AnalysisRequest.Builder()
            .addAnalysis(Analysis(Analysis.Type.QUALITY, Analysis.Mode.ON_DEVICE, mediaList))
            .build()
            .run(object : AnalysisRequest.AnalysisListener {
                override fun onSuccess(result: List<OzAnalysisResult>) {
                    result.forEach { 
                        println(it.resolution.name)
                        println(it.folderId)
                    }
                }
                override fun onError(error: OzException) {
                    error.printStackTrace()
                }
            })
    } 
    private void analyzeMedia(List<OzAbstractMedia> mediaList) {
        new AnalysisRequest.Builder()
                .addAnalysis(new Analysis(Analysis.Type.QUALITY, Analysis.Mode.ON_DEVICE, mediaList, Collections.emptyMap()))
                .build()
                .run(new AnalysisRequest.AnalysisListener() {
                    @Override public void onStatusChange(@NonNull AnalysisRequest.AnalysisStatus analysisStatus) {}
                    @Override
                    public void onSuccess(@NonNull List<OzAnalysisResult> list) {
                        for (OzAnalysisResult result: list) {
                            System.out.println(result.getResolution().name());
                            System.out.println(result.getFolderId());
                        }
                    }
                    @Override
                    public void onError(@NonNull OzException e) { e.printStackTrace(); }
        });
    }
    pod 'OZLivenessSDK', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios', :tag => '<version>' // You can find the version needed in  iOS changelog
    
    OZSDK(licenseSources: [.licenseFileName("forensics.license")]) { licenseData, error in
        if let error = error {
            print(error.errorDescription)
        }
    }
    let actions: [OZVerificationMovement] = [.selfie]
    let ozLivenessVC: UIViewController = OZSDK.createVerificationVCWithDelegate(delegate, actions: actions) 
    self.present(ozLivenessVC, animated: true)
    let actions: [OZVerificationMovement] = [.selfie]
    let ozLivenessVC: UIViewController = OZSDK.createVerificationVCWithDelegate(delegate, actions: actions) 
    self.present(ozLivenessVC, animated: true)
    let analysisRequest = AnalysisRequestBuilder()
    let analysis = Analysis.init(
    media: mediaToAnalyze, 
    type: .quality, 
    mode: .onDevice)
    analysisRequest.uploadMedia(mediaToAnalyze)
    analysisRequest.addAnalysis(analysis)
    analysisRequest.run(
    scenarioStateHandler: { state in }, // обработчик шагов сценария
    uploadProgressHandler: { (progress) in } // обработчик загрузки файлов
    ) { (analysisResults : [OzAnalysisResult], error) in 
        // получение и обработка результатов анализов
        for result in analysisResults {
            print(result.resolution)
            print(result.folderID)
        }
    }
    Образец кодаarrow-up-right
    Образец кодаarrow-up-right
    Руководство разработчика
    Руководство разработчика
    Demo apparrow-up-right
    Demo apparrow-up-right