biovida_face_liveness

AWS Rekognition Face Liveness para apps Flutter criados no FlutterFlow.

Os plugins Flutter existentes para Face Liveness exigem duas modificações nativas que o build em nuvem do FlutterFlow não permite:

  1. amplifyconfiguration.json dentro de android/app/src/main/res/raw/;
  2. MainActivity estendendo FlutterFragmentActivity.

Este pacote elimina as duas exigências:

  • o componente oficial Amplify UI Face Liveness roda numa Activity própria do plugin (ComponentActivity), declarada no manifest do plugin e mesclada automaticamente no app — o MainActivity gerado pelo FlutterFlow fica intocado;
  • as credenciais AWS temporárias são obtidas em runtime como identidade de convidado do Cognito Identity Pool informado na chamada (GetId + GetCredentialsForIdentity via REST, chamadas não assinadas) — nenhum arquivo de configuração nativo é necessário.

Uso

import 'package:biovida_face_liveness/biovida_face_liveness.dart';

final resultado = await BiovidaFaceLiveness.start(
  sessionId: providerSessionId, // CreateFaceLivenessSession (via seu backend)
  region: 'sa-east-1',
  identityPoolId: 'sa-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
);

if (resultado == 'OK') {
  // Desafio concluído — consulte o veredito no seu backend.
}

Códigos de retorno

Código Significado
OK Desafio concluído (onComplete); o veredito vem do seu backend
CANCELADO Usuário desistiu (voltar/cancelar)
PERMISSAO_CAMERA_NEGADA Permissão de câmera recusada
SESSAO_NAO_ENCONTRADA sessionId inválido ou expirado na AWS
SESSAO_EXPIRADA Desafio não concluído dentro do prazo
ACESSO_NEGADO Credenciais sem acesso à sessão
ERRO_CREDENCIAIS Falha ao obter credenciais do Cognito
ERRO_CONEXAO Falha de rede durante o streaming
EM_ANDAMENTO Já existe um desafio em execução
ERRO Falha genérica
NAO_SUPORTADO Plataforma sem implementação nesta versão

Requisitos (Android)

  • minSdkVersion 24 e compileSdkVersion 35 — no FlutterFlow, ajuste via Custom Code → Configuration Files → build.gradle.
  • Permissão de câmera (o plugin declara CAMERA no próprio manifest; a Activity pede a permissão em runtime se necessário).
  • Orientação retrato (o componente da AWS recusa paisagem; a Activity do plugin já é travada em retrato).

O Identity Pool precisa permitir identidades não autenticadas (guest) e a role associada precisa da permissão rekognition:StartFaceLivenessSession.

Requisitos (iOS)

  • iOS 14.0+ (fallback web: 14.3+, primeiro iOS com getUserMedia em WKWebView) e NSCameraUsageDescription no Info.plist (no FlutterFlow, a mensagem de permissão de câmera das Permissions do projeto).
  • Builds CocoaPods (caso do FlutterFlow): o Amplify Swift v2 e o componente de liveness nativo são distribuídos somente via Swift Package Manager e não podem ser resolvidos por CocoaPods. Nesse modo o desafio roda como fallback web: passe iosWebFallbackUrl apontando para uma página com o componente React oficial FaceLivenessDetector (hospedada pelo seu backend) e o plugin a abre num WKWebView full-screen com botão de fechar. Sem a URL, start responde NAO_SUPORTADO — o build nunca quebra.
  • Builds com SPM do Flutter habilitado (flutter config --enable-swift-package-manager): a implementação nativa em ios/biovida_face_liveness/Package.swift é resolvida automaticamente (sem passo manual no Xcode) e iosWebFallbackUrl é ignorada.

Contrato da página de fallback web

  1. O plugin abre iosWebFallbackUrl anexando ?sessionId=...&region=... (o sessionId é o provider_session_id da AWS).

  2. A página monta o FaceLivenessDetector do @aws-amplify/ui-react-liveness com esses parâmetros (o Identity Pool fica na configuração Amplify do bundle da própria página).

  3. Ao terminar, a página reporta o resultado ao app:

    window.webkit.messageHandlers.biovidaFaceLiveness.postMessage('OK');
    // ou um código de erro: 'CANCELADO', 'SESSAO_EXPIRADA',
    // 'SESSAO_NAO_ENCONTRADA', 'PERMISSAO_CAMERA_NEGADA', 'ACESSO_NEGADO',
    // 'ERRO_CONEXAO', 'ERRO'
    

    (onAnalysisComplete → 'OK'; onError/cancelamento → código correspondente. Códigos fora da lista são normalizados para 'ERRO'.)

Plataformas

Plataforma Suporte
Android ✅ nativo (Amplify UI Liveness)
iOS (CocoaPods/FlutterFlow) ✅ fallback web via iosWebFallbackUrl (NAO_SUPORTADO sem a URL)
iOS (Flutter SPM) ✅ nativo (amplify-ui-swift-liveness)
Web ❌ (NAO_SUPORTADO)

Créditos

Interface e mapeamento de erros inspirados no plugin comunitário face_liveness_detector; implementação reescrita para funcionar em builds FlutterFlow.