biovida_face_liveness 0.1.1
biovida_face_liveness: ^0.1.1 copied to clipboard
AWS Rekognition Face Liveness for Flutter apps built with FlutterFlow. Self-contained Android Activity, Cognito guest credentials resolved at runtime from an Identity Pool id — no amplifyconfiguration [...]
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:
amplifyconfiguration.jsondentro deandroid/app/src/main/res/raw/;MainActivityestendendoFlutterFragmentActivity.
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 — oMainActivitygerado 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) #
minSdkVersion24 ecompileSdkVersion35 — no FlutterFlow, ajuste via Custom Code → Configuration Files → build.gradle.- Permissão de câmera (o plugin declara
CAMERAno 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
getUserMediaem WKWebView) eNSCameraUsageDescriptionno 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
iosWebFallbackUrlapontando 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,startrespondeNAO_SUPORTADO— o build nunca quebra. - Builds com SPM do Flutter habilitado
(
flutter config --enable-swift-package-manager): a implementação nativa emios/biovida_face_liveness/Package.swifté resolvida automaticamente (sem passo manual no Xcode) eiosWebFallbackUrlé ignorada.
Contrato da página de fallback web #
-
O plugin abre
iosWebFallbackUrlanexando?sessionId=...®ion=...(osessionIdé oprovider_session_idda AWS). -
A página monta o
FaceLivenessDetectordo@aws-amplify/ui-react-livenesscom esses parâmetros (o Identity Pool fica na configuração Amplify do bundle da própria página). -
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.