LivenessFacetecSDK para iOS e o fluxo completo de uma verificação de vivacidade.
API pública
A fachada do SDK fica emLivenessFacetecSDKClient.shared:
initializeé assíncrona, retornaLivenessFacetecSDKInitResultcom dados de fingerprint. VerifiqueisInitializedantes de chamar — para reinicializar (ex.: troca de ambiente ou logout), chamestop()antes de um novoinitialize().startLivenessCheckrequer umaUIViewControllere os três tokens de sessão criados pelo consumidor viaPOST /api/v1/sessions.stop()libera o estado interno do SDK. Não chamar enquanto uma captura estiver em progresso.isInitializedindica seinitializefoi concluído com sucesso.
Configuração
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
customization | LivenessFacetecSDKCustomization? | Não | Personalização da UI do FaceTec. Veja Customização |
Estados do AsyncStream
startLivenessCheck retorna um AsyncStream<LivenessFacetecSDKLivenessState> que emite um único caminho loading → success ou loading → error antes de completar:
Fluxo de uso
Inicializar o SDK
Chame
LivenessFacetecSDKClient.shared.initialize uma única vez no início do ciclo de vida do app (preferencialmente no AppDelegate). O método retorna LivenessFacetecSDKInitResult com os dados de fingerprint — armazene-os para usá-los ao criar a sessão:Criar sessão no backend
Antes de iniciar o liveness check, crie uma sessão com os dados de fingerprint do
LivenessFacetecSDKInitResultTratar o resultado
No caso de sucesso, use
sessionId e captureId para reconciliar a captura no backend. No caso de erro, mapeie cada caso de LivenessFacetecSDKError para uma mensagem ou ação adequada — veja Solução de problemas.Parar e reinicializar o SDK
stop() libera o estado interno do SDK e permite uma nova chamada a initialize(). Use quando precisar trocar de ambiente, realizar logout com limpeza de estado, ou isolar estado entre testes.
Campos de LivenessFacetecSDKResultData
Quando a verificação termina com sucesso, o SDK emite .success(LivenessFacetecSDKResultData):
| Campo | Tipo | Descrição |
|---|---|---|
sessionId | String | ID da sessão criada no backend da Plataforma ID |
captureId | String | ID único da captura submetida |
status | String | Status final da captura |
processedAt | String | Timestamp ISO-8601 do processamento |
result | String? | Resultado do Liveness |
scanResultBlob | String? | Blob bruto retornado pelo FaceTec |
transactionId | String? | ID da transação no provedor |
retryScreen | Int? | Indicador interno de retry |
replayCheck | Bool | Resultado da verificação anti-replay |
sessionTokenCheck | Bool | Validação do token de sessão |
auditTrailCheck | Bool | Validação da trilha de auditoria |
livenessCheck | Bool | Resultado da verificação de vivacidade |
Os quatro campos
*Check são as garantias de segurança consolidadas pelo backend. Em uma captura legítima, todos devem ser true.Erros possíveis
LivenessFacetecSDKInitError
Lançados por initialize(config:):
| Caso | Causa |
|---|---|
alreadyInitialized | initialize() foi chamado enquanto o SDK já estava inicializado. Verifique isInitialized antes de chamar, ou chame stop() para reinicializar. |
provisioningFailed(String) | Falha nas chaves internas — blob corrompido ou chaves ausentes no build. A mensagem associada contém diagnóstico. |
facetecInitializationFailed(String) | FaceTec SDK rejeitou as chaves internas. A mensagem associada contém diagnóstico do FaceTec. |
LivenessFacetecSDKError
Emitidos como .error(LivenessFacetecSDKError) pelo AsyncStream:
| Caso | Causa |
|---|---|
captureError(String) | Erro interno durante a captura FaceTec |
submitError(String) | Falha ao enviar os dados de captura para o backend |
networkError(String) | Erro de rede (timeout, sem conectividade) |
cancelled | Usuário fechou a tela de captura |
unknown(String) | Erro inesperado |
Exemplos de retorno
Sucesso — liveness aprovado
O fluxo terminou e a verificação biométrica passou.status vem "completed", result é "live" e todos os *Check são true.
Sucesso — liveness reprovado
O fluxo terminou tecnicamente, mas o resultado biométrico foi negativo.status vem "failed", result é "not_live" e livenessCheck é false.
Esse caso não é erro técnico — o SDK funcionou corretamente, mas a prova de vida foi reprovada. Trate como negativa de verificação no seu app (mostrar mensagem ao usuário e permitir nova tentativa), sem reportar como falha do SDK.
Erro do fluxo
Quando algo no fluxo técnico falha, o SDK emite.error(LivenessFacetecSDKError):
Exemplo completo (SwiftUI)
Próximos passos
Customização
Personalize cores, textos e animações da UI do FaceTec
Solução de problemas
Hierarquia de erros e dicas de diagnóstico