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 e não retorna valor. LançaLivenessFacetecSDKInitErrorem caso de falha. VerifiqueisInitializedantes de chamar — para reinicializar (ex.: logout com limpeza de estado), chamestop()antes de um novoinitialize().getSessionDatacoleta ossidde perimeter security, usado pelo seu backend na criação da sessão.startLivenessCheckrequer umaUIViewControllere os dois tokens de sessão criados pelo consumidor.stop()libera o estado interno do SDK. Não chamar enquanto uma captura estiver em progresso.isInitializedindica seinitializefoi concluído com sucesso.
Threading:
LivenessFacetecSDKClient é isolado ao @MainActor. Tanto initialize(config:) quanto startLivenessCheck(...) devem ser chamados a partir do main actor — um Task { } criado dentro de um método @MainActor (como callbacks de UIViewController ou do AppDelegate) herda automaticamente o contexto correto.As chaves internas do SDK são compiladas no binário. Nenhuma chave precisa ser fornecida pelo app consumidor — não existe parâmetro de API key em
LivenessFacetecSDKConfig.Chame
initialize cedo. O preparo interno de chaves roda na main thread a cada launch e custa de dezenas a poucas centenas de milissegundos, dependendo do dispositivo. Iniciando o SDK no começo do ciclo de vida do app, esse custo não recai sobre a primeira tela interativa.Configuração
Dados de sessão
Depois deinitialize, chame getSessionData() para obter o ssid — o identificador de perimeter security que seu backend repassa na criação da sessão:
getSessionData() não lança — devolve um Result. A coleta é best-effort: qualquer falha interna devolve .success com ssid vazio, nunca .failure. O único caso de .failure é o SDK não ter sido inicializado, que chega como .unknown.Criação de sessão — responsabilidade do consumer app
O SDK não cria sessões nem se comunica diretamente com o backend de autenticação. Apósinitialize(), o consumidor deve:
- Chamar
getSessionData()e obter ossid. - Encaminhar o
ssidao seu backend, que cria a sessão e devolvesessionIdesessionToken. - Passar os dois tokens para
startLivenessCheck().
O SDK não tem acesso às credenciais do backend do consumidor nem conhece o contexto de negócio necessário para criar uma sessão válida. Manter a criação de sessão no consumer app garante flexibilidade (autenticação, multi-tenant) sem acoplar o SDK a uma topologia específica de backend.
Estados do AsyncStream
startLivenessCheck retorna um AsyncStream<LivenessFacetecSDKLivenessState> que emite um único caminho .loading → .success ou .loading → .error antes de encerrar:
.success ou .error — o loop for await termina naturalmente.
Retentativa dentro da captura: enquanto a UI do FaceTec está aberta, ela pode pedir ao usuário que tente de novo quantas vezes julgar necessário. Esse retry é interno ao FaceTec e não é exposto ao seu app — o
AsyncStream entrega apenas o desfecho final da captura.Retentativa depois do desfecho: após um .error, é seguro chamar startLivenessCheck novamente, com os mesmos tokens (se ainda válidos) ou com tokens de uma sessão nova. Não há estado interno que precise ser reiniciado — apenas initialize precisa ter sido executado com sucesso anteriormente.Fluxo de uso
1
Inicializar o SDK
Chame
LivenessFacetecSDKClient.shared.initialize uma única vez no início do ciclo de vida do app, preferencialmente no AppDelegate:2
Criar sessão no backend
Colete o
ssid e chame seu backend para obter os tokens necessários para a captura:3
Iniciar a verificação
Passe os tokens de sessão obtidos no passo anterior:
4
Tratar o resultado
No caso de sucesso, reconcilie a captura no backend usando o
sessionId que você já tem da criação de sessão. No caso de erro, mapeie cada caso de LivenessFacetecSDKError para uma mensagem ou ação adequada — veja Solução de problemas.Campos de LivenessFacetecSDKResultData
.success é emitido sem depender de nenhuma chamada de rede adicional — o resultado vem direto do fim da sessão FaceTec. Qualquer outro desfecho (cancelamento pelo usuário, lockout, erro de câmera etc.) chega como .error(.sessionNotCompleted(status:message:)).O
LivenessFacetecSDKResultData não traz o sessionId — use o valor que você já passou para startLivenessCheck para correlacionar a captura no seu backend.Exemplos de retorno
Sucesso — liveness aprovado
Falha — usuário cancelou a captura
Cancelamento pelo usuário não é erro técnico — o SDK funcionou corretamente. Trate como desistência no seu app (voltar à tela anterior ou oferecer nova tentativa), sem reportar como falha do SDK.
Parar e reinicializar o SDK
stop() libera todo o estado interno do SDK e zera as chaves sensíveis em memória. Após stop(), initialize() pode ser chamado novamente com comportamento idêntico ao primeiro uso.
Não use
stop()/initialize() para trocar de ambiente. O host de API é compilado no binário — um mesmo artefato nunca muda de ambiente em runtime.Exemplo completo (SwiftUI)
O que muda em relação à v9
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