Skip to content

Implementation

Import

Import
In your sources, import IDLiveFaceCamera.

import IDLiveFaceCamera

Instantiate

Instantiate and configure the capture module
Instantiate an IDCameraController. It will communicate with your code by using IDCameraControllerDelegate protocol. Set your class as delegate.
Configure it's behavior as necessary (see the framework docs for available options). Setup face detector settings if needed (including face detection engines to use).

If you plan to use IAD, call prepareForIAD() method on IDCameraController. This will prepare the camera controller for collecting the necessary data.

// instantiate the camera controller from storyboard
guard let vc = IDCameraController.instantiate() else {
    print("can't instantiate camera viewcontroller")
    return
}

// set options before showing
vc.delegate = self
vc.allowToPreviewBeforeSending = true

// prepare for IAD
vc.prepareForIAD()

Present the controller

Present
Present the controller.
It will ask the user for photo permission if needed, but you might want to check that in advance before presenting it.

self.show(vc, sender: nil)

User will take a photo, either manually or automatically using face detection. When it happens, delegate method cameraController(_, didCaptureImage:) will be called.

Receive the photo

Receive the photo
Receive the photo from the delegate method parameter. Alternatively, if you wish to use IAD, use createIADBundle() method to create the IAD bundle. This binary bundle will contain all necessary information for sending to server, including the photo.

func cameraController(_ controller: IDCameraControllerBase, didCaptureImage image: IDImage) {
    controller.currentMode = .busy // set visual status to "busy" while async operation is running
    print("user took a photo")

    let bundle = try? createIADBundle() // process the exception if needed

    // process the image/bundle, e.g. show on screen/send to server
    // ...
}

Process the photo

Process the photo
Process photo/IAD bundle as necessary.
If you are using your own server, send the data to your endpoint and receive the result.

Display the result

Display the result
If desired, use IDCameraController.setCurrentMode(_, message:) method to show the result within the controller. Choose the desired ViewMode based on whether the result result of your check was successfull: ViewMode.resultSuccess/.resultFailure/.result show the green (checkmark), red (cross) or black result button accordingly.

cameraController.setCurrentMode(success ? .resultSuccess : .resultFailure,
                                message: message)

Dismiss the controller

Dismiss the controller
When user clicks the result button, delegate method cameraControllerUserDidPressResultButton(_) will be called, at that time you can dismiss the camera controller.

func cameraControllerUserDidPressResultButton(_ controller: IDCameraControllerBase) {
    print("user has finished")
    controller.dismiss(animated: true)
}

User also might dismiss the controller manually. You can track this by using the UIAdaptivePresentationControllerDelegate protocol.

If delegate method cameraController(_, didEncounterError error:) is called, dismiss the camera controller and handle the error in your app.

func cameraController(_ controller: IDCameraControllerBase, didEncounterError error: IDCameraController.Error) {
    print("camera error: \(error), dismissing")
    controller.dismiss(animated: true)
}

You might also want to dismiss the camera controller in case the app resigns active (UIApplication.willResignActiveNotification).

Face Detector Result Type

Case Description
ok The photograph is fine and face has passed all checks, but delay hasn't passed
fire The photo is fine and face has passed all checks also delay has passed, take photo
tooManyFaces There is more than one face in the picture.
faceNotFound No face is found in the camera-taken image.
faceTooSmall The face is too far away from the camera or occupies a small area of the image.
faceTooBig The face is too big (too close to the camera)
faceCropped The face is only partially visible.
faceOffCenter The face is not in the center.
faceAngled The face is too big of an angle relative to the camera's view angle.
movementDetected The face is moved.
photoLowQuality The photo quality is not good enough.
photoBlurred A blur was detected.
photoBadLighting The frame lighting is bad.
customUserError A custom face status that you can set to show to the user.
faceDetectionError Face detection error, face detection cycle.
faceDetectionIgnorableError Face detection error that shouldn't stop face detection process.
faceDetectionFatalError Fatal face detection error, face detection should be stopped
unknownError We can't make any statements about the face because we don't have enough information.

Some messages with details in english are also possible to get from:

public enum FaceDetectorResult: Equatable {

 case ok, fire, ...
 ...
 public var message: String { ... } // returns message with details for specified case

 public var isError: Bool { ... } // returns false if all face validation are passed.
}