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
  5. 📦 Estrutura das Classes Importantes
    5.1 Core SDK
    5.2 Facetec
    5.3 Iproov
  6. 🔍 Principais Classes e Métodos de Chamada
  7. 📱 Fluxo de Telas
    7.1 Telas Oiti
    7.2 Telas iProov
    7.3 Telas Facetec
  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.

⚠️

Atualmente temos suporte ao provedor IProov, mas em breve outros serão incorporados ao SDK.


✅ Requisitos de Compatibilidade

  • Target mínimo: iOS 13.0

  • Versão do Swift: 5+

  • Linguagem base: Swift (interoperável com Objective-C)

  • Gerenciador de dependência: CocoaPods

  • Ambientes suportados:

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

⚙️ Instalação

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'

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 Oiti.

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

pod install

🔌 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:

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

✅ Provedores Disponíveis

ProvedorIdentificador EnumSuporte
IProovLivenessProvider.iproov✅ Suporte Atual
Facetec CertifaceSDK.LivenessProvider.facetec🔜 Suporte Atual
[Novo Provedor]em breve🔜 Planejado

🧩 Provedor: IProov

Este é o provedor atualmente integrado ao SDK. Ele oferece uma jornada de verificação baseada em luz e detecção passiva.

🚀 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 IProovLivenessCustomization 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 LivenessCustomInstructionViewImpl: UIView, LivenessCustomInstructionView {
    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 IProovCustomLoadingViewImpl: IProovCustomLoadingView {
    // Código ...
}

final class IProovCustomResultViewImpl: IProovCustomResultView {
    func display(for resultType: IProovResultLayoutType) {
        // Código ...
    }
}

// MARK: - Implementação

final class ContentViewController: UIViewController {
    func executeLiveness() {
        let customization = IProovCustomization.builder()
            .setCustomInstructionView(LivenessCustomInstructionViewImpl())
            .setCustomCameraPermissionView(CustomCameraPermissionViewImpl())
            .setLoadingView(IProovCustomLoadingViewImpl())
            .setResultView(IProovCustomResultViewImpl())
            .build()

        let options = LivenessManagerOptions
            .builder(appKey: "APP_KEY", environment: .hml)
            .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())
                    .setBackButtonColor(forContent: .red, background: .green, border: .white)
                    .setContextImage(UIImage(systemName: "person") ?? UIImage())
                    .setBottomSheetColor(.cyan)
                    .setBottomSheetCornerRadius(10)
                    .setTitleText("Titulo aqui", color: .brown)
                    .setCaptionText("Subtitulo aqui", color: .systemPink)
                    .setFirstInstructionIcon(UIImage(systemName: "star") ?? UIImage())
                    .setFirstInstructionTitleText("Descrição do ambiente", color: .darkGray)
                    .setSecondInstructionIcon(UIImage(systemName: "house") ?? UIImage())
                    .setSecondInstructionTitleText(
                        "Descrição para uso de accessórios", 
                        color: .magenta
                    )
                    .setContinueButtonText("Iniciar")
                    .setContinueButtonColor(
                        forContent: .lightGray, 
                        background: .systemPink, 
                        border: .white
                    )
            }
            .setCameraPermissionCustomization { cameraPermissionBuilder in
                cameraPermissionBuilder
                    .setCameraPermissionBackgroundColor(.systemPink)
                    .setCameraPermissionBackButtonIcon(UIImage(systemName: "pencil") ?? UIImage())
                    .setCameraPermissionBackButtonColors(
                        forIcon: .white, 
                        background: .black, 
                        border: .blue
                    )
                    .setCameraPermissionImage(UIImage(systemName: "person.fill"), color: .cyan)
                    .setCameraPermissionTitle(
                        withText: "Permissão de câmera customizada", 
                        color: .white
                    )
                    .setCameraPermissionCaption(
                        withText: "Descrição da permissão de câmera", 
                        color: .purple
                    )
                    .setCameraPermissionCheckPermissionButton(withText: "Averiguar")
                    .setCameraPermissionCheckPermissionButtonNormalStateColors(
                        forText: .red, 
                        background: .blue, 
                        border: .white
                    )
                    .setCameraPermissionBottomSheetShape(withColor: .green, cornerRadius: 0)
                    .setCameraPermissionBottomSheetTitle(
                        withText: "Hora de ir para os ajustes", 
                        color: .blue
                    )
                    .setCameraPermissionBottomSheetCaption(
                        withText: "Ou será que não?", 
                        color: .orange
                    )
                    .setCameraPermissionOpenSettingsButton(withText: "Pular para ajustes")
                    .setCameraPermissionOpenSettingsButtonNormalStateColors(
                        forText: .orange, 
                        background: .darkGray, 
                        border: .blue
                    )
                    .setCameraPermissionCloseButton(withText: "Fechar tudo")
                    .setCameraPermissionCloseButtonNormalStateColors(
                        forText: .magenta, 
                        background: .cyan, 
                        border: .red
                    )
            }
            .setLivenessCustomization { livenessBuilder in
                livenessBuilder
                    .setBackgroundColor(.red)
                    .setPromptColors(forText: .green, backgroundColor: .white)
                    .setHeader(withText: "HEADER", textColor: .yellow, backgroundColor: .blue)
                    .setPromptRoundedCorners(enabled: false)
                    .setLAOvalStrokeColors(forCapturing: .cyan, completed: .systemPink)
                    .setGPAOvalStrokeColors(forNotReady: .yellow, completed: .blue)
                    .setFilter(withStyle: .vibrant, color: .purple, backgroundColor: .orange)
            }
            .setLoadingCustomization { loadingBuilder in
                loadingBuilder
                    .setLoadingBackgroundColor(.brown)
                    .setLoadingSpinner(withColor: .red, width: 10.7, scaleFactor: 5)
            }
            .setResultCustomization { resulBuilder in
                resulBuilder
                    .setResultBackgroundColor(.red, forResultType: .success)
                    .setResultImage(nil, forResultType: .success)
                    .setResultMessage("SUCCESS", forResultType: .success)
                    .setResultMessageColor(.blue, forResultType: .success)
                    .setResultBackgroundColor(.blue, forResultType: .error)
                    .setResultImage(nil, forResultType: .error)
                    .setResultMessage("ERROR", forResultType: .error)
                    .setResultMessageColor(.red, forResultType: .error)
            }
            .build()

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

        let manager = OitiSDKFactory.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.

🚀 Execução da Jornada

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: .facetec)
        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:

Nota: Propriedades fora dos blocos configuram globalmente a Facetec; dentro dos blocos são específicas de cada tela.

import CertifaceSDK

// MARK: - Implementação

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

        let options = LivenessManagerOptions
            .builder(appKey: "APP_KEY", environment: .hml)
            .setFacetecCustomization(customization)
            .build()

        let manager = CertifaceSDKFactory.createLivenessManager(for: .facetec)
        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())
                    .setBackButtonColor(forContent: .red, background: .green, border: .white)
                    .setContextImage(UIImage(systemName: "person") ?? UIImage())
                    .setBottomSheetColor(.cyan)
                    .setBottomSheetCornerRadius(10)
                    .setTitleText(
                        "Titulo aqui 2",
                        color: .brown
                    )
                    .setCaptionText(
                        "Subtitulo aqui",
                        color: .systemPink
                    )
                    .setFirstInstructionIcon(UIImage(systemName: "star") ?? UIImage())
                    .setFirstInstructionTitleText(
                        "Descrição do ambiente",
                        color: .darkGray
                    )
                    .setSecondInstructionIcon(UIImage(systemName: "house") ?? UIImage())
                    .setSecondInstructionTitleText(
                        "Descrição para uso de accessórios",
                        color: .magenta
                    )
                    .setContinueButtonText("Iniciar")
                    .setContinueButtonColor(forContent: .lightGray, background: .systemPink, border: .white)
            }
            .setCameraPermissionCustomization { cameraPermissionBuilder in
                cameraPermissionBuilder
                    .setCameraPermissionBackgroundColor(.systemPink)
                    .setCameraPermissionBackButtonIcon(UIImage(systemName: "pencil") ?? UIImage())
                    .setCameraPermissionBackButtonColors(forIcon: .white, background: .black, border: .blue)
                    .setCameraPermissionImage(UIImage(systemName: "person.fill"), color: .cyan)
                    .setCameraPermissionTitle(
                        withText: "Permissão de câmera customizada",
                        color: .white
                    )
                    .setCameraPermissionCaption(
                        withText: "Descrição da permissão de câmera",
                        color: .purple
                    )
                    .setCameraPermissionCheckPermissionButton(withText: "Averiguar")
                    .setCameraPermissionCheckPermissionButtonNormalStateColors(
                        forText: .red,
                        background: .blue,
                        border: .white
                    )
                    .setCameraPermissionBottomSheetShape(withColor: .green, cornerRadius: 0)
                    .setCameraPermissionBottomSheetTitle(
                        withText: "Hora de ir para os ajustes",
                        color: .blue
                    )
                    .setCameraPermissionBottomSheetCaption(
                        withText: "Ou será que não?",
                        color: .orange
                    )
                    .setCameraPermissionOpenSettingsButton(withText: "Pular para ajustes")
                    .setCameraPermissionOpenSettingsButtonNormalStateColors(
                        forText: .orange,
                        background: .darkGray,
                        border: .blue
                    )
                    .setCameraPermissionCloseButton(withText: "Fechar tudo")
                    .setCameraPermissionCloseButtonNormalStateColors(
                        forText: .magenta,
                        background: .cyan,
                        border: .red
                    )
            }
            .setLoadingCustomization { loadingBuilder in
                loadingBuilder
                    .setLoadingBackgroundColor(.brown)
                    .setLoadingSpinner(withColor: .red, width: 10.7, scaleFactor: 5)
            }
            .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(appKey: "APP_KEY", environment: .hml)
            .setFacetecCustomization(customization)
            .build()

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

    func customizeLivenessTheme(in themeBuilder: Liveness3DThemeBuilder) -> Liveness3DThemeBuilder {
        // Ready
        themeBuilder
            .setReadyScreenHeader(color: .green, font:  UIFont(name: "Jersey20-Regular", size: 20))
            .setReadyScreenMessage(color: .brown, font:  UIFont(name: "Jacquard24-Regular", size: 20))
            .setReadyScreenTextBackground(color: .systemPink, cornerRadius: 10)

        // Result
        themeBuilder
            .setResultScreenMessage(color: .blue, font: UIFont(name: "Jacquard24-Regular", size: 20))
            .setResultScreenAnimationStyle(
                .blob(appearance: BlobAnimationAppearance(
                    blobColor: .blue,
                    checkmarkForegroundColor: .purple,
                    checkmarkBackgroundColor: .yellow
                )),
                scale: 1.5
            )
            .setResultScreenUploadProgressBar(display: true, fillColor: .red, trackColor: .green)

        // Retry
        themeBuilder
            .setRetryScreenHeader(color: .systemPink, font: UIFont(name: "Jersey20-Regular", size: 20))
            .setRetryScreenCaption(color: .red, font: UIFont(name: "Jacquard24-Regular", size: 20))
            .setRetryScreenImageBorder(color: .systemBlue, width: 10, cornerRadius: 10)

        // Feedback
        themeBuilder
            .setFeedbackMessage(color: .systemPink, font: UIFont(name: "Jacquard24-Regular", size: 20))
            .setFeedbackBar(
                backgroundColor: .yellow,
                cornerRadius: 10,
                shadow: .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
            .setGuidanceFonts(
                header: UIFont(name: "Jacquard24-Regular", size: 20),
                subtext: UIFont(name: "Jacquard24-Regular", size: 20)
            )
            .setGuidanceButtonFont(UIFont(name: "Jersey20-Regular", size: 20))
            .setGuidanceButtonTextColors(normal: .white, highlight: .red, disabled: .black)
            .setGuidanceButtonBackgroundColors(normal: .purple, highlight: .gray, disabled: .blue)
            .setGuidanceButtonBorder(color: .white, width: 10, cornerRadius: 10)

        // Frame
        themeBuilder
            .setFrameBackgroundColor(.lightGray)
            .setFrameBorder(color: .cyan, width: 14, cornerRadius: 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
            .setOvalStroke(.black, width: 10)
            .setOvalProgress(color1: .purple, color2: .green, width: 10, offset: 2)

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

        // Cancel button
        themeBuilder
            .setCancelButton(icon: UIImage(systemName: "pencil"), location: .topRight)

        return themeBuilder
    }
}

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

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

📦 Estrutura das Classes Importantes

Core SDK

  • CertifaceSDKFactory: Inicialização e gerenciamento.
  • LivenessManagerOptions: Configuração com AppKey e ambiente.
  • LivenessProvider: Enum de provedores.
  • LivenessCallback: Interface de callbacks.
  • LivenessResult: Resultado do liveness.
  • LivenessError: Enum de erro capturado no liveness.
  • LivenessManager: Gerencia o fluxo de liveness.

Facetec

  • FacetecCustomization: Personalização visual do fluxo.
  • FacetecCustomizationBuilder: Construtor da personalização visual do fluxo.

IProov (Provedor Específico)

  • IProovCustomization: Personalização visual do fluxo.
  • IProovCustomizationBuilder: Construtor da personalização visual do fluxo.
🔧

As estruturas específicas só devem ser utilizadas se o provedor selecionado for o IProov.


🔍 Principais Classes e Métodos de Chamada

Método / ClasseDescrição
CertifaceSDKFactory.createLivenessManager(for:)Cria um gerenciador do provedor escolhido.
[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.

📱 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 Oiti: 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 Oiti 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 Oiti

Tela Inicial/Instruções: Tela que apresenta as instruções iniciais ao usuário antes do início do processo de verificação facial:

MétodosDescriçãoExemplo
1setBackButtonIcon(_:)Ícone exibido no botão voltarUIImage(named: "icon")
1setBackButtonColor(forContent:background:border:)Define a cor do botão voltarUIColor.red, UIColor.purple,UIColor.blue
2setBackgroundColor(_:)Define a cor de fundo de telaUIColor.red
2setContextImage(_:)Define a imagem de contexto na telaUIImage(named: "icon")
3setTitleText(_:color:font:)Define o título da tela de instruções"Title", UIColor.red, UIFont(name: "font", size: .zero)
4setFirstInstructionIcon(_:)Define o ícone da primeira instruçãoUIImage(named: "icon")
5setSecondInstructionIcon(_:)Define o ícone da segunda instruçãoUIImage(named: "icon")
6setBottomSheetColor(_:)Define a cor do fundo da barra inferiorUIImage(named: "icon")
6setBottomSheetCornerRadius(_:)Define o raio de canto da barra inferiorCGFloat(10)
7setCaptionText(_:color:font:)Define o texto de legenda ou instrução adicional"Caption", UIColor.red, UIFont(name: "font", size: .zero)
8setFirstInstructionTitleText(_:color:font:)Define o título da primeira instrução"Title", UIColor.red, UIFont(name: "font", size: .zero)
9setSecondInstructionTitleText(_:color:font:)Define o título da segunda instrução"Title", UIColor.red, UIFont(name: "font", size: .zero)
10setContinueButtonText(_:font:)Define o texto do botão de continuar"Title", UIFont(name: "font", size: .zero)
10setContinueButtonColor(forContent:background:border:)Define a cor do texto do botão de continuarUIColor.red, UIColor.purple, UIColor.blue

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

MétodosDescriçãoExemplo
1setCameraPermissionBackButtonIcon(_:)Define o ícone do botão de voltar.UIImage(named: "icon")
1setCameraPermissionBackButtonColors(forIcon:background:border:)Altera cores do botão de voltar (ícone, fundo, borda).UIColor.red, UIColor.purple, UIColor.blue
2setCameraPermissionImage(_:color:)Configura imagem ilustrativa e cor.UIImage(named: "image"), UIColor.red
3setCameraPermissionTitle(withText:color:font:)Define título, cor e fonte."Title", UIColor.red, UIFont(name: "font", size: .zero)
4setCameraPermissionCaption(withText:color:font:)Define legenda, cor e fonte."Caption", UIColor.red, UIFont(name: "font", size: .zero)
5setCameraPermissionCheckPermissionButton(withText:font:)Define texto e fonte do botão de checar permissão."Button", UIFont(name: "font", size: .zero)
5setCameraPermissionCheckPermissionButtonNormalStateColors(forText:background:border:)Define cores normais do botão (texto, fundo, borda).UIColor.red, UIColor.purple, UIColor.blue
6setCameraPermissionBottomSheetShape(withColor:cornerRadius:)Define cor e cantos do bottom sheet.UIColor.red, CGFloat(10)
6setCameraPermissionBottomSheetTitle(withText:color:font:)Define título do bottom sheet."Title", UIFont(name: "font", size: .zero)
6setCameraPermissionBottomSheetCaption(withText:color:font:)Define legenda do bottom sheet."Caption", UIFont(name: "font", size: .zero)
6setCameraPermissionOpenSettingsButton(withText:font:)Define botão de abrir configurações."Button", UIFont(name: "font", size: .zero)
6setCameraPermissionOpenSettingsButtonNormalStateColors(forText:background:border:)Personaliza cores normais do botão abrir configurações.UIColor.red, UIColor.purple, UIColor.blue
6setCameraPermissionBackgroundColor(_:)Define a cor de fundo da tela de permissão.UIColor.red
0setCameraPermissionCloseButton(withText:font:)Define botão de fechar.UIFont(name: "font", size: .zero)
0setCameraPermissionCloseButtonNormalStateColors(forText:background:border:)Personaliza cores normais do botão fechar.UIColor.red, UIColor.purple, UIColor.blue

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

MétodosDescriçãoExemplo
1setLoadingSpinner(withColor:width:scaleFactor:)Configura cor, largura e escala do spinner.UIColor.red, CGFloat(10), Int(2)
2setLoadingBackgroundColor(_:)Define a cor de fundo da tela de carregamento.UIColor.red

📱 Telas iProov

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

MétodosDescriçãoExemplo
1setBackButtonIconColor(_:)Define a cor aplicada ao ícone do botão de voltar.UIColor.red
1setBackButtonIcon(_:)Define o ícone usado no 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
2setContextImage(_:)Define a imagem exibida na área de contexto.UIImage(named: "image")
3setTitle(_:)Define o título principal exibido na tela."Text"
3setTitleFont(_:)Define a fonte usada no título principalUIFont(name: "font", size: .zero)
3setTitleColor(_:)Define a cor do texto do título principal.UIColor.red
3setCaption(_:)Define o subtítulo ou legenda exibida abaixo do título."Text"
3setCaptionFont(_:)Define a fonte usada no subtítulo/legenda.UIFont(name: "font", size: .zero)
3setCaptionColor(_:)Define a cor do texto do subtítulo/legenda.UIColor.red
4setFirstInstructionIcon(_:)Define o ícone exibido na primeira instrução.UIImage(named: "image")
4setFirstInstructionTitle(_:)Define o texto da primeira instrução exibida para o usuário."Text"
4setFirstInstructionTitleFont(_:))Define a fonte usada no texto da primeira instrução.UIFont(name: "font", size: .zero)
4setFirstInstructionTitleColor(_:)Define a cor do texto da primeira instrução.UIColor.red
4setSecondInstructionIcon(_:)Define o ícone exibido na segunda instrução.UIImage(named: "image")
4setSecondInstructionTitle(_:)Define o texto da segunda instrução exibida para o usuário."Text"
4setSecondInstructionTitleFont(_:)Define a fonte usada no texto da segunda instrução.UIFont(name: "font", size: .zero)
4setSecondInstructionTitleColor(_:)Define a cor do texto da segunda instrução.UIColor.red
5setBackgroundColor(_:)Define a cor de fundo da tela principal.UIColor.red
5setBottomSheetColor(_:)Define a cor de fundo do bottom sheetUIColor.red
5setBottomSheetCornerRadius(_:)Define o arredondamento dos cantos do bottom sheet.CGFloat(10)
6setContinueButtonText(_:)Define o texto exibido no botão de continuar."Text"
6setContinueButtonFont(_:)Define a fonte usada no texto do botão de continuar.UIFont(name: "font", size: .zero)
6setContinueButtonTextColor(_:)Define a cor do texto do botão de continuar.UIColor.red
6setContinueButtonBackgroundColor(_:)Define a cor de fundo do botão de continuar.UIColor.red
6setContinueButtonBorderColor(_:)Define a cor da borda do botão de continuar.UIColor.red

Tela de Processamento: Exibida durante o processamento do liveness coletado:

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:

MétodosDescriçãoExemplo
1setSuccessImage(UIImage(named: "doc.text.magnifyingglass"))Define a imagem exibida na tela de sucesso.UIColor
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(UIImage(named: "phone") ?? UIImage())Define a imagem exibida na tela de retry.UIColor
3setRetryMessageColor(_:)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
4setErrorImage(UIImage(named: "pencil"))Define a imagem exibida na tela de erro.UIColor.red

📱 Telas Facetec

Exemplo de Customização de Textos

Nesta seção, vamos explorar detalhadamente como personalizar os textos da Facetec para refletir a linguagem e o tom desejados pelo seu aplicativo. A seguir, você verá tabelas e imagens ilustrativas que mostram onde cada texto personalizado aparece na interface, ajudando a entender o impacto de cada configuração visualmente.

💡

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

Ready Screen

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

Feedback

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
feedbackEyesStraightAheadOlhe para a frente
feedbackConditionsTooBrightAmbiente Muito Iluminado
feedbackBrightenYourEnvironmentAmbiente Muito Escuro

Result Screen

IdentificadorExemplos para uso de texto
resultUploadMessageEnviando...
resultSuccessMessageSucesso

Retry Screen

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.
3retryMessageContrast:Limpe Sua Câmera.
4retryYourPictureSua foto.
5retryIdealPictureFoto ideal.
6retryButtonTentar novamente.

🧪 Ambiente de Testes

Durante o desenvolvimento, utilize o ambiente hml com AppKeys fornecidas pela equipe Oiti.

⚠️

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.

📜 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
⚠️

Sempre consulte a documentação atualizada para obter os detalhes mais recentes.

🔗 Links externos