Guia Detalhado de Uso

Aprofunde seu entendimento e personalize com precisão, com explicações completas que orientam cada etapa do processo.

📑 Sumário

  1. 📌 Visão Geral
  2. ✅ Requisitos de Compatibilidade
  3. ⚙️ Instalação
  4. 🔌 Criação do provedor de Liveness
    4.1 ✅ Provedores Disponíveis
    4.2 🧩 Provedor: IProov
    4.3 🧩 Provedor: Facetec
    4.4 🧩 Provedor: Fortface
  5. 📦 Estrutura das Classes Importantes
    5.1 Core SDK
    5.2 Facetec
    5.3 Iproov
    5.4 Fortface
  6. 🔍 Principais Classes e Métodos de Chamada
  7. 📱 Fluxo de Telas
    7.1 Telas CertiFace
    7.2 Telas iProov
    7.3 Telas Facetec
    7.4 Telas Fortface
  8. 🧪 Ambiente de Testes
  9. 🛠️ Boas Práticas
  10. 📜 Changelogs e Versões
  11. 🔗 Links externos

📌 Visão Geral

O Certiface SDK é um SDK modular e extensível, responsável por oferecer verificação facial remota (Liveness Detection) via múltiplos provedores de biometria.

Sua arquitetura foi desenvolvida com foco em segurança, personalização e abstração de provedores, permitindo que novos fornecedores sejam incorporados no futuro com impacto mínimo na integração.


✅ Requisitos de Compatibilidade

  • Target mínimo: iOS 15.0

  • Versão do Swift: 5+

  • Linguagem base: Swift

  • Gerenciador de dependência: CocoaPods, SPM

  • Credenciais:

    • AppKey: utilizada pelo provedor IProov
    • Token: utilizado pelo provedor SaaS (FaceTec e Fortface)
  • Permissões no Info.plist:

    • NSCameraUsageDescription: acesso à câmera
    • NSLocationWhenInUseUsageDescription: localização do dispositivo.
  • Ambientes suportados:

    • hml: Homologação
    • prd: Produção

⚙️ Instalação

CocoaPods

Passo 1: Caso você não possua um arquivo Podfile no seu projeto, basta executar o comando abaixo na raiz do projeto que um novo arquivo desse será criado:

pod init

Passo 2: No início do Podfile, inclua a linha abaixo:

source 'https://github.com/oititec/ios-artifactory.git'

Para uso dos artefatos em fase BETA utilize essa URL: 'https://github.com/oititec/ios-artifactory-beta.git'

Passo 3: Em seguida, adicione as dependências necessárias:

pod 'CertifaceSDK', '~> x.y.z'

Substitua x.y.z pela versão mais recente fornecida pela CertiFace.

Para uso da versão de desenvolvimento (menos segura) deve-se utilizar o CertifaceSDK-Debug

Passo 4: Execute o comando de instalação dos pods:

pod install

SPM

Xcode UI

  1. Adicione o pacote selecionando a opção File → Add Package Dependencies no Xcode

  2. Pesquise pela URL do módulo, selecione a opção Up to Next Major Version na lista de Dependency Rule e clique no botão Add Package.

https://github.com/oititec/ios-modules-certiface.git
  1. Clique no botão Add Package.

Package manifest

  1. Adicione o package do CertifaceSDK na vetor de dependências:
dependencies: [
    .package(
        name: "CertifaceSDK",
        url: "https://github.com/oititec/ios-modules-certiface.git",
        // Especifique a versão desejada
        .upToNextMajor(from: "X.Y.Z")
    )
]
  1. Adicione o produto do CertifaceSDK na vetor de dependências do target desejado:
.target(
    name: "MyTarget",
    dependencies: [
        .product(name: "CertifaceSDK", package: "ios-modules-certiface"),
    ]
)

🔌 Criação do provedor de Liveness

O CertifaceSDK utiliza o padrão de fábrica para criar instâncias específicas de cada provedor de Liveness:

// iProov (credencial: AppKey)
let manager = CertifaceSDKFactory.createLivenessManager(for: .iproov)

// SaaS - FaceTec ou Fortface (credencial: Token)
let manager = CertifaceSDKFactory.createLivenessManager(for: .saas)

✅ Provedores Disponíveis

ProvedorIdentificador EnumSuporte
IProovLivenessProvider.iproov✅ Suporte Atual
FacetecLivenessProvider.saas (definido pelo Token)✅ Suporte Atual
FortfaceLivenessProvider.saas (definido pelo Token)✅ Suporte Atual
[Novo Provedor]em breve🔜 Planejado

🔑 Credenciais

O LivenessManagerOptions possui dois construtores, de acordo com o provedor utilizado. Ambos retornam o mesmo builder, com as mesmas opções de customização:

// IProov: AppKey
let options = LivenessManagerOptions
    .builder(appKey: "APP_KEY", environment: .hml)
    .build()

// SaaS (FaceTec / Fortface): Token
let options = LivenessManagerOptions
    .builder(token: "TOKEN", environment: .hml)
    .build()

Customização do carregamento (todos os provedores)

import CertifaceSDK

// MARK: - View customizada

final class CustomLoadingViewImpl: CustomLoadingView {
    // Código ...
}

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let options = LivenessManagerOptions
            .builder(token: "TOKEN", environment: .hml)
            .setLoadingCustomization { loadingBuilder in
                loadingBuilder
                    .setBackgroundColor(.brown)
                    .setSpinnerColor(.red)
                    .setSpinnerWidth(10.7)
                    .setSpinnerScaleFactor(5)
            }
            .setCustomLoadingView(CustomLoadingViewImpl())
            .build()

        let manager = CertifaceSDKFactory.createLivenessManager(for: .iproov)
        manager.start(at: self, options: options, callback: self)
    }
}

🧩 Provedor: IProov

Este provedor oferece uma jornada de verificação baseada em luz e detecção passiva. Utiliza a AppKey como credencial e o identificador .iproov.

🚀 Execução da Jornada

Após criar o LivenessManagerOptions fornecendo a AppKey, o ambiente de execução, as telas customizadas e a customização do IProov, inicie a jornada com:

import CertifaceSDK

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let options = LivenessManagerOptions
            .builder(appKey: "APP_KEY", environment: .hml)
            .build()

        let manager = CertifaceSDKFactory.createLivenessManager(for: .iproov)
        manager.start(at: self, options: options, callback: self)
    }
}

extension ContentViewController: LivenessCallback {
    func onSuccess(_ result: LivenessResult) {
        // Código ...
    }

    func onError(_ error: LivenessError) {
        // Código ...
    }
}
  

🎨 Personalização Visual

Utilize o builder da classe IProovCustomization para configurar a interface do fluxo.

UIViews customizadas

O SDK permite customizar completamente as telas presentes na jornada (exceto a tela de Liveness), para tal é necessário que as UIViews estejam em conformidade com os protocolos destinados a cada tela:

import CertifaceSDK

// MARK: - Views customizadas

final class CustomLoadingViewImpl: CustomLoadingView {
    // Código ...
}

final class CustomInstructionViewImpl: UIView, CustomInstructionView {
    var backButton: UIButton!
    var continueButton: UIButton!

    func changeLoadingVisibility(to visibility: Visibility) {
        // Código ...
    }
}

final class CustomCameraPermissionViewImpl: UIView, CustomCameraPermissionView {
    var backButton: UIButton!
    var checkPermissionButton: UIButton!
    var openSettingsButton: UIButton!
    var closeButton: UIButton!

    func showBottomSheet(visibility: CertifaceSDK.Visibility) {
        // Código ...
    }
}

final class IProovCustomResultViewImpl: UIView, IProovCustomResultView {
    var retryButton: UIButton!

    func display(for resultType: IProovResultLayoutType, userFeedback: [String]?) {
        // Código ...
    }

    func changeLoadingVisibility(to visibility: Visibility) {
        // Código ...
    }
}

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let customization = IProovCustomization
            .builder()
            .setCustomInstructionView(CustomInstructionViewImpl())
            .setCustomCameraPermissionView(CustomCameraPermissionViewImpl())
            .setCustomResultView(IProovCustomResultViewImpl())
            .build()

        let options = LivenessManagerOptions
            .builder(appKey: "APP_KEY", environment: .hml)
            .setCustomLoadingView(CustomLoadingViewImpl())
            .setShowInstructionsScreen(true)
            .setIProovCustomization(customization)
            .build()

        let manager = CertifaceSDKFactory
            .createLivenessManager(for: .iproov)

        manager.start(at: self, options: options, callback: self)
    }
}

extension ContentViewController: LivenessCallback {
    func onSuccess(_ result: LivenessResult) {
        // Código ...
    }

    func onError(_ error: LivenessError) {
        // Código ...
    }
}

Aparência customizada

O SDK permite customizar somente as características das telas da jornada mantendo a estrutura padrão:

import CertifaceSDK

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let customization = IProovCustomization.builder()
            .setInstructionCustomization { instructionBuilder in
                instructionBuilder
                    .setBackgroundColor(.purple)
                    .setBackButtonIcon(UIImage(systemName: "trash") ?? UIImage())
                    .setBackButtonIconColor(.red)
                    .setBackButtonBackgroundColor(.green)
                    .setBackButtonBorderColor(.white)
                    .setContextImage(UIImage(systemName: "person") ?? UIImage())
                    .setBottomSheetColor(.cyan)
                    .setBottomSheetCornerRadius(10)
                    .setTitle("Titulo aqui")
                    .setTitleFont(.systemFont(ofSize: 30, weight: .bold))
                    .setTitleColor(.brown)
                    .setCaption("Subtitulo aqui")
                    .setCaptionFont(.systemFont(ofSize: 20, weight: .regular))
                    .setCaptionColor(.systemPink)
                    .setFirstInstructionIcon(UIImage(systemName: "star") ?? UIImage())
                    .setFirstInstructionTitle("Descrição do ambiente")
                    .setFirstInstructionTitleFont(.systemFont(ofSize: 25, weight: .medium))
                    .setFirstInstructionTitleColor(.darkGray)
                    .setSecondInstructionIcon(UIImage(systemName: "house") ?? UIImage())
                    .setSecondInstructionTitle("Descrição para uso de accessórios")
                    .setSecondInstructionTitleFont(.systemFont(ofSize: 18, weight: .semibold))
                    .setSecondInstructionTitleColor(.magenta)
                    .setContinueButtonText("Iniciar")
                    .setContinueButtonFont(.systemFont(ofSize: 24, weight: .thin))
                    .setContinueButtonTextColor(.lightGray)
                    .setContinueButtonBackgroundColor(.systemPink)
                    .setContinueButtonBorderColor(.white)
            }
            .setCameraPermissionCustomization { cameraPermissionBuilder in
                cameraPermissionBuilder
                    .setBackgroundColor(.systemPink)
                    .setBackButtonIcon(UIImage(named: "pencil"))
                    .setBackButtonIconColor(.white)
                    .setBackButtonBackgroundColor(.white)
                    .setBackButtonBorderColor(.white)
                    .setCameraImage(UIImage(named: "trash"))
                    .setCameraImageColor(.cyan)
                    .setTitle("Permissão de câmera customizada")
                    .setTitleColor(.white)
                    .setTitleFont(.systemFont(ofSize: 40, weight: .heavy))
                    .setCaption("Descrição da permissão de câmera")
                    .setCaptionColor(.purple)
                    .setCaptionFont(.systemFont(ofSize: 30, weight: .ultraLight))
                    .setCheckPermissionButtonText("Averiguar")
                    .setCheckPermissionButtonTextFont(.systemFont(ofSize: 24, weight: .black))
                    .setCheckPermissionButtonTextColor(.red)
                    .setCheckPermissionButtonBackgroundColor(.blue)
                    .setCheckPermissionButtonBorderColor(.white)
                    .setBottomSheetColor(.green)
                    .setBottomSheetCornerRadius(0)
                    .setBottomSheetTitle("Hora de ir para os ajustes")
                    .setBottomSheetTitleColor(.blue)
                    .setBottomSheetTitleFont(.systemFont(ofSize: 30, weight: .light))
                    .setBottomSheetCaption("Ou será que não?")
                    .setBottomSheetCaptionColor(.orange)
                    .setBottomSheetCaptionFont(.systemFont(ofSize: 25, weight: .bold))
                    .setOpenSettingsButtonText("Pular para ajustes")
                    .setOpenSettingsButtonTextFont(.systemFont(ofSize: 20, weight: .medium))
                    .setOpenSettingsButtonTextColor(.red)
                    .setOpenSettingsButtonBackgroundColor(.blue)
                    .setOpenSettingsButtonBorderColor(.white)
                    .setCloseButtonText("Fechar tudo")
                    .setCloseButtonTextFont(.systemFont(ofSize: 22, weight: .regular))
                    .setCloseButtonTextColor(.magenta)
                    .setCloseButtonBackgroundColor(.cyan)
                    .setCloseButtonBorderColor(.red)
            }
            .setLivenessCustomization { livenessBuilder in
                livenessBuilder
                    .setCloseButtonImage(UIImage(named: "pencil") ?? UIImage())
                    .setCloseButtonImageColor(.magenta)
                    .setTitle("HEADER")
                    .setTitleTextColor(.yellow)
                    .setTitleBackgroundColor(.blue)
                    .setPromptTextColor(.green)
                    .setPromptBackgroundColor(.white)
                    .setPromptRoundedCornersEnabled(false)
                    .setBackgroundColor(.red)
                    .setLogoImage(UIImage(named: "doc.text.magnifyingglass") ?? UIImage())
                    .setFilterStyle(.lineDrawing(.vibrant))
                    .setFilterLineDrawingForegroundColor(.purple)
                    .setFilterLineDrawingBackgroundColor(.orange)
                    .setLAOvalStrokeCapturingColor(.cyan)
                    .setLAOvalStrokeCompletedColor(.systemPink)
                    .setGPAOvalStrokeNotReadyColor(.yellow)
                    .setGPAOvalStrokeReadyColor(.blue)
                    .setTimeout(20)
            }
            .setResultCustomization { resulBuilder in
                resulBuilder
                    .setSuccessBackgroundColor(.red)
                    .setSuccessImage(UIImage(named: "doc.text.magnifyingglass"))
                    .setSuccessMessage("SUCCESS")
                    .setSuccessMessageColor(.blue)
                    .setMessageFont(.systemFont(ofSize: 30, weight: .thin))
                    .setErrorBackgroundColor(.blue)
                    .setErrorImage(UIImage(named: "pencil"))
                    .setErrorMessage("ERROR")
                    .setErrorMessageColor(.red)
                    .setRetryBackgroundColor(.magenta)
                    .setRetryImage(UIImage(named: "phone") ?? UIImage())
                    .setRetryMessageColor(.white)
                    .setRetryUserFeedbackInterval(3)
                    .setRetryButtonText("Again")
                    .setRetryButtonTextFont(.systemFont(ofSize: 35, weight: .semibold))
                    .setRetryButtonTextColor(.cyan)
                    .setRetryButtonBackgroundColor(.brown)
                    .setRetryButtonBorderColor(.white)
            }
            .build()

        let options = LivenessManagerOptions
            .builder(appKey: "APP_KEY", environment: .hml)
            .setLoadingCustomization { loadingBuilder in
                loadingBuilder
                    .setBackgroundColor(.brown)
                    .setSpinnerColor(.red)
                    .setSpinnerWidth(10.7)
                    .setSpinnerScaleFactor(5)
            }
            .setIProovCustomization(customization)
            .build()

        let manager = CertifaceSDKFactory.createLivenessManager(for: .iproov)
        manager.start(at: self, options: options, callback: self)
    }
}

extension ContentViewController: LivenessCallback {
    func onSuccess(_ result: LivenessResult) {
        // Código ...
    }

    func onError(_ error: LivenessError) {
        // Código ...
    }
}
  

🧩 Provedor: Facetec

A FaceTec oferece um fluxo de verificação com detecção ativa (movimentos, rotação de rosto), com alta personalização visual e textual. É executada pelo provedor .saas, que utiliza o Token como credencial.

🚀 Execução da Jornada

import CertifaceSDK

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let options = LivenessManagerOptions
            .builder(token: "TOKEN", environment: .hml)
            .build()

        let manager = CertifaceSDKFactory.createLivenessManager(for: .saas)
        manager.start(at: self, options: options, callback: self)
    }
}

extension ContentViewController: LivenessCallback {
    func onSuccess(_ result: LivenessResult) {
        // Código ...
    }

    func onError(_ error: LivenessError) {
        // Código ...
    }
}

🎨 Personalização Visual

Personalize a interface usando FacetecCustomization:

import CertifaceSDK

// MARK: - Views customizadas

final class CustomLoadingViewImpl: CustomLoadingView {
    // Código ...
}

final class CustomInstructionViewImpl: UIView, CustomInstructionView {
    var backButton: UIButton!
    var continueButton: UIButton!

    func changeLoadingVisibility(to visibility: Visibility) {
        // Código ...
    }
}

final class CustomCameraPermissionViewImpl: UIView, CustomCameraPermissionView {
    var backButton: UIButton!
    var checkPermissionButton: UIButton!
    var openSettingsButton: UIButton!
    var closeButton: UIButton!

    func showBottomSheet(visibility: CertifaceSDK.Visibility) {
        // Código ...
    }
}

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let customization = FacetecCustomization
            .builder()
            .setCustomInstructionView(CustomInstructionViewImpl())
            .setCustomCameraPermissionView(CustomCameraPermissionViewImpl())
            .build()

        let options = LivenessManagerOptions
            .builder(token: "TOKEN", environment: .hml)
            .setCustomLoadingView(CustomLoadingViewImpl())
            .setShowInstructionsScreen(true)
            .setFacetecCustomization(customization)
            .build()

        let manager = CertifaceSDKFactory
            .createLivenessManager(for: .saas)

        manager.start(at: self, options: options, callback: self)
    }
}

extension ContentViewController: LivenessCallback {
    func onSuccess(_ result: LivenessResult) {
        // Código ...
    }

    func onError(_ error: LivenessError) {
        // Código ...
    }
}

Aparência customizada

import CertifaceSDK

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let customization = FacetecCustomization.builder()
            .setInstructionCustomization { instructionBuilder in
                instructionBuilder
                    .setBackgroundColor(.purple)
                    .setBackButtonIcon(UIImage(systemName: "trash") ?? UIImage())
                    .setBackButtonIconColor(.red)
                    .setBackButtonBackgroundColor(.green)
                    .setBackButtonBorderColor(.white)
                    .setContextImage(UIImage(systemName: "person") ?? UIImage())
                    .setBottomSheetColor(.cyan)
                    .setBottomSheetCornerRadius(10)
                    .setTitle("Titulo aqui")
                    .setTitleFont(.systemFont(ofSize: 30, weight: .bold))
                    .setTitleColor(.brown)
                    .setCaption("Subtitulo aqui")
                    .setCaptionFont(.systemFont(ofSize: 20, weight: .regular))
                    .setCaptionColor(.systemPink)
                    .setFirstInstructionIcon(UIImage(systemName: "star") ?? UIImage())
                    .setFirstInstructionTitle("Descrição do ambiente")
                    .setFirstInstructionTitleFont(.systemFont(ofSize: 25, weight: .medium))
                    .setFirstInstructionTitleColor(.darkGray)
                    .setSecondInstructionIcon(UIImage(systemName: "house") ?? UIImage())
                    .setSecondInstructionTitle("Descrição para uso de accessórios")
                    .setSecondInstructionTitleFont(.systemFont(ofSize: 18, weight: .semibold))
                    .setSecondInstructionTitleColor(.magenta)
                    .setContinueButtonText("Iniciar")
                    .setContinueButtonFont(.systemFont(ofSize: 24, weight: .thin))
                    .setContinueButtonTextColor(.lightGray)
                    .setContinueButtonBackgroundColor(.systemPink)
                    .setContinueButtonBorderColor(.white)
            }
            .setCameraPermissionCustomization { cameraPermissionBuilder in
                cameraPermissionBuilder
                    .setBackgroundColor(.systemPink)
                    .setBackButtonIcon(UIImage(named: "pencil"))
                    .setBackButtonIconColor(.white)
                    .setBackButtonBackgroundColor(.white)
                    .setBackButtonBorderColor(.white)
                    .setCameraImage(UIImage(named: "trash"))
                    .setCameraImageColor(.cyan)
                    .setTitle("Permissão de câmera customizada")
                    .setTitleColor(.white)
                    .setTitleFont(.systemFont(ofSize: 40, weight: .heavy))
                    .setCaption("Descrição da permissão de câmera")
                    .setCaptionColor(.purple)
                    .setCaptionFont(.systemFont(ofSize: 30, weight: .ultraLight))
                    .setCheckPermissionButtonText("Averiguar")
                    .setCheckPermissionButtonTextFont(.systemFont(ofSize: 24, weight: .black))
                    .setCheckPermissionButtonTextColor(.red)
                    .setCheckPermissionButtonBackgroundColor(.blue)
                    .setCheckPermissionButtonBorderColor(.white)
                    .setBottomSheetColor(.green)
                    .setBottomSheetCornerRadius(0)
                    .setBottomSheetTitle("Hora de ir para os ajustes")
                    .setBottomSheetTitleColor(.blue)
                    .setBottomSheetTitleFont(.systemFont(ofSize: 30, weight: .light))
                    .setBottomSheetCaption("Ou será que não?")
                    .setBottomSheetCaptionColor(.orange)
                    .setBottomSheetCaptionFont(.systemFont(ofSize: 25, weight: .bold))
                    .setOpenSettingsButtonText("Pular para ajustes")
                    .setOpenSettingsButtonTextFont(.systemFont(ofSize: 20, weight: .medium))
                    .setOpenSettingsButtonTextColor(.red)
                    .setOpenSettingsButtonBackgroundColor(.blue)
                    .setOpenSettingsButtonBorderColor(.white)
                    .setCloseButtonText("Fechar tudo")
                    .setCloseButtonTextFont(.systemFont(ofSize: 22, weight: .regular))
                    .setCloseButtonTextColor(.magenta)
                    .setCloseButtonBackgroundColor(.cyan)
                    .setCloseButtonBorderColor(.red)
            }
            .setLivenessDefaultTheme(customizeLivenessTheme)
            .setLivenessLowLightTheme(customizeLivenessTheme)
            .setLivenessTexts([
                // Ready
                .readyHeader1: "ready_title_1",
                .readyHeader2: "ready_title_2",
                .readyMessage1: "ready_message_1",
                .readyMessage2: "ready_message_2.",
                .readyButton: "ready_button",

                // feedback
                .feedbackCenterFace: "feedback_center_face",
                .feedbackFaceNotFound: "feedback_no_face",
                .feedbackFaceNotLookingStraightAhead: "feedback_straight_ahead",
                .feedbackFaceNotUpright: "feedback_upright",
                .feedbackHoldSteady: "feedback_hold",
                .feedbackMovePhoneAway: "feedback_move_away",
                .feedbackMovePhoneCloser: "feedback_move_closer",
                .feedbackMovePhoneToEyeLevel: "feedback_move_eye_level",
                .feedbackUseEvenLighting: "feedback_even_lighting",
                .feedbackFrameYourFace: "feedback_start",
                .feedbackPositionFaceStraightInOval: "feedback_look_forward",
                .feedbackHoldSteady1: "feedback_hold_3",
                .feedbackHoldSteady2: "feedback_hold_2",
                .feedbackHoldSteady3: "feedback_hold_1",
                .feedbackNeutralExpression: "feedback_no_smile",
                .feedbackBrightenYourEnvironment: "feedback_too_dark",
                .feedbackRemoveDarkGlasses: "feedback_remove_glasses",
                .feedbackConditionsTooBright: "feedback_too_bright",

                // Upload
                .resultUploadMessage: "upload_message",
                .resultSuccessMessage: "upload_all_right_message",

                // Retry
                .retryHeader: "retry_header",
                .retrySubheader: "retry_subheader",
                .retryMessageSmile: "retry_message_smile",
                .retryMessageLightning: "retry_message_lighting",
                .retryMessageContrast: "retry_message_contrast",
                .retryYourPicture: "retry_your_image",
                .retryIdealPicture: "retry_ideal_image",
                .retryButton: "retry_again_button",
            ])
            .build()

        let options = LivenessManagerOptions
            .builder(token: "TOKEN", environment: .hml)
            .setLoadingCustomization { loadingBuilder in
                loadingBuilder
                    .setBackgroundColor(.brown)
                    .setSpinnerColor(.red)
                    .setSpinnerWidth(10.7)
                    .setSpinnerScaleFactor(5)
            }
            .setFacetecCustomization(customization)
            .build()

        let manager = CertifaceSDKFactory.createLivenessManager(for: .saas)
        manager.start(at: self, options: options, callback: self)
    }

    func customizeLivenessTheme(in themeBuilder: FacetecThemeBuilder) -> FacetecThemeBuilder {
        // Ready
        themeBuilder
            .setReadyScreenHeaderColor(.green)
            .setReadyScreenHeaderFont(.systemFont(ofSize: 20, weight: .regular))
            .setReadyScreenMessageColor(.brown)
            .setReadyScreenMessageFont(.systemFont(ofSize: 20, weight: .semibold))
            .setReadyScreenTextBackgroundColor(.systemPink)
            .setReadyScreenTextBackgroundCornerRadius(10)

        // Result
        themeBuilder
            .setResultScreenMessageColor(.blue)
            .setResultScreenMessageFont(.systemFont(ofSize: 20, weight: .medium))
            .setResultScreenAnimationStyle(
                .blob(appearance: FacetecAnimationBlobAppearance(
                    blobColor: .blue,
                    checkmarkForegroundColor: .purple,
                    checkmarkBackgroundColor: .yellow
                ))
            )
            .setResultScreenAnimationScale(1.5)
            .setResultScreenUploadProgressBarEnabled(true)
            .setResultScreenUploadProgressBarFillColor(.red)
            .setResultScreenUploadProgressBarTrackColor(.green)

        // Retry
        themeBuilder
            .setRetryScreenHeaderColor(.systemPink)
            .setRetryScreenHeaderFont(.systemFont(ofSize: 20, weight: .heavy))
            .setRetryScreenCaptionColor(.red)
            .setRetryScreenCaptionFont(.systemFont(ofSize: 20, weight: .ultraLight))
            .setRetryScreenImageBorderColor(.systemBlue)
            .setRetryScreenImageBorderWidth(10)
            .setRetryScreenImageBorderCornerRadius(10)

        // Feedback
        themeBuilder
            .setFeedbackMessageColor(.systemPink)
            .setFeedbackMessageFont(.systemFont(ofSize: 20, weight: .black))
            .setFeedbackBarBackgroundColor(.yellow)
            .setFeedbackBarCornerRadius(10)
            .setFeedbackBarShadow(.init(
                color: .purple,
                opacity: 0.5,
                radius: 3,
                offset: CGSize(width: 2, height: 5),
                insets: UIEdgeInsets(top: 3, left: 1.5, bottom: 3.7, right: 7.5)
            ))

        // Guidance
        themeBuilder
            .setGuidanceHeaderFont(.systemFont(ofSize: 20, weight: .light))
            .setGuidanceSubtextFont(.systemFont(ofSize: 20, weight: .thin))
            .setGuidanceButtonFont(.systemFont(ofSize: 20, weight: .semibold))
            .setGuidanceButtonTextNormalColor(.white)
            .setGuidanceButtonTextHighlightColor(.red)
            .setGuidanceButtonTextDisabledColor(.black)
            .setGuidanceButtonBackgroundNormalColor(.purple)
            .setGuidanceButtonBackgroundHighlightColor(.gray)
            .setGuidanceButtonBackgroundDisabledColor(.blue)
            .setGuidanceButtonBorderColor(.white)
            .setGuidanceButtonBorderWidth(10)
            .setGuidanceButtonBorderCornerRadius(10)

        // Frame
        themeBuilder
            .setFrameBackgroundColor(.lightGray)
            .setFrameBorderColor(.cyan)
            .setFrameBorderWidth(14)
            .setFrameBorderCornerRadius(10)
            .setFrameShadow(.init(
                color: .red,
                opacity: 0.8,
                radius: 10,
                offset: CGSize(width: 10, height: 20),
                insets: UIEdgeInsets(top: 3, left: 1.5, bottom: 3.7, right: 7.5)
            ))

        // Oval
        themeBuilder
            .setOvalStrokeColor(.black)
            .setOvalStrokeWidth(10)
            .setOvalProgressFirstColor(.purple)
            .setOvalProgressSecondColor(.green)
            .setOvalProgressWidth(10)
            .setOvalProgressOffset(2)

        // Overlay
        themeBuilder
            .setOverlayBrandImage(UIImage(systemName: "house"))
            .setOverlayBackgroundColor(.green)

        // Cancel button
        themeBuilder
            .setCancelButtonIcon(UIImage(systemName: "pencil"))
            .setCancelButtonLocation(.topRight)

        return themeBuilder
    }
}

extension ContentViewController: LivenessCallback {
    func onSuccess(_ result: LivenessResult) {
        // Código ...
    }

    func onError(_ error: LivenessError) {
        // Código ...
    }
}

🧩 Provedor: Fortface

O Fortface oferece um fluxo de verificação facial com orientações em tempo real durante o enquadramento do rosto (distância, posição, inclinação e iluminação), com personalização visual e textual. Assim como a FaceTec, é executado pelo provedor .saas, que utiliza o Token como credencial.

O código de integração é idêntico ao da FaceTec: o SDK utiliza o Fortface quando o Token foi emitido para esse provedor. Por isso, é recomendado configurar as customizações dos dois provedores nas mesmas opções (setFacetecCustomization e setFortfaceCustomization): somente a do provedor da jornada será aplicada.

🚀 Execução da Jornada

import CertifaceSDK

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let options = LivenessManagerOptions
            .builder(token: "TOKEN", environment: .hml)
            .build()

        let manager = CertifaceSDKFactory.createLivenessManager(for: .saas)
        manager.start(at: self, options: options, callback: self)
    }
}

extension ContentViewController: LivenessCallback {
    func onSuccess(_ result: LivenessResult) {
        // Código ...
    }

    func onError(_ error: LivenessError) {
        // Código ...
    }
}

🎨 Personalização Visual

Personalize a interface usando FortfaceCustomization:

import CertifaceSDK

// MARK: - Views customizadas

final class CustomLoadingViewImpl: CustomLoadingView {
    // Código ...
}

final class CustomInstructionViewImpl: UIView, CustomInstructionView {
    var backButton: UIButton!
    var continueButton: UIButton!

    func changeLoadingVisibility(to visibility: Visibility) {
        // Código ...
    }
}

final class CustomCameraPermissionViewImpl: UIView, CustomCameraPermissionView {
    var backButton: UIButton!
    var checkPermissionButton: UIButton!
    var openSettingsButton: UIButton!
    var closeButton: UIButton!

    func showBottomSheet(visibility: Visibility) {
        // Código ...
    }
}

final class FortfaceCustomResultViewImpl: UIView, FortfaceCustomResultView {
    var retryButton: UIButton!

    func display(for resultType: FortfaceResultType) {
        // Código ...
    }
}

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let customization = FortfaceCustomization
            .builder()
            .setCustomInstructionView(CustomInstructionViewImpl())
            .setCustomCameraPermissionView(CustomCameraPermissionViewImpl())
            .setCustomResultView(FortfaceCustomResultViewImpl())
            .build()

        let options = LivenessManagerOptions
            .builder(token: "TOKEN", environment: .hml)
            .setCustomLoadingView(CustomLoadingViewImpl())
            .setShowInstructionsScreen(true)
            .setFortfaceCustomization(customization)
            .build()

        let manager = CertifaceSDKFactory
            .createLivenessManager(for: .saas)

        manager.start(at: self, options: options, callback: self)
    }
}

extension ContentViewController: LivenessCallback {
    func onSuccess(_ result: LivenessResult) {
        // Código ...
    }

    func onError(_ error: LivenessError) {
        // Código ...
    }
}

Aparência customizada

As telas de instruções e de permissão de câmera utilizam os mesmos builders dos demais provedores (veja os exemplos do iProov e da FaceTec). Para o Fortface, também é possível personalizar a tela de captura (setLivenessCustomization) e a tela de resultado (setResultCustomization):

import CertifaceSDK

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let customization = FortfaceCustomization.builder()
            .setInstructionCustomization { instructionBuilder in
                instructionBuilder
                    .setBackgroundColor(.purple)
                    .setTitle("Vamos começar")
                    .setTitleColor(.brown)
                    .setContinueButtonText("Iniciar")
                    .setContinueButtonBackgroundColor(.systemPink)
            }
            .setCameraPermissionCustomization { cameraPermissionBuilder in
                cameraPermissionBuilder
                    .setBackgroundColor(.systemPink)
                    .setTitle("Permissão de câmera")
                    .setTitleColor(.white)
            }
            .setLivenessCustomization { livenessBuilder in
                livenessBuilder
                    .setCancelButtonEnabled(true)
                    .setCancelButtonIcon(UIImage(systemName: "xmark") ?? UIImage())
                    .setCancelButtonIconColor(.systemRed)
                    .setCancelButtonPosition(.right)
                    .setScreenMode(.fullscreen)
                    .setScreenOrientation(.portrait)
                    .setCameraTimeout(30)
                    .setCameraMaxStabilizationTime(5)
                    .setCameraMinStabilizationTime(1)
                    .setCameraFrameVisible(true)
                    .setCameraBackgroundColor(.black)
                    .setCameraNeutralColor(.white)
                    .setCameraAlertColor(.systemRed)
                    .setCameraSuccessColor(.systemGreen)
                    .setCameraBrightnessColor(.yellow)
                    .setCameraBrightnessBackgroundColor(.darkGray)
                    .setCameraLoadingStrokeColor(.systemPink)
                    .setCameraLoadingBackgroundColor(.brown)
                    .setCameraIcon(UIImage(systemName: "camera") ?? UIImage())
                    .setCameraSmallIcon(UIImage(systemName: "camera.fill") ?? UIImage())
                    .setCameraMessageColor(.white)
                    .setCameraMessageFont("Helvetica")
                    .setCameraMessages([
                        .positioned: "Rosto posicionado",
                        .noFace: "Nenhum rosto detectado",
                        .faceNear: "Aproxime-se menos",
                        .faceFar: "Afaste-se mais",
                        .noFaceYaw: "Centralize o rosto",
                        .noFaceYawIpad: "Centralize o rosto no iPad",
                        .facePitchIsUp: "Abaixe o rosto",
                        .facePitchIsDown: "Levante o rosto",
                        .highBrightness: "Muita luz",
                        .lowBrightness: "Pouca luz",
                        .faceCenterLeft: "Mova para a esquerda",
                        .faceCenterRight: "Mova para a direita",
                        .faceCenterUp: "Mova para cima",
                        .faceCenterDown: "Mova para baixo",
                        .faceRollRight: "Incline para a direita",
                        .faceRollLeft: "Incline para a esquerda",
                        .noFaceRoll: "Corrija a inclinação"
                    ])
                    .setCameraAccessibilityLabels([
                        .positioned: "Rosto posicionado corretamente",
                        .faceCenterLeft: "Mova o rosto para a esquerda",
                        .faceCenterRight: "Mova o rosto para a direita",
                        .faceCenterUp: "Mova o rosto para cima",
                        .faceCenterDown: "Mova o rosto para baixo",
                        .faceRollRight: "Incline o rosto para a direita",
                        .faceRollLeft: "Incline o rosto para a esquerda",
                        .highBrightness: "Ambiente muito claro",
                        .lowBrightness: "Ambiente muito escuro"
                    ])
                    .setBrightnessMessageTimeout(3)
            }
            .setResultCustomization { resultBuilder in
                resultBuilder
                    .setSuccessBackgroundColor(.systemGreen)
                    .setSuccessImage(UIImage(systemName: "checkmark.circle"))
                    .setSuccessMessage("Sucesso")
                    .setSuccessMessageColor(.white)
                    .setMessageFont(.systemFont(ofSize: 30, weight: .thin))
                    .setErrorBackgroundColor(.systemRed)
                    .setErrorImage(UIImage(systemName: "xmark.circle"))
                    .setErrorMessage("Erro")
                    .setErrorMessageColor(.white)
                    .setRetryBackgroundColor(.systemOrange)
                    .setRetryImage(UIImage(systemName: "arrow.clockwise.circle"))
                    .setRetryMessage("Tente novamente")
                    .setRetryMessageColor(.white)
                    .setRetryButtonText("Repetir")
                    .setRetryButtonTextFont(.systemFont(ofSize: 20, weight: .semibold))
                    .setRetryButtonTextColor(.white)
                    .setRetryButtonBackgroundColor(.brown)
                    .setRetryButtonBorderColor(.white)
            }
            .build()

        let options = LivenessManagerOptions
            .builder(token: "TOKEN", environment: .hml)
            .setLoadingCustomization { loadingBuilder in
                loadingBuilder
                    .setBackgroundColor(.brown)
                    .setSpinnerColor(.red)
                    .setSpinnerWidth(10.7)
                    .setSpinnerScaleFactor(5)
            }
            .setFortfaceCustomization(customization)
            .build()

        let manager = CertifaceSDKFactory.createLivenessManager(for: .saas)
        manager.start(at: self, options: options, callback: self)
    }
}

extension ContentViewController: LivenessCallback {
    func onSuccess(_ result: LivenessResult) {
        // Código ...
    }

    func onError(_ error: LivenessError) {
        // Código ...
    }
}

Todos os métodos de setLivenessCustomization são opcionais: o que não for informado mantém o padrão do Fortface.

📦 Estrutura das Classes Importantes

Core SDK

  • CertifaceSDKFactory: Inicialização e gerenciamento.
  • LivenessManagerOptions: Configuração com a credencial (AppKey ou Token), o ambiente e as customizações do fluxo.
  • LivenessProvider: Enum de provedores (.iproov e .saas).
  • LivenessCredential: Enum da credencial utilizada na jornada (.appKey(String) ou .token(String)).
  • Environment: Enum de ambientes (.hml e .prd).
  • LivenessCallback: Interface de callbacks.
  • LivenessResult: Resultado do liveness.
  • LivenessError: Enum de erro capturado no liveness.
  • LivenessManager: Gerencia o fluxo de liveness.
  • LoadingCustomization / LoadingCustomizationBuilder: Personalização da tela de carregamento, comum a todos os provedores.
  • CustomLoadingView: Alias de UIView para a tela de carregamento customizada.

Facetec

  • FacetecCustomization: Personalização visual do fluxo.
  • FacetecCustomizationBuilder: Construtor da personalização visual do fluxo.
  • FacetecTheme / FacetecThemeBuilder: Tema da tela de liveness (padrão e pouca luz).
  • FacetecTextKey: Identificadores dos textos da tela de liveness.
  • FacetecShadow: Sombra aplicada à barra de feedback e ao frame.
  • FacetecAnimationResultStyle: Estilo da animação da tela de resultado (FacetecAnimationBlobAppearance, FacetecAnimationSpinnerAppearance, FacetecAnimationImageAppearance ou FacetecAnimationCustomDelegate).
  • FacetecVocalGuidanceMode: Modo de assistência de voz.

IProov

  • IProovCustomization: Personalização visual do fluxo.
  • IProovCustomizationBuilder: Construtor da personalização visual do fluxo.
  • IProovLivenessCustomizationBuilder / IProovResultCustomizationBuilder: Construtores da personalização das telas de liveness e de resultado.
  • IProovFilterStyle: Estilo do filtro da câmera.
  • IProovCustomResultView / IProovResultLayoutType: Protocolo da tela de resultado customizada e tipo de resultado exibido.

Fortface

  • FortfaceCustomization: Personalização visual do fluxo.
  • FortfaceCustomizationBuilder: Construtor da personalização visual do fluxo.
  • FortfaceLivenessCustomizationBuilder / FortfaceResultCustomizationBuilder: Construtores da personalização das telas de captura e de resultado.
  • FortfaceTextKey / FortfaceAccessibilityKey: Identificadores das mensagens de orientação e dos textos de acessibilidade.
  • FortfaceCancelButtonPosition, FortfaceScreenMode e FortfaceScreenOrientation: Opções da tela de captura.
  • FortfaceCustomResultView / FortfaceResultType: Protocolo da tela de resultado customizada e tipo de resultado exibido.

🔍 Principais Classes e Métodos de Chamada

Método / ClasseDescrição
CertifaceSDKFactory.createLivenessManager(for:)Cria um gerenciador do provedor escolhido (.iproov ou .saas).
LivenessManagerOptions.builder(appKey:environment:)Prepara as opções da jornada com AppKey (IProov).
LivenessManagerOptions.builder(token:environment:)Prepara as opções da jornada com Token (FaceTec e Fortface).
LivenessManagerOptions.Builder.setLoadingCustomization(_:)Prepara a aparência da tela de carregamento (todos os provedores).
LivenessManagerOptions.Builder.setCustomLoadingView(_:)Define a view customizada da tela de carregamento (todos os provedores).
LivenessManagerOptions.Builder.setShowInstructionsScreen(_:)Habilita ou desabilita a tela de instruções (padrão: habilitada).
LivenessManagerOptions.Builder.setIProovCustomization(_:)Define a customização do IProov.
LivenessManagerOptions.Builder.setFacetecCustomization(_:)Define a customização da FaceTec.
LivenessManagerOptions.Builder.setFortfaceCustomization(_:)Define a customização do Fortface.
[Provedor]Customization.builder()Prepara a aparência do fluxo.
LivenessManager.start(at:options:callback:)Inicia o fluxo de captura e validação.
LivenessCallback.onSuccess(_:)Retorno de Sucesso.
LivenessCallback.onError(_:)Retorno de Erro.

Erros (LivenessError)

CódigoCasoDescrição
0invalidAppKeyAppKey inválida.
1noCameraPermissionPermissão de acesso à câmera não concedida.
2noInternetConnectionSem conexão com a Internet.
3livenessNotCompletedProva de vida não completada.
4livenessNotInitializedLiveness não inicializado corretamente.
5transactionNotCompletedNão foi possível concluir a transação.
6invalidCustomizationOs botões backButton e continueButton não podem compartilhar a mesma instância.
7invalidProviderProvedor não disponível.
8invalidTokenToken inválido ou que não está mais pendente (fluxo SaaS). Novo
9genericExceptionErro inesperado.
⚠️

Atenção: com a inclusão de invalidToken (versão 3.0.2), o código (code) de genericException passou de 8 para 9. Caso o aplicativo compare ou persista os códigos numéricos, atualize essa referência ou, preferencialmente, compare os casos do enum.

📱 Fluxo de Telas

Nesta seção você encontra informações sobre a customização das telas envolvidas nos fluxos de liveness, separadas por provedor:

Telas CertiFace: Telas genéricas, reutilizadas por todos os provedores. Permitem alto nível de personalização (cores, textos, layout, etc).

Telas IProov: A maior parte das telas é controlada pelo SDK do IProov, mas é possível aplicar personalizações oferecidas pelo produto. A tela de resultado é fornecida pela CertiFace e pode ser customizada.

Telas Facetec: As telas fazem parte do SDK da FaceTec e só podem ser personalizadas dentro dos limites oferecidos pelo próprio produto.

Telas Fortface: A tela de captura faz parte do SDK do Fortface e só pode ser personalizada dentro dos limites oferecidos pelo produto. A tela de resultado é fornecida pela CertiFace e pode ser customizada.

Telas CertiFace

Tela de Processamento: Primeira tela da jornada, exibida para validação das credenciais e geração da sessão de reconhecimento facial (liveness).

NºMétodosDescriçãoExemplo
1setSpinnerColor(_:)Define a cor do spinner.UIColor.red
1setSpinnerWidth(_:)Define a largura da linha ou borda do spinner.CGFloat(0)
1setSpinnerScaleFactor(_:)Define o fator de escala do spinner, ou seja, seu tamanho relativo ao padrão.Int(0)
2setBackgroundColor(_:)Define a cor de fundo da tela.UIColor.red

Tela de Permissão de Câmera: Exibida quando o usuário ainda não concedeu permissão de acesso à câmera.


NºMétodosDescriçãoExemplo
1setBackButtonIcon(_:)Define o ícone do botão de voltar.UIImage(named: "image")
1setBackButtonIconColor(_:)Define a cor do ícone do botão de voltar.UIColor.red
1setBackButtonBackgroundColor(_:)Define a cor de fundo do botão de voltar.UIColor.red
1setBackButtonBorderColor(_:)Define a cor da borda do botão de voltar.UIColor.red
1setCloseButtonText(_:)Define o texto do botão “Fechar”."Text"
1setCloseButtonTextFont(_:)Define a fonte do botão “Fechar”.UIFont(name: "font", size: .zero)
1setCloseButtonBackgroundColor(_:)Define a cor de fundo do botão “Fechar”.UIColor.red
1setCloseButtonBorderColor(_:)Define a cor da borda do botão “Fechar”.UIColor.red
1setCloseButtonTextColor(_:)Define a cor do texto do botão “Fechar”.UIColor.red
2setCameraImage(_:)Define a imagem exibida para representar a câmera.UIImage(named: "image")
2setCameraImageColor(_:)Define a cor aplicada à imagem da câmera.UIColor.red
3setTitle(_:)Define o título principal da tela."Text"
3setTitleColor(_:)Define a cor do título principal.UIColor.red
3setTitleFont(_:)Define a fonte do título principal.UIFont(name: "font", size: .zero)
4setCaption(_:)Define o texto auxiliar abaixo do título."Text"
4setCaptionColor(_:)Define a cor do texto auxiliar.UIColor.red
4setCaptionFont(_:)Define a fonte do texto auxiliar.UIFont(name: "font", size: .zero)
5setCheckPermissionButtonText(_:)Define o texto do botão continuar."Text"
5setCheckPermissionButtonTextFont(_:)Define a fonte do botão continuar.UIFont(name: "font", size: .zero)
5setCheckPermissionButtonTextColor(_:)Define a cor do texto do botão continuar.UIColor.red
5setCheckPermissionButtonBackgroundColor(_:)Define a cor de fundo do botão continuar.UIColor.red
5setCheckPermissionButtonBorderColor(_:)Define a cor da borda do botão continuar.UIColor.red
6setBackgroundColor(_:)Define a cor de fundo da tela.UIColor.red
6setBottomSheetColor(_:)Define a cor do fundo do bottom sheet.UIColor.red
6setBottomSheetCornerRadius(_:)Define o raio de borda do bottom sheet.CGFloat(0)
6setBottomSheetTitle(_:)Define o título exibido no bottom sheet."Text"
6setBottomSheetTitleColor(_:)Define a cor do título do bottom sheet.UIColor.red
6setBottomSheetTitleFont(_:)Define a fonte do título do bottom sheet.UIFont(name: "font", size: .zero)
6setBottomSheetCaption(_:)Define o texto auxiliar do bottom sheet."Text"
6setBottomSheetCaptionColor(_:)Define a cor do texto auxiliar do bottom sheet.UIColor.red
6setBottomSheetCaptionFont(_:)Define a fonte do texto auxiliar do bottom sheet.UIFont(name: "font", size: .zero)
6setOpenSettingsButtonText(_:)Define o texto do botão “Abrir configurações”."Text"
6setOpenSettingsButtonTextFont(_:)Define a fonte do botão “Abrir configurações”.UIFont(name: "font", size: .zero)
6setOpenSettingsButtonTextColor(_:)Define a cor do texto do botão “Abrir configurações”.UIColor.red
6setOpenSettingsButtonBorderColor(_:)Define a cor da borda do botão “Abrir configurações”.UIColor.red
6setOpenSettingsButtonBackgroundColor(_:)Define a cor de fundo do botão “Abrir configurações”.UIColor.red

Tela Inicial/Instruções: Tela que apresenta as instruções iniciais ao usuário antes do início do processo de verificação facial. É exibida após a permissão de câmera e pode ser desabilitada com setShowInstructionsScreen(false).

NºMétodosDescriçãoExemplo
1setBackButtonIconColor(_:)Define a cor do ícone do botão de voltar.UIColor.red
1setBackButtonIcon(_:)Define o ícone do botão de voltar.UIImage(named: "image")
1setBackButtonBackgroundColor(_:)Define a cor de fundo do botão de voltar.UIColor.red
1setBackButtonBorderColor(_:)Define a cor da borda do botão de voltar.UIColor.red
2setBackgroundColor(_:)Define a cor de fundo da tela.UIColor.red
2setContextImage(_:)Define a imagem exibida no contexto da tela.UIImage(named: "image")
3setTitleFont(_:)Define a fonte do título.UIFont(name: "font", size: .zero)
3setTitle(_:)Define o título da tela."Text"
3setTitleColor(_:)Define a cor do título.UIColor.red
4setFirstInstructionIcon(_:)Define o ícone da primeira instrução.UIImage(named: "image")
5setSecondInstructionIcon(_:)Define o ícone da segunda instrução.UIImage(named: "image")
6setBottomSheetColor(_:)Define a cor do fundo do bottom sheet.UIColor.red
6setBottomSheetCornerRadius(_:)Define o raio de borda do bottom sheet.CGFloat(10)
7setCaption(_:)Define o texto da legenda (caption)."Text"
7setCaptionFont(_:)Define a fonte da legenda.UIFont(name: "font", size: .zero)
7setCaptionColor(_:)Define a cor da legenda.UIColor.red
8setFirstInstructionTitle(_:)Define o título da primeira instrução."Text"
8setFirstInstructionTitleFont(_:)Define a fonte do título da primeira instrução.UIFont(name: "font", size: .zero)
8setFirstInstructionTitleColor(_:)Define a cor do título da primeira instrução.UIColor.red
9setSecondInstructionTitle(_:)Define o título da segunda instrução."Text"
9setSecondInstructionTitleFont(_:)Define a fonte do título da segunda instrução.UIFont(name: "font", size: .zero)
9setSecondInstructionTitleColor(_:)Define a cor do título da segunda instrução.UIColor.red
10setContinueButtonText(_:)Define o texto do botão de continuar."Text"
10setContinueButtonFont(_:)Define a fonte do botão de continuar.UIFont(name: "font", size: .zero)
10setContinueButtonTextColor(_:)Define a cor do texto do botão de continuar.UIColor.red
10setContinueButtonBackgroundColor(_:)Define a cor de fundo do botão de continuar.UIColor.red
10setContinueButtonBorderColor(_:)Define a cor da borda do botão de continuar.UIColor.red

Telas iProov

Tela do IProov: Executa a verificação de liveness.

NºMétodosDescriçãoExemplo
1setCloseButtonImage(_:)Define a imagem do botão de fecharUIImage(named: "image")
1setCloseButtonImageColor(_:)Define a cor do botão de fecharUIColor.red
2setTitle(_:)Define o título da tela"Text"
2setTitleTextColor(_:)Define a cor do texto do títuloUIColor.red
2setTitleBackgroundColor(_:)Define a cor de fundo do títuloUIColor.red
2setFont(withName:)Define a fonte dos textos (pelo nome da fonte)"Helvetica"
3setPromptTextColor(_:)Define a cor do texto do promptUIColor.red
3setPromptBackgroundColor(_:)Define a cor de fundo do promptUIColor.red
3setPromptRoundedCornersEnabled(_:)Ativa ou desativa cantos arredondados do promptfalse
4setLAOvalStrokeCapturingColor(_:)Define a cor do oval durante captura (FaceID)UIColor.red
4setLAOvalStrokeCompletedColor(_:)Define a cor do oval quando captura completaUIColor.red
4setGPAOvalStrokeNotReadyColor(_:)Define a cor do oval quando não pronto (GPA)UIColor.red
4setGPAOvalStrokeReadyColor(_:)Define a cor do oval quando pronto (GPA)UIColor.red
5setFilterLineDrawingForegroundColor(_:)Define a cor do traço do filtro lineDrawingUIColor.red
5setFilterLineDrawingBackgroundColor(_:)Define a cor de fundo do filtro lineDrawingUIColor.red
5setTimeout(_:)Define o tempo limite da captura em segundosCGFloat(10)
6setLogoImage(_:)Define a imagem do logoUIImage(named: "image")
6setBackgroundColor(_:)Define a cor de fundo da telaUIColor.red
6setFilterStyle(_:)Define o estilo do filtro da câmeraIProovFilterStyle.lineDrawing(.vibrant)

Tela de Processamento: Exibida durante o processamento do liveness coletado. Utiliza a mesma customização da tela de processamento inicial (LivenessManagerOptions.Builder.setLoadingCustomization(_:)).

NºMétodosDescriçãoExemplo
1setSpinnerColor(_:)Define a cor do spinner.UIColor.red
1setSpinnerWidth(_:)Define a largura da linha ou borda do spinner.CGFloat(0)
1setSpinnerScaleFactor(_:)Define o fator de escala do spinner, ou seja, seu tamanho relativo ao padrão.Int(0)
2setBackgroundColor(_:)Define a cor de fundo da tela.UIColor.red

Tela de Resultado: Exibida ao final do processamento do liveness coletado. Quando é necessária uma nova tentativa (retry), as mensagens de orientação retornadas pelo backend são exibidas em sequência (carrossel), no intervalo definido por setRetryUserFeedbackInterval(_:) (padrão: 3 segundos). Em views customizadas, essas mensagens são recebidas em display(for:userFeedback:).

NºMétodosDescriçãoExemplo
1setSuccessImage(_:)Define a imagem exibida na tela de sucesso.UIImage(named: "image")
2setSuccessMessage(_:)Define a mensagem de sucesso exibida ao usuário."Text"
2setSuccessMessageColor(_:)Define a cor do texto da mensagem de sucesso.UIColor.red
2setMessageFont(_:)Define a fonte usada nas mensagens.UIFont(name: "font", size: .zero)
2setErrorMessage(_:)Define a mensagem de erro exibida ao usuário."Text"
2setErrorMessageColor(_:)Define a cor do texto da mensagem de erro.UIColor.red
3setRetryBackgroundColor(_:)Define a cor de fundo da área de retry.UIColor.red
3setRetryImage(_:)Define a imagem exibida na tela de retry.UIImage(named: "image")
3setRetryMessageColor(_:)Define a cor do texto da mensagem de retry.UIColor.red
3setRetryUserFeedbackInterval(_:)Define o intervalo, em segundos, entre as mensagens de orientação exibidas no retry.TimeInterval(3)
3setRetryButtonText(_:)Define o texto exibido no botão de retry."Text"
3setRetryButtonTextFont(_:)Define a fonte usada no texto do botão de retry.UIFont(name: "font", size: .zero)
3setRetryButtonTextColor(_:)Define a cor do texto do botão de retry.UIColor.red
3setRetryButtonBackgroundColor(_:)Define a cor de fundo do botão de retry.UIColor.red
3setRetryButtonBorderColor(_:)Define a cor da borda do botão de retry.UIColor.red
4setSuccessBackgroundColor(_:)Define a cor de fundo da tela de sucesso.UIColor.red
4setErrorBackgroundColor(_:)Define a cor de fundo da tela de erro.UIColor.red
4setErrorImage(_:)Define a imagem exibida na tela de erro.UIImage(named: "image")

Telas Facetec

Nesta seção, vamos explorar detalhadamente como personalizar textos e elementos visuais das telas da Facetec, de modo que reflitam a linguagem, a identidade e o tom desejados para o seu aplicativo. A seguir, você verá tabelas, exemplos e imagens ilustrativas que demonstram onde cada configuração aparece na interface ajudando a compreender tanto o impacto textual quanto visual de cada ajuste.

💡

Para consultar exemplos de customização visual da Facetec: Clique Aqui

Tela de Processamento: Feedback visual durante verificação.

NºMétodosDescriçãoExemplo
1setBackgroundColor(_:)Define a cor de fundo da tela de processamento.UIColor.red
1setSpinnerColor(_:)Define a cor do spinner (ícone de carregamento) que aparece na tela.UIColor.red
2setSpinnerWidth(_:)Define a largura do spinner.CGFloat(0)
2setSpinnerScaleFactor(_:)Define o tamanho relativo do spinner em relação ao padrão.Int(0)

Ready Screen

Textos

NºIdentificadorExemplos para uso de texto
1readyHeader1Prepare-se para seu
2readyHeader2reconhecimento facial.
3readyMessage1Posicione o seu rosto na moldura, aproxime-se
4readyMessage2e toque em começar.
5readyButtonComeçar

Métodos:

MétodosDescriçãoExemplo
setReadyScreenHeaderColor(_:)Define a cor do título (header) exibido na tela.UIColor.red
setReadyScreenHeaderFont(_:)Define a fonte tipográfica usada no título (header) da tela.UIFont(name: "font", size: .zero)
setReadyScreenMessageColor(_:)Define a cor do texto da mensagem principal apresentada na tela.UIColor.red
setReadyScreenMessageFont(_:)Define a fonte usada no texto da mensagem exibida na tela.UIFont(name: "font", size: .zero)
setReadyScreenTextBackgroundColor(_:)Define a cor de fundo da área de texto exibida na tela.UIColor.red
setReadyScreenTextBackgroundCornerRadius(_:)Define o raio de arredondamento dos cantos da área de fundo do texto na tela.Int(0)

Feedback

Textos

IdentificadorExemplos para uso de texto
feedbackCenterFaceCentralize Seu Rosto
feedbackFaceNotFoundEnquadre o Seu Rosto
feedbackFaceNotLookingStraightAheadOlhe Para Frente
feedbackFaceNotUprightMantenha a Cabeça Reta
feedbackHoldSteadySegure Firme
feedbackMovePhoneAwayAfaste-se
feedbackMovePhoneCloserAproxime-se
feedbackMovePhoneToEyeLevelTelefone ao Nível dos Olhos
feedbackUseEvenLightingIlumine Seu Rosto Uniformemente
feedbackFrameYourFaceEncaixe Seu Rosto no Espaço Oval
feedbackPositionFaceStraightInOvalOlhe Para Frente
feedbackHoldSteady1Aguente Firme: 1
feedbackHoldSteady2Aguente Firme: 2
feedbackHoldSteady3Aguente Firme: 3
feedbackRemoveDarkGlassesTire Seus Óculos de Sol
feedbackNeutralExpressionFique Neutro, Não Sorria
feedbackConditionsTooBrightAmbiente Muito Iluminado
feedbackBrightenYourEnvironmentAmbiente Muito Escuro

Métodos:

MétodosDescriçãoExemplo
setFeedbackMessageColor(_:)Define a cor do texto das mensagens de feedback exibidas na tela.UIColor.red
setFeedbackMessageFont(_:)Define a fonte tipográfica usada nas mensagens de feedback, permitindo ajustar tipo e tamanho da letra.UIFont(name: "font", size: .zero)
setFeedbackBarBackgroundColor(_:)Define a cor de fundo da barra de feedback.UIColor.red
setFeedbackBarCornerRadius(_:)Define o raio de arredondamento dos cantos da barra de feedback.Int(0)
setFeedbackBarShadow(_:)Define as propriedades da sombra da barra de feedback.FacetecShadow(color: .white, opacity: 0, radius: 0, offset: .zero, insets: .zero)

Result Screen

Textos

IdentificadorExemplos para uso de texto
resultUploadMessageEnviando...
resultSuccessMessageSucesso

Métodos:

MétodosDescriçãoExemplo
setResultScreenMessageColor(_:)Define a cor do texto da mensagem exibida na tela de resultado.UIColor.red
setResultScreenMessageFont(_:)Define a fonte e o tamanho do texto da mensagem de resultado.UIFont(name: "font", size: .zero)
setResultScreenAnimationStyle(_:)Define o estilo da animação que aparece na tela de resultado (ex: sucesso, erro, etc.).FacetecAnimationResultStyle.blob(appearance:)
setResultScreenAnimationScale(_:)Ajusta a escala/tamanho da animação mostrada na tela de resultado.CGFloat(10)
setResultScreenUploadProgressBarEnabled(_:)Ativa ou desativa a barra de progresso de upload.false
setResultScreenUploadProgressBarFillColor(_:)Define a cor de preenchimento da barra de progresso.UIColor.red
setResultScreenUploadProgressBarTrackColor(_:)Define a cor da trilha da barra de progresso.UIColor.red

Retry Screen

Textos

NºIdentificadorExemplos para uso de texto
1retryHeaderVamos tentar novamente?
2retrySubheaderSiga o exemplo de foto ideal abaixo:
3retryMessageSmileExpressão Neutra, Sem Sorrir.
3retryMessageLightningEvite reflexos e iluminação extrema.
3retryMessageContrastLimpe Sua Câmera.
4retryYourPictureSua foto.
5retryIdealPictureFoto ideal.
6retryButtonTentar novamente.

Métodos:

MétodosDescriçãoExemplo
setRetryScreenHeaderColor(_:)Define a cor do texto do cabeçalho da tela.UIColor.red
setRetryScreenHeaderFont(_:)Define a fonte e o tamanho do texto do cabeçalho da tela.UIFont(name: "font", size: .zero)
setRetryScreenCaptionColor(_:)Define a cor do texto da legenda (caption) exibida na tela.UIColor.red
setRetryScreenCaptionFont(_:)Define a fonte e o tamanho do texto da legenda (caption) na tela.UIFont(name: "font", size: .zero)
setRetryScreenImageBorderColor(_:)Define a cor da borda da imagem exibida na tela.UIColor.red
setRetryScreenImageBorderWidth(_:)Define a largura da borda da imagem exibida na tela.Int(0)
setRetryScreenImageBorderCornerRadius(_:)Define o raio de arredondamento dos cantos da imagem na tela.Int(0)

Elementos Comuns:

MétodosDescriçãoExemplo
setGuidanceHeaderFont(_:)Define a fonte e o tamanho do texto do cabeçalho da tela.UIFont(name: "font", size: .zero)
setGuidanceSubtextFont(_:)Define a fonte e o tamanho do texto secundário (subtexto) exibido abaixo do cabeçalho.UIFont(name: "font", size: .zero)
setGuidanceButtonFont(_:)Define a fonte e o tamanho do texto dos botões exibidos na tela.UIFont(name: "font", size: .zero)
setGuidanceButtonTextNormalColor(_:)Define a cor do texto do botão quando está em estado normal.UIColor.red
setGuidanceButtonTextHighlightColor(_:)Define a cor do texto do botão quando está pressionado ou destacado.UIColor.red
setGuidanceButtonTextDisabledColor(_:)Define a cor do texto do botão quando está desativado (disabled).UIColor.red
setGuidanceButtonBackgroundNormalColor(_:)Define a cor de fundo do botão no estado normal.UIColor.red
setGuidanceButtonBackgroundHighlightColor(_:)Define a cor de fundo do botão no estado pressionado/destaque.UIColor.red
setGuidanceButtonBackgroundDisabledColor(_:)Define a cor de fundo do botão no estado desativado (disabled).UIColor.red
setGuidanceButtonBorderColor(_:)Define a cor da borda dos botões exibidos na tela de orientação.UIColor.red
setGuidanceButtonBorderWidth(_:)Define a espessura da borda dos botões. Int(0)
setGuidanceButtonBorderCornerRadius(_:)Define o raio de arredondamento dos cantos dos botões. Int(0)
setFrameBackgroundColor(_:)Define a cor de fundo do quadro (frame) onde aparece a área de visualização do rosto.UIColor.red
setFrameBorderColor(_:)Define a cor da borda do quadro (frame) de detecção facial.UIColor.red
setFrameBorderWidth(_:)Define a largura da borda do frame. Int(0)
setFrameBorderCornerRadius(_:)Define o raio dos cantos arredondados do frame. Int(0)
setFrameShadow(_:)Define a sombra aplicada ao frame, incluindo cor, opacidade, raio e deslocamento.FacetecShadow(color: .white, opacity: 0, radius: 0, offset: .zero, insets: .zero)
setOvalStrokeColor(_:)Define a cor da linha oval usada como guia de enquadramento do rosto.UIColor.red
setOvalStrokeWidth(_:)Define a espessura da linha oval. Int(0)
setOvalProgressFirstColor(_:)Define a cor inicial da animação de progresso oval.UIColor.red
setOvalProgressSecondColor(_:)Define a cor final (ou secundária) da animação de progresso ovalUIColor.red
setOvalProgressWidth(_:)Define a largura da linha de progresso oval.Int(0)
setOvalProgressOffset(_:)Define o deslocamento (offset) do início do progresso oval.Int(0)
setOverlayBrandImage(_:)Define a imagem da marca (logo) exibida sobre a tela de orientaçãoUIImage(named: "image")
setOverlayBackgroundColor(_:)Define a cor de fundo da camada de sobreposição (overlay).UIColor.red
setCancelButtonIcon(_:)Define o ícone exibido no botão de cancelar.UIImage(named: "image")
setCancelButtonLocation(_:)Define a posição do botão de cancelar.FacetecTheme.CancelButtonLocation.topRight
setVocalGuidanceMode(_:)Define o modo de assistência de voz.FacetecVocalGuidanceMode.noVocalGuidance

Telas Fortface

Nesta seção, você encontra as personalizações disponíveis para as telas do Fortface. As telas de instruções e de permissão de câmera são as telas CertiFace (veja Telas CertiFace) e utilizam os mesmos métodos, configurados em setInstructionCustomization(_:) e setCameraPermissionCustomization(_:) de FortfaceCustomization. A tela de processamento é configurada em LivenessManagerOptions.Builder.setLoadingCustomization(_:).

Tela de Captura (Fortface): Executada pelo SDK do Fortface, exibe a câmera e as orientações em tempo real para o enquadramento do rosto. Os métodos abaixo são configurados em setLivenessCustomization(_:). Todos são opcionais: o que não for informado mantém o padrão do Fortface.

Botão de cancelar:

MétodosDescriçãoExemplo
setCancelButtonEnabled(_:)Habilita ou desabilita o botão de cancelar.true
setCancelButtonIcon(_:)Define o ícone do botão de cancelar.UIImage(named: "image")
setCancelButtonIconColor(_:)Define a cor do ícone do botão de cancelar.UIColor.red
setCancelButtonPosition(_:)Define a posição do botão de cancelar.FortfaceCancelButtonPosition.right

Tela e câmera:

MétodosDescriçãoExemplo
setScreenMode(_:)Define o modo de apresentação da tela (modal ou tela cheia).FortfaceScreenMode.fullscreen
setScreenOrientation(_:)Define a orientação da tela (retrato, paisagem ou automática).FortfaceScreenOrientation.portrait
setCameraTimeout(_:)Define o tempo limite da captura, em segundos.Double(30)
setCameraMaxStabilizationTime(_:)Define o tempo máximo de estabilização da câmera, em segundos.Double(5)
setCameraMinStabilizationTime(_:)Define o tempo mínimo de estabilização da câmera, em segundos.Double(1)
setCameraFrameVisible(_:)Exibe ou oculta o quadro de enquadramento do rosto.true
setCameraBackgroundColor(_:)Define a cor de fundo da câmera.UIColor.red
setCameraNeutralColor(_:)Define a cor do enquadramento no estado neutro.UIColor.red
setCameraAlertColor(_:)Define a cor do enquadramento quando há uma orientação a ser seguida.UIColor.red
setCameraSuccessColor(_:)Define a cor do enquadramento quando o rosto está posicionado.UIColor.red
setCameraBrightnessColor(_:)Define a cor do indicador de brilho.UIColor.red
setCameraBrightnessBackgroundColor(_:)Define a cor de fundo do indicador de brilho.UIColor.red
setCameraLoadingStrokeColor(_:)Define a cor do traço do indicador de carregamento.UIColor.red
setCameraLoadingBackgroundColor(_:)Define a cor de fundo do indicador de carregamento.UIColor.red
setCameraIcon(_:)Define o ícone exibido na câmera.UIImage(named: "image")
setCameraSmallIcon(_:)Define a versão reduzida do ícone exibido na câmera.UIImage(named: "image")
setBrightnessMessageTimeout(_:)Define o tempo de exibição das mensagens de brilho, em segundos.Double(3)

Mensagens de orientação:

MétodosDescriçãoExemplo
setCameraMessageColor(_:)Define a cor do texto das mensagens de orientação.UIColor.red
setCameraMessageFont(_:)Define a família da fonte das mensagens (pelo nome da fonte)."Helvetica"
setCameraMessages(_:)Define os textos das mensagens, por identificador.[FortfaceTextKey: String]
setCameraAccessibilityLabels(_:)Define os textos lidos pelo VoiceOver, por identificador.[FortfaceAccessibilityKey: String]

Textos (FortfaceTextKey):

IdentificadorSituação em que a mensagem é exibida
positionedRosto posicionado corretamente
noFaceNenhum rosto detectado
faceNearRosto muito próximo da câmera
faceFarRosto muito distante da câmera
noFaceYawRosto não está de frente para a câmera
noFaceYawIpadMesma situação de noFaceYaw, em dispositivos iPad
facePitchIsUpRosto inclinado para cima
facePitchIsDownRosto inclinado para baixo
highBrightnessAmbiente muito iluminado
lowBrightnessAmbiente muito escuro
faceCenterLeftOrientação de posicionamento do rosto (esquerda)
faceCenterRightOrientação de posicionamento do rosto (direita)
faceCenterUpOrientação de posicionamento do rosto (cima)
faceCenterDownOrientação de posicionamento do rosto (baixo)
faceRollRightOrientação de inclinação do rosto (direita)
faceRollLeftOrientação de inclinação do rosto (esquerda)
noFaceRollOrientação para corrigir a inclinação do rosto

Textos de acessibilidade (FortfaceAccessibilityKey): positioned, faceCenterLeft, faceCenterRight, faceCenterUp, faceCenterDown, faceRollRight, faceRollLeft, highBrightness e lowBrightness.

Tela de Resultado: Exibida ao final da captura, no mesmo padrão visual da tela de resultado do iProov (ícone, mensagem e, quando aplicável, botão de nova tentativa). Os métodos abaixo são configurados em setResultCustomization(_:).

  • Sucesso e erro: a tela é fechada automaticamente após 3 segundos.
  • Retry: a tela permanece visível até o usuário tocar no botão de nova tentativa, que reinicia a captura.
NºMétodosDescriçãoExemplo
1setSuccessImage(_:)Define a imagem exibida na tela de sucesso.UIImage(named: "image")
1setErrorImage(_:)Define a imagem exibida na tela de erro.UIImage(named: "image")
1setRetryImage(_:)Define a imagem exibida na tela de retry.UIImage(named: "image")
2setMessageFont(_:)Define a fonte usada nas mensagens.UIFont(name: "font", size: .zero)
2setSuccessMessage(_:)Define a mensagem de sucesso exibida ao usuário."Text"
2setSuccessMessageColor(_:)Define a cor do texto da mensagem de sucesso.UIColor.red
2setErrorMessage(_:)Define a mensagem de erro exibida ao usuário."Text"
2setErrorMessageColor(_:)Define a cor do texto da mensagem de erro.UIColor.red
2setRetryMessage(_:)Define a mensagem de retry exibida ao usuário."Text"
2setRetryMessageColor(_:)Define a cor do texto da mensagem de retry.UIColor.red
3setRetryButtonText(_:)Define o texto exibido no botão de retry."Text"
3setRetryButtonTextFont(_:)Define a fonte usada no texto do botão de retry.UIFont(name: "font", size: .zero)
3setRetryButtonTextColor(_:)Define a cor do texto do botão de retry.UIColor.red
3setRetryButtonBackgroundColor(_:)Define a cor de fundo do botão de retry.UIColor.red
3setRetryButtonBorderColor(_:)Define a cor da borda do botão de retry.UIColor.red
4setSuccessBackgroundColor(_:)Define a cor de fundo da tela de sucesso.UIColor.red
4setErrorBackgroundColor(_:)Define a cor de fundo da tela de erro.UIColor.red
4setRetryBackgroundColor(_:)Define a cor de fundo da tela de retry.UIColor.red

🧪 Ambiente de Testes

Durante o desenvolvimento, utilize o ambiente hml com AppKeys (IProov) ou Tokens (FaceTec e Fortface) fornecidos pela equipe CertiFace.

⚠️

Evite o uso do ambiente de produção para testes manuais.


🛠️ Boas Práticas

  • Use o padrão de fábrica para desacoplar a implementação dos provedores.
  • Customize visualmente a interface conforme a identidade do seu app.
  • Trate todos os retornos com UX amigável.
  • Guarde logs e tokens apenas em ambiente seguro.
  • Para FaceTec e Fortface, solicite o Token no seu backend imediatamente antes de iniciar a jornada: Tokens inválidos ou que já não estejam pendentes encerram a jornada com LivenessError.invalidToken.
  • Compare os erros pelos casos do enum LivenessError, e não pelo código numérico.
  • Informe NSCameraUsageDescription e NSLocationWhenInUseUsageDescription no Info.plist do aplicativo.

📜 Changelogs e Versões

VersãoDataDescrição
0.5.002/07/2025Lançamento inicial do SDK.
0.6.012/08/2025Retentativa do IProov e integração da FaceTec.
0.7.105/09/2025Adição do Device Intelligence.
1.1.019/11/2025Atualizações da FaceTec e iProov
1.2.018/12/2025Tela de instruções opcional.
1.3.009/03/2026Ajustes e melhorias.
1.4.024/03/2026Suporte ao iOS 26.
1.5.008/04/2026Ajuste nas especificações do Podspec (Beta).
1.6.005/05/2026Atualização da FaceTec para a versão 10.0.44 (Beta).
1.7.017/06/2026Atualização da FaceTec para a versão V9 (9.7.121).
1.8.027/07/2026Atualização da FaceTec para a versão 9.7.130.
2.0.004/08/2026Novo provedor saas (credencial por Token) com a integração do Fortface e remoção de LivenessProvider.facetec; ajustes nos contratos do IProov (mensagens de orientação no retry) e no comportamento de retry.
2.0.111/08/2026Atualização da tela de instruções e correção do comportamento da view customizada do IProov.
3.0.026/08/2026Atualização do Fortface (correção do comportamento da tela de retry).
3.0.224/09/2026Atualização da arquitetura e das URLs do Device Intelligence; novo erro LivenessError.invalidToken.
4.0.006/10/2026Target mínimo iOS 15.0; novo fluxo de telas; customização do carregamento centralizada em LivenessManagerOptions; exposição dos tipos públicos pelo CertifaceSDK; padronização dos nomes dos tipos públicos (ex.: Liveness3DTheme → FacetecTheme, Liveness3DShadow → FacetecShadow, FilterStyle → IProovFilterStyle).

🔗 Links externos