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.
Hareket (gesture) ile canlılık
Bölüm başlığı “Hareket (gesture) ile canlılık”İşlem başlatılırken dönen gestureType, kullanıcıdan istenecek hareketi belirler.
import UIKitimport 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.
Birden fazla baş yönü
Bölüm başlığı “Birden fazla baş yö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_GESTURELivenessController.RANDOMIZED_GESTURES = directions.compactMap { HeadPosition(string: String($0)) }LivenessController.IS_GESTURE_CONTROL_ENABLED = trueLivenessController.VIDEO_PREPARATION_TIME_IN_SECONDS = 0Videoyu gönderin
Bölüm başlığı “Videoyu gönderin”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ınPasif canlılık
Bölüm başlığı “Pasif canlılık”Hareket istemeden, kısa bir kayıtla çalışır. Video onVideoCaptured(videoURL:rotate:) ile gelir; aynı şekilde gönderin.
LivenessController.IS_GESTURE_CONTROL_ENABLED = falseLivenessController.VIDEO_PREPARATION_TIME_IN_SECONDS = 1LivenessController.VIDEO_TIME_IN_SECONDS = 2Fotoğraftan canlılık
Bölüm başlığı “Fotoğraftan canlılık”Video yerine tek bir fotoğrafla:
LivenessController.LIVENESS_FROM_IMAGE_ENABLED = truelivenessController.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) { }}Kimlik kartıyla canlılık
Bölüm başlığı “Kimlik kartıyla canlılık”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 = trueLWICController.LIVENESS_FROM_IMAGE_ENABLED = trueLWICController.FACE_DETECTION_LAYER_SHAPE = .OVAL
let lwicController = LWICController()lwicController.cardType = .NEW_IDlwicController.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.
Ayarlar
Bölüm başlığı “Ayarlar”| 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 |