Skip to main content
Este guia mostra a API pública do LivenessFacetecSDK para iOS e o fluxo completo de uma verificação de vivacidade.

API pública

A fachada do SDK fica em LivenessFacetecSDKClient.shared:
  • initialize é assíncrona e não retorna valor. Lança LivenessFacetecSDKInitError em caso de falha. Verifique isInitialized antes de chamar — para reinicializar (ex.: logout com limpeza de estado), chame stop() antes de um novo initialize().
  • getSessionData coleta o ssid de perimeter security, usado pelo seu backend na criação da sessão.
  • startLivenessCheck requer uma UIViewController e 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.
  • isInitialized indica se initialize foi 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 de initialize, 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ós initialize(), o consumidor deve:
  1. Chamar getSessionData() e obter o ssid.
  2. Encaminhar o ssid ao seu backend, que cria a sessão e devolve sessionId e sessionToken.
  3. 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.
O contrato da chamada de criação de sessão está documentado em Serviço.

Estados do AsyncStream

startLivenessCheck retorna um AsyncStream<LivenessFacetecSDKLivenessState> que emite um único caminho .loading → .success ou .loading → .error antes de encerrar:
O stream encerra após .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:
Chamar startLivenessCheck sem ter executado initialize(config:) com sucesso não causa crash: o stream emite imediatamente .error(.unknown("SDK not initialized. Call initialize() first.")) e encerra.
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.
O enum ClientStatus declara 13 casos, mas o iOS produz apenas 8 deles. Os outros 5 existem por compatibilidade com o vocabulário de status compartilhado com a Web e nunca são emitidos aqui — mas o compilador continua exigindo os 13 num switch exaustivo. Se preferir, use um default para os casos não emitidos. Veja a lista em Solução de problemas.

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.
Casos de uso típicos: logout com limpeza de dados sensíveis e testes instrumentados que precisam isolar estado entre casos.
Não chame stop() enquanto uma captura estiver em progresso — o comportamento é indefinido. Aguarde o stream de startLivenessCheck encerrar (.success ou .error) antes de chamar.
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

Se o seu código v9 lia livenessCheck, captureId, scanResultBlob ou tratava .cancelled, esses caminhos precisam ser reescritos — nenhum deles existe na v10.

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