İçeriğe geç

Canlılık

Canlılık adımında kullanıcının ön kamerayla kısa bir video çekmesi istenir. Video Prove ID’de canlılık açısından kontrol edilir ve yüz, belgedeki fotoğrafla karşılaştırılır.

İşlem başlatılırken dönen gestureType, kullanıcıdan istenecek hareketi belirler.

import UIKit
import RKYC_iOS
final class LivenessViewController: UIViewController {
@IBOutlet weak var containerView: UIView!
private let livenessController = LivenessController()
override func viewDidLoad() {
super.viewDidLoad()
LivenessController.FACE_DETECTION_LAYER_SHAPE = .OVAL
LivenessController.CONTROL_FACE_CAPTURE = true
LivenessController.STOP_VIDEO_WHILE_RECORDING = true
LivenessController.GESTURE_TYPE = .EYE // .EYE, .MOUTH, .HEAD_VERTICAL, .HEAD_HORIZONTAL
LivenessController.IS_GESTURE_CONTROL_ENABLED = true
LivenessController.VIDEO_PREPARATION_TIME_IN_SECONDS = 3
LivenessController.VIDEO_TIME_IN_SECONDS = 5
livenessController.setDelegate(self)
livenessController.setGestureDelegate(self)
containerView.addSubview(livenessController.view)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
livenessController.startCapture()
}
}
extension LivenessViewController: LivenessDelegate, GestureDelegate {
func gestureControlled(gestureModel: GestureModel) {
livenessController.stopCapture()
// gestureModel.videoURL ve gestureModel.rotate değerlerini gönderin (aşağıda)
}
func onVideoCaptured(videoURL: URL, rotate: Int) {
// Hareket kontrolü kapalıyken (pasif canlılık) çağrılır
}
func onVideoStarting() { /* geri sayım gösterin */ }
func onVideoStarted() { }
func onVideoCanceled() { /* yüz alandan çıktı; kullanıcıdan tekrar denemesini isteyin */ }
func onFaceDetectionFailure(isAway: Bool) { /* isAway: yaklaşın, değilse uzaklaşın */ }
func onFaceDetectionSuccess() { }
func onFaceDetectionIdle() { }
func onMultiFaceDetected() { /* çerçevede yalnızca bir kişi olmalı */ }
func positionFailed(model: PositionFailedModel) { }
func positionSucceed(model: PositionSuccedModel) { }
func positionCorrect() { }
func preparationPositionControlled(model: PreparationPositionModel) { }
}

gestureType değerleri ve karşılıkları:

gestureType LivenessController.GESTURE_TYPE
EYE .EYE
MOUTH .MOUTH
HEAD-VERTICAL .HEAD_VERTICAL
HEAD-HORIZONTAL .HEAD_HORIZONTAL
MULTIDIR_… .RANDOMIZED_MULTI_GESTURE

Baş hareketlerinde gestureModel.gestureScore hareketin ne kadar iyi yapıldığını gösterir; skor düşükse (örneğin 0.8 altında) kullanıcıdan tekrar denemesini isteyip startCapture() metodunu yeniden çağırın.

MULTIDIR_ ile başlayan bir gestureType, kullanıcıdan başını art arda birkaç yöne çevirmesini ister. Yönler önekten sonra - ile ayrılarak gelir; bunları SDK’ya HeadPosition değerleri olarak verin:

let directions = gestureType.dropFirst("MULTIDIR_".count).split(separator: "-")
LivenessController.GESTURE_TYPE = .RANDOMIZED_MULTI_GESTURE
LivenessController.RANDOMIZED_GESTURES = directions.compactMap { HeadPosition(string: String($0)) }
LivenessController.IS_GESTURE_CONTROL_ENABLED = true
LivenessController.VIDEO_PREPARATION_TIME_IN_SECONDS = 0
import ProveIDApiClient
guard let video = try? Data(contentsOf: gestureModel.videoURL) else { return }
let body = FaceVerificationModel(transactionId: transactionId,
video: video.base64EncodedString(),
rotate: gestureModel.rotate)
FaceServiceAPI.verifyFace(body: body) { result in
switch result {
case .success(let response):
let controls = response.controlResults
showLivenessResult(controls)
case .failure(let error):
showError(error)
}
}
try? FileManager.default.removeItem(at: gestureModel.videoURL) // videoyu cihazda bırakmayın

Hareket istemeden, kısa bir kayıtla çalışır. Video onVideoCaptured(videoURL:rotate:) ile gelir; aynı şekilde gönderin.

LivenessController.IS_GESTURE_CONTROL_ENABLED = false
LivenessController.VIDEO_PREPARATION_TIME_IN_SECONDS = 1
LivenessController.VIDEO_TIME_IN_SECONDS = 2

Video yerine tek bir fotoğrafla:

LivenessController.LIVENESS_FROM_IMAGE_ENABLED = true
livenessController.setLivenessPhotoDelegate(self)
extension LivenessViewController: LivenessPhotoDelegate {
func photoCaptured(image: UIImage) {
livenessController.stopCapture()
let body = FaceVerificationWithImageInputModel(transactionId: transactionId,
image: image.pngData()!.base64EncodedString())
FaceServiceAPI.verifyFaceWithImage(body: body) { result in /* verifyFace ile aynı */ }
}
func eligiblePositionForCapture(model: PreparationPositionModel) { }
}

LivenessWithCard modülüyle kullanıcının yüzü ve kimlik kartının ön yüzü birlikte yakalanır ve yüz, karttaki fotoğrafla eşleştirilir.

import LivenessWithCard
LWICController.CARD_CAPTURE_ENABLED = true
LWICController.LIVENESS_FROM_IMAGE_ENABLED = true
LWICController.FACE_DETECTION_LAYER_SHAPE = .OVAL
let lwicController = LWICController()
lwicController.cardType = .NEW_ID
lwicController.setDelegate(self)
lwicController.setCardDelegate(self)
lwicController.setPhotoDelegate(self)
containerView.addSubview(lwicController.view)
lwicController.startCapture()

Yakalanan görüntüyü gönderin:

let body = CheckLivenessWithCardImageInputModel(transactionId: transactionId,
imageBase64: image.pngData()!.base64EncodedString(),
livenessProcessStage: "FACEANDFRONT")
IDServiceAPI.checkLivenessWithIdCardImage(body: body) { result in /* … */ }

Bu adım için işlemi LIVENESS_WithIdCard kontrolüyle başlatın. Yüz eşleşmesi LWICONLYFRONTFACESIMILARITY kontrolünde döner.

Ayar Açıklama
FACE_DETECTION_LAYER_SHAPE Yüz çerçevesinin şekli (.OVAL)
CONTROL_FACE_CAPTURE Yalnızca çerçevede yüz varken kayıt yapar
STOP_VIDEO_WHILE_RECORDING Yüz çerçeveden çıkarsa kaydı iptal eder
FACE_OVER_SCREEN_RATIO Yüz çerçevesinin ekrana oranı (örnek: 0.6)
FACE_AWAY_CHECK_RATIO isAway bildirilmeden önce yüzün ne kadar uzakta olabileceği
GESTURE_TYPE İstenecek hareket
IS_GESTURE_CONTROL_ENABLED Hareketi cihaz üzerinde kontrol eder
HEAD_HORIZONTAL_MAX_PREP_THRESHOLD, HEAD_VERTICAL_MAX_PREP_THRESHOLD Kayıt başlamadan önce izin verilen baş açısı (örnek: 15)
VIDEO_PREPARATION_TIME_IN_SECONDS Kayıttan önceki geri sayım
VIDEO_TIME_IN_SECONDS Kayıt süresi
LIVENESS_FROM_IMAGE_ENABLED Video yerine fotoğraf çeker