PassiveFaceLiveness
Câmera inteligente que captura uma selfie confiável do seu usuário utilizando inteligência artificial, capaz de detectar e reprovar foto de foto e gravações. Ideal para o seu onboarding.
Permissões necessárias
No arquivo info.plist
, adicione as permissões abaixo:
Permissão | Motivo | Obrigatória? |
---|---|---|
Privacy - Camera Usage Description | Para capturar a selfie do usuário | Sim |
Utilização
Primeiro, instancie um objeto do tipo PassiveFaceLiveness
:
let passiveFaceLiveness = PassiveFaceLiveness.Builder(mobileToken: "mobileToken")
// see the table below
.build()
PassiveFaceLiveness.Builder
Parâmetro | Obrigatório? |
---|---|
String mobileToken Token de utilização associado à sua conta da CAF | Sim |
.setPeopleId(peopleId: String?) Identificador do usuário para fins de identificação de perfil fraudador | Não, usado apenas para o analytics |
.setAnalyticsSettings(useAnalytics: Bool) Habilita/desabilita a coleta de dados para o analytics | Não, o padrão é true |
.setStabilitySensorSettings(message: String?, stabilityThreshold :Double?) Altera as configurações padrão do sensor de estabilidade. O limiar desse sensor é na variação das últimas duas acelerações coletadas do dispositivo. | Não. O padrão é "Mantenha o celular parado" e 1.5, respectivamente |
.setCaptureSettings( beforePictureInterval: TimeInterval?) Altera as configurações usadas para a captura da selfie. O parâmetro indica o tempo em milisegundos entre o encaixe correto do rosto e a efetiva captura da foto. | Não. O padrão é 2.0 |
setLayout(layout: PassiveFaceLivenessLayout) Troca as máscaras do documento de sucesso, falha e normal. Também permite alterar os botões de som e cancelar que ficam no topo da tela | Não. |
.setColorTheme(color: UIColor) Alterar a cor dos botões de som e cancelar que ficam no topo da tela. Também altera a cor do botão dos popups, inflados antes de cada documento. | Não. |
.enableSound(enableSound: Bool) Habilita/desabilita sons e o ícone de som no SDK | Não. O padrão é true |
.showStepLabel(show: Bool) Mostra/esconde o label inferior central (que contém o nome dos document) | Não. O padrão é true |
.showStatusLabel(show: Bool) Mostra/esconde o label central (que contém o status) | Não. O padrão é true |
.setNetworkSettings(requestTimeout: TimeInterval) Altera as configurações de rede padrão | Não. O padrão é 60 (segundos) |
.setProxySettings(proxySettings: ProxySettings?) Define as configurações de proxy, como explicado aqui | Não. O padrão é nil |
.showPreview(_ show: Bool, title: String?, subtitle: String?, confirmLabel: String?, retryLabel: String?) Habilita/desabilita a pré-visualização de captura. Caso show possua true , após cada captura, o SDK disponibiliza uma tela para o usuário aprovar ou realizar a captura novamente. Nos parâmetros restantes, informe nil para utilização do valor padrão ou uma String para um texto personalizado. | Não. O padrão é false |
.setCompressSettings(compressionQuality: CGFloat) Permite configurar a qualidade no processo de compressão. Por padrão, todas capturas passam por compressão. O método espera como parâmetro valores entre 0 e 1.0, sendo 1.0 a compressão com melhor qualidade (recomendado). | Não. O padrão é 1.0 |
.setMessageSettings(waitMessage: String?, stepName: String?, faceNotFoundMessage: String?, faceTooFarMessage: String?, faceNotFittedMessage: String?, holdItMessage: String?, invalidFaceMessage: String?, multipleFaceDetectedMessage: String?) Permite personalizar mensagens exibidas no balão de "status" durante o processo de captura e análise. | Não. O padrão é esse |
.setPersonCPF(personCPF: String) Vincula uma tentativa de prova de vida a um cpf | Não, o padrão é nil |
.setPersonName(personName: String) Vincula uma tentativa de prova de vida a um nome | Não, o padrão é nil |
.setGetImageUrlExpireTime(expireTime: Time) Permite personalizar o tempo de expiração da imageUrl . O método recebe como parâmetro o enum Time com os tempos disponíveis. | Não. O padrão é Time.DEFAULT |
.setManualCaptureSettings(enable: Bool, time: TimeInterval) Habilita/desabilita captura manual. O parâmetro time define o tempo para o modo de captura ser habilitado. | Não. O padrão é desabilitado |
.enableMultiLanguage(_ enable: Bool) Habilita/desabilita suporte à multi-idioma | Não. O padrão é habilitado |
.setVideoCaptureSettings(time: TimeInterval) Permite habilitar e configurar a captura por vídeo. | Não. O padrão é desativado |
.setGetImageUrlExpireTime(expireTime: String) Define o tempo de duração da URL da imagem no servidor até ser expirada. Espera receber um intervalo de tempo entre "30m" à "30d". Exemplos: setGetImageUrlExpireTime("30m") : Para configurar apenas minutossetGetImageUrlExpireTime("24h") : Para configurar apenas hora(s)setGetImageUrlExpireTime("1h 10m") : Para configurar hora(s) e minuto(s)setGetImageUrlExpireTime("10d") : Para configurar dia(s) | Não. O padrão é 3h |
.setImageCaptureSettings(beforePictureInterval: TimeInterval!, enableManualCapture: Bool, timeManualCapture: TimeInterval) Permite configurar a captura por imagem. O atributo beforePictureInterval define o tempo que o usuário deve ficar com a face encaixada na máscara. O atributo enableManualCapture habilita ou desabilita a captura manual. E timeManualCapture define o tempo em que a captura manual será ativada. | Não. O padrão é habilitado. Para beforePictureInterval o padrão é 2 (segundos). Para enableManualCapture o padrão é false e para timeManualCapture o padrão é 20 (segundos). |
.setMask(type: MaskType) Define o tipo de máscara utilizada nas capturas. Existem três tipos: .standard , com o padrão pontilhado no formato do documento;.empty , que remove totalmente a máscara. | Não. O padrão é .standard |
.setCurrentStepDoneDelay(currentStepDoneDelay: TimeInterval) Aplica delay na activity após a finalização de cada etapa. Esse método pode ser utilizado para exibir uma mensagem de sucesso na própria tela após a captura, por exemplo. | Não. O padrão é false |
.setResolutionSettings(resolution: Resolution) Permite configurar a resolução de captura. O método espera como parâmetro uma Resolution , que possui as seguintes opções: | Não. O padrão é hd1280x720 |
.setEyesClosedSettings(threshold: Double, isEnable: Bool) Permite customizar as configurações de validação de olhos abertos do SDK. O método espera como parâmetro isEnable para habilitar ou não a validação, e threshold , valor entre 0.0 e 1.0 | Não. O padrão é true e 0.5 |
Resolution() | Descrição |
---|---|
low | Especifica as configurações de captura adequadas para vídeo de saída e taxas de bits de áudio adequadas para compartilhamento em 3G |
medium | Especifica as configurações de captura adequadas para as taxas de bits de áudio e vídeo de saída adequadas para compartilhamento via WiFi |
high | Especifica as configurações de captura adequadas para saída de áudio e vídeo de alta qualidade |
photo | Especifica as configurações de captura adequadas para saída de qualidade de foto de alta resolução |
inputPriority | Especifica as configurações de captura adequadas para saída de qualidade de foto de alta resolução |
hd1280x720 | Especifica as configurações de captura adequadas para saída de vídeo com qualidade de 720p (1280 x 720 pixels) |
hd1920x1080 | Configurações de captura adequadas para saída de vídeo com qualidade 1080p (1920 x 1080 pixels) |
hd4K3840x2160 | Configurações de captura adequadas para saída de vídeo com qualidade 2160p (3840 x 2160 pixels) |
MessageSettings
Atributo | Valor padrão |
---|---|
waitMessage: String Mensagem exibida quando SDK está em processo de abertura | "Aguarde..." |
stepName: String Label estática presente na parte inferior na activity | "Registro facial" |
faceNotFoundMessage: String Mensagem exibida quando o algoritmo não reconhece um rosto | "Não encontramos nenhum rosto" |
faceNotFittedMessage: String Mensagem exibida quando o rosto não está encaixado corretamente na máscara | "Encaixe seu rosto" |
faceTooFarMessage: String Mensagem exibida quando há um rosto muito pequeno | "Aproxime o rosto" |
multipleFaceDetectedMessage: String Mensagem exibida quando é detectado mais de um rosto | "Mais de um rosto detectado" |
holdItMessage: String Mensagem exibida quando o usuário está na posição correta para captura | "Segure assim" |
invalidFaceMessage: String Mensagem exibida quando a verificação de prova de vida recusa a selfie | "Não conseguimos capturar seu rosto. Tente novamente." |
verifyingLivenessMessage: String Mensagem exibida durante a verificação de prova de vida. | "Verificando selfie…" |
captureProcessingErrorMessage: String Mensagem exibida quando ocorre um problema no processamento ou erro na response da API. | "Ops, tivemos um problema ao processar sua imagem. Tente novamente." |
eyesClosedMessage: String Mensagem exibida quando os dois olhos estão fechados. | " Não use óculos escuros e mantenha os olhos abertos." |
Após a crição do objeto do tipo PassiveFaceLiveness
, inicie o PassiveFaceLivenessController
passando esse objeto por parâmetro no construtor:
let passiveVC = PassiveFaceLivenessController(passiveFaceLiveness: passiveFaceLiveness)
passiveVC.passiveFaceLivenessDelegate = self
present(passiveVC, animated: true, completion: nil)
Obtendo o resultado
Para obter o resultado, você deve implementar o delegate PassiveFaceLivenessControllerDelegate
em seu controller:
class YouController: UIViewController, PassiveFaceLivenessControllerDelegate{
// MARK: - Passive Faceliveness Delegates
func passiveFaceLivenessController(_ passiveFacelivenessController: PassiveFaceLivenessController, didFinishWithResults results: PassiveFaceLivenessResult) {
//Called when the process was successfully executed
//The result variable contains the data obtained
}
func passiveFaceLivenessControllerDidCancel(_ passiveFacelivenessController: PassiveFaceLivenessController) {
//Called when the process was canceled by the user
}
func passiveFaceLivenessController(_ passiveFacelivenessController: PassiveFaceLivenessController, didFailWithError error: PassiveFaceLivenessFailure) {
//Called when the process terminate with an error
//The error variable contains info about error
}
}
PassiveFaceLivenessResult
Parâmetro | Pode ser nulo? |
---|---|
image: UIImage? Imagem do melhor frame retirado do vídeo | Sim, em caso de erro |
capturePath: String? Caminho do vídeo no dispositivo | Sim, em caso de erro |
imageUrl: String Url contendo a selfie em jpeg em nosso servidor temporário | Sim, em caso de erro |
signedResponse: String Resposta assinada do servidor da CAF que confirmou que a selfie capturada possui um rosto verdadeiro (não é foto de foto ou vídeo). Utilize esse parâmetro caso queira uma camada extra de segurança verificando se a assinatura da resposta não está quebrada, provocada por uma interceptação da requisição. Se estiver quebrada, há um grande indício de interceptação da requisição | Sim, em caso de erro ou servidor indisponível |
trackingId: String? Identificador dessa execução em nossos servidores. Se possível, salve este campo e mande-o junto para nossa API. Assim, teremos mais dados de como o usuário se comportou durante a execução | Sim, caso o usuário configure useAnalytics = false ou as chamadas de analytics não funcionem |
lensFacing: Int Define a face da câmera que foi utilizada. Utilize PassiveFaceLivenessResult.LENS_FACING_FRONT ou PassiveFaceLivenessResult.LENS_FACING_FRONT para validar. | Não |
PassiveFaceLivenessFailure
Superclasse que leva ao encerramento do SDK. Para saber qual foi o motivo, descubra qual a classe do objeto com o método isKindOfClass()
, equivalente ao instanceof
em Java e ao is
em Dart:
isKindOfClass() | Descrição | Exemplo |
---|---|---|
InvalidTokenReason | O token informado não é válido para o produto correspondente | Parametrizar "test123" como token no builder do SDK |
PermissionReason | Está faltando alguma permissão obrigatória para executar o SDK | Iniciar o DocumentDetector sem a permissão de câmera concedida |
NetworkReason | Falha de conexão com a internet | O usuário ficou sem internet durante o facematch no FaceAuthenticator |
ServerReason | Quando uma requisição do SDK recebe um status code de falha | Em teoria, não deve acontecer. Se acontecer, comunique-nos! |
StorageReason | Não há espaço no armazenamento interno do dispositivo do usuário | Quando não há espaço no armazenamento interno durante a captura da foto do documento |
Exemplos
Customizando o layout
Você pode customizar o layout criando um objeto do tipo PassiveFaceLivenessLayout
e passando por parâmetro no PassiveFaceLivenessBuilder
:
let layout = PassiveFaceLivenessLayout()
layout.changeMaskImages(
greenMask: UIImage(named: "my_green_mask"),
whiteMask: UIImage(named: "my_white_mask"),
redMask: UIImage(named: "my_red_mask"))
layout.changeSoundImages(soundOn: UIImage(named: "my_sound_on_image"),
soundOff: UIImage(named: "my_sound_off_image"))
layout.closeImage = UIImage(named: "my_close_image")
layout.setFont = UIImage(named: "my_font")
let passiveFacelivenessConfiguration = PassiveFaceLivenessBuilder(apiToken: "API_TOKEN")
.setLayout(layout: layout)
.build()