The Face Authentication module captures a returning user's face with the device camera and matches it against the face already enrolled for that user. It then returns a pass or fail result. iOS exposes two entry points: an in-flow Face Authentication step and a standalone Face Login API.
For an overview of this module and how it works, see Face Authentication.
How you use this module depends on your integration pattern. When the app defines the steps in code, you add the module to an IncdOnboardingFlowConfiguration as shown below; when the flow is defined in Dashboard, you reference it and let the back end drive the steps. See Integration Approaches.
Availability: The -l build variant.
Add Face Authentication
Add the module with addFaceAuthentication(configuration:) on IncdOnboardingFlowConfiguration. Face Authentication runs against an existing enrolled user, so your session must identify that user. Every setting on FaceAuthenticationConfiguration has a default, so pass a default-initialized configuration for the standard behavior, or build a custom one.
// Default configuration
flowConfig.addFaceAuthentication(configuration: FaceAuthenticationConfiguration())
// Custom configuration
flowConfig.addFaceAuthentication(configuration: faceAuthConfig)
Face Authentication ships both a v1 (legacy) and a v2 capture UI; the active one is selected by the SDK based on your Incode configuration.
Example
The example below builds a FaceAuthenticationConfiguration with tutorials and occlusion checks, adds it to the flow, and listens for the result through the IncdOnboardingDelegate.
let faceAuthConfig = FaceAuthenticationConfiguration(
showTutorials: true,
lensesCheck: true,
faceMaskCheck: true
)
let flowConfig = IncdOnboardingFlowConfiguration()
flowConfig.addFaceAuthentication(configuration: faceAuthConfig)
IncdOnboardingManager.shared.startOnboarding(
sessionConfig: IncdOnboardingSessionConfiguration(token: "<SESSION_TOKEN>"),
flowConfig: flowConfig,
delegate: self
)
// IncdOnboardingDelegate
func onFaceAuthenticationCompleted(_ result: FaceAuthenticationResult) {
// Face authentication completed
}
func onError(_ error: IncdFlowError) {
// Onboarding flow was aborted due to an error
}
Configuration Options
Configure the module by passing named parameters to the FaceAuthenticationConfiguration initializer. These are write-only: set at initialization, but not readable back from an existing instance. The table below lists the most commonly used ones. Any Bool? check left nil falls back to the corresponding manager-level faceAuth* default.
| Option | Type | Description |
|---|---|---|
deepsight |
DeepsightConfiguration |
Enables liveness/Deepsight configuration. Defaults to .default. The effective behavior can be governed by your back-end Flow or Workflow configuration. |
showTutorials |
Bool? |
Shows a tutorial before the scan. When nil, uses the manager's faceAuthShowTutorials. |
autoCaptureTimeout |
Double? |
Sets the auto-capture timeout, in seconds. |
captureAttempts |
Int? |
Sets the number of capture attempts. When nil, uses the manager's faceAuthMaxRetries. |
lensesCheck |
Bool? |
Enables eyeglass detection during capture. When nil, uses the manager's faceAuthLensesCheck. |
faceMaskCheck |
Bool? |
Enables face-mask detection during capture. When nil, uses the manager's faceAuthFaceMaskCheck. |
closedEyesCheck |
Bool? |
Enables closed-eyes detection during capture. When nil, uses the manager's faceAuthClosedEyesCheck. |
headCoverCheck |
Bool? |
Enables head-covering detection during capture. When nil, uses the manager's faceAuthHeadCoverCheck. |
imageQualitySeverity |
ImageQualitySeverity |
Sets how strict the image-quality check is during capture. Defaults to .defaultValue. |
occlusionCheck |
OcclusionCheck |
Enables a face occlusion check. Defaults to .disabled. |
Result
Face Authentication delivers a FaceAuthenticationResult to the onFaceAuthenticationCompleted(_:) callback on IncdOnboardingDelegate.
func onFaceAuthenticationCompleted(_ result: FaceAuthenticationResult)
FaceAuthenticationResult fields:
success: Bool?:trueif face authentication succeeded; otherwise,false.customerUUID: String?: The customer UUID associated with the authenticated face;nilwhen unavailable.image: UIImage?: The captured selfie image;nilwhen unavailable.selfieBase64: String?: The Base64-encoded selfie image;nilwhen unavailable.selfieEncryptedBase64: String?: The Base64-encoded encrypted selfie image;nilwhen unavailable.error: FaceAuthenticationError?: The module-specific error when authentication did not complete successfully; otherwise,nil.videoRecordingError: FaceAuthenticationError?: Set when video recording failed during capture, independent of the authentication outcome;nilwhen unavailable. Distinct fromerror; currently only ever carriesinsufficientStorageForVideoRecording.
Errors
Module errors surface through result.error as a FaceAuthenticationError. Pattern-match it to react to a specific case:
if case .spoofAttemptDetected = result.error {
// A spoof attempt was detected
}
FaceAuthenticationError cases:
errorinactiveSessionnonexistentCustomerlensesDetectedfaceMaskDetectedheadCoverDetectedclosedEyesDetectedfaceTooDarkspoofAttemptDetecteduserIsNotRecognizedselfieImageLowQualityhintNotProvidedfaceNotFoundfaceCroppingFailedfaceTooSmallfaceTooBlurrybadPhotoQualityprocessingErrorbadRequestdeniedCameraPermissionsuserCancelledselfieFaceOccludedinsufficientStorageForVideoRecordingunknown
Flow-level failures also arrive through the delegate's onError(_:).
Standalone: Face Login (-l variant)
Basic Usage
Outside a flow, authenticate a returning user with startFaceLogin. Pass a customerUUID for 1:1 verification, or omit it (nil) for 1:N identification. faceAuthMode selects server-side matching (.server) or on-device matching (.local, which requires the -l build).
IncdOnboardingManager.shared.startFaceLogin(
customerUUID: nil, // nil → 1:N; set → 1:1
faceAuthMode: .server, // .server or .local (.local needs -l)
faceAuthModeFallback: true,
lensesCheck: true,
faceMaskCheck: true
) { result in
// SelfieScanResult (see the Selfie module)
}
Full Signature
The call above uses the most common parameters; every parameter has a default, so you only pass the ones you need. The complete signature is:
func startFaceLogin(
showTutorials: Bool? = nil,
customerUUID: String? = nil,
faceAuthMode: FaceAuthMode? = nil,
faceAuthModeFallback: Bool? = nil,
lensesCheck: Bool? = nil,
faceMaskCheck: Bool? = nil,
forceThemeBackground: Bool = false,
logAuthenticationEnabled: Bool? = nil,
customLogo: UIImage? = nil,
streamFramesToken: String? = nil,
completion: @escaping (_ result: SelfieScanResult) -> Void
)
The additional optional parameters are: showTutorials (show a tutorial before the scan), forceThemeBackground, logAuthenticationEnabled, customLogo, and streamFramesToken.
Manage the Local Face Database
When matching on device, manage the local face database directly.
IncdOnboardingManager.shared.addFace(FaceInfo(faceTemplate: "…", customerUUID: "…", templateId: "…"))
IncdOnboardingManager.shared.removeFace(customerUUID: "…")
IncdOnboardingManager.shared.setFaces([FaceInfo(faceTemplate: "…", customerUUID: "…", templateId: "…")])
let faces = IncdOnboardingManager.shared.getFaces()
IncdOnboardingManager.shared.syncFaceLoginAttempts(delegate: nil) { ok, error in /* ok: Bool?, error: IncdLoginError? */ }
Supporting Types
FaceAuthMode:.server(liveness + match on the server),.local(on device,-lonly).FaceInfo:faceTemplate,customerUUID,templateId.