1. Introdução

A BCC Finger é um biblioteca feita para ser integrada em uma aplicação iOS por um arquivo .framework. Ela usa a câmera do dispositivo para tirar fotos das digitais para propósitos biométricos.

Esse manual está atualizado para a versão 4.3.0 da BCC Finger Photo iOS.

1.1. Requisitos

2. Installation

2.1. Installing Dependencies

  1. Adicione o seguinte Pod nas dependências da aplicação no Podfile:
pod 'lottie-ios'

Note

Se a aplicação não possuir um Podfile, crie um na pasta raiz do seu projeto Xcode usando o comando pod init no terminal.

É preferível o uso de frameworks dinâmicos, Isso pode ser indicado usando a flag use_frameworks! no Podfile.

Um exemplo de Podfile com o alvo chamado BCCs-Sample é mostrado abaixo:

target 'BCCs-Sample' do
  use_frameworks!

  pod 'lottie-ios', '~> 3.3.0'
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
    end
  end
end

Important

É recomendado usar a versão mínima suportada do iOS para sua aplicação na qual é usada no framework: iOS 13.0, como no exemplo acima.

  1. Feche o projeto Xcode, abra o terminal, vá até a pasta onde o Podfile esta e execute:
$ pod install

Depois do término da execução, um arquivo com a extensão .xcworkspace será criado na mesma pasta.

  1. Abra o novo arquivo .xcworkspace.

Warning

A partir de agora, cada vez que o usuário quiser abrir o projeto, é necessário abrir através do arquivo .xcworkspace, pois ele inclui as dependências.

2.2. Importando e Configurando

2.2.1. Importando o Projeto

  • Abra o projeto usando o arquivo .xcworkspace.

  • Adicione o arquivo FingerPhoto.framework para o projeto, então adicione-o à lista de frameworks de sua aplicação.

    • Mova o arquivo .framework para a árvore de arquivos do projeto.

      Se já houver uma pasta de frameworks, é recomendado movê-lo para essa pasta.

    • Abra as configurações do projeto.

    • Vá para a guia General.

    • Clique e arraste o arquivo .framework para a árvore do projeto abaixo da sessão “Frameworks, Libraries, etc.”

  • Mude a configurção de BCCFinger.framework de “Do not embed” para “Embed & Sign”.

  • Mude a versão alvo do seu projeto para o mínimo de iOS 13.

Note

É recomendado desabilitar o iPad como um alvo.

2.2.2. Configuração Inicial

Esta versão não possui dependências do Firebase e nem de uma configuração inicial chamada pelo AppDelegate. A única configuração inicial necessária é que o aplicativo deve solicitar permissão de uso da câmera. Para fazer isso, adicione a seguinte chave no arquivo info.plist, na Lista de Propriedades de Informação:

Privacy - Camera Usage Description

O valor da chave é a mensagem que será exibida ao usuário quando solicitar permissão de uso da câmera. Esse valor pode estar em branco ou ser uma mensagem personalizada.

3. Uso

3.1. Parâmetros e Construtor

Um uso simples da biblioteca é mostrado abaixo:

// To initialize a new capture
BCCFingerBuilder(self, delegate: self).initializeCapture()

O construtor da classe BCCFingerBuilder recebe os seguintes parâmetros:

  • hostVC: UIViewController - View controller que chama a tela de captura.
  • delegate: BCCFingerDelegate - Interface responsável por notificar os eventos de captura, como falha ou sucesso.

O método initialize também aceita um parâmetro opcional, como monstrado abaixo:

public func initializeCapture(
    _ navController: UINavigationController? = nil
) { ... }

Nos casos de a navegação ser feita através de um navigation controller, você deve fornecê-lo ao chamar o método.

A classe BCCFingerBuilder é responsável por gerenciar as configurações de uso do BCCFinger. Os parâmetros a seguir são aceitos para confiuração da captura biométrica e comportamento do software.

  • setSkipCaptureOption(_ enable: Bool) - Habilita a opção de pular a captura atual.

  • setDebugMode(_ enable: Bool) - Habilita o modo de debug.

  • buildCaptures(_ captures: BCCFingerCaptureType) - Define o tipo de captura de impressão digital. As opções são:

    public enum BCCFingerCaptureType {
        case BOTH_HANDS
        case ONLY_LEFT_HAND
        case ONLY_RIGHT_HAND
        case THUMBS
        case LEFT_THUMB
        case RIGHT_THUMB
        case FULL_HANDS
        case FULL_LEFT_HAND
        case FULL_RIGHT_HAND
    }
    
    • BOTH_HANDS - Ambas as mãos sem polegares.
    • ONLY_LEFT_HAND - Somente a mão esquerda, sem polegar.
    • ONLY_RIGHT_HAND - Somente a mão direita, sem polegar.
    • THUMBS - Ambos os polegares.
    • LEFT_THUMB - Somente polegar esquerdo.
    • RIGHT_THUMB - Somente polegar direito.
    • FULL_HANDS - Ambas as mãos com polegares.
    • FULL_LEFT_HAND - Somente a mão esquerda, com polegar.
    • FULL_RIGHT_HAND - Somente a mão direita, com polegar.
  • buildBeginDelaySeconds(_ delay: Float) - Define o delay para inciiar o ajuste automático do limiar.

  • buildThreshold - Define os parâmetros de limiar.

Para referência, a lista completa de parâmetros e valores padrão é:

var skipsHandOption: Bool = false
var debugMode: Bool = false
var capture: BCCFingerCaptureType = .FULL_HANDS
var beginDelaySeconds: Float = 1
var minQuality: Int = 20
var maxQuality: Int = 80
var totalTime: Double = 30
var stepCount: Int = 30

3.2. Valores de Retorno

Os resultados da última captura de impressão digital podem ser recuperados através do método fingerCaptureDidFinish da interface BCCFingerDelegate:

func fingerCaptureDidFinish(
    _ returnData: BCCFingerReturnData,
    analytics: BCCFingerAnalytics
)

O objeto returnData contém os seguintes métodos para recuperação dos dados:

  • getCapturedFingersIndexes() - Retorna uma lista com o índice de todas as impressões digitais capturadas:

    public enum FingerIndex: Int {
        case leftLittle = 0
        case leftRing = 1
        case leftMiddle = 2
        case leftIndex = 3
        case leftThumb = 4
        case rightThumb = 5
        case rightIndex = 6
        case rightMiddle = 7
        case rightRing = 8
        case rightLittle = 9
    }
    
  • getCapturedFingers() - Retorna um mapa que relaciona os índices dos dedos com as biometrias capturadas.

  • getCapturedFingersData() - Retorna a lista de todas as impressões digitais capturadas:

    public var fingerprintPNG: UIImage
    public var wsqAsBase64: String
    
    • fingerprintImage - Imagem PNG da impressão digital em escala de cinza.
    • wsqAsBase64 - Imagem da impressão digital em WSQ codificada em base64.
  • getSkippedFingers() - Retorna a lista de índices das capturas puladas.

A classe BCCFingerReturnData também contém atributos que armazenam a informação capturada agrupada por mão:

public class BCCFingerReturnData {
    public let leftHand: HandData?
    public let rightHand: HandData?
}

Estes atributos podem ser nulos nos casos em não seja requerida captura para qualquer uma das mãos.

A classe HandData contém as seguintes informações:

public internal(set) var capturedFingers: [FingerIndex : FingerData] = [:]
public internal(set) var skippedFingers: [FingerIndex] = []
public internal(set) var handsPhoto: UIImage? = nil
public internal(set) var thumbsPhoto: UIImage? = nil
  • capturedFingers - Mapa que relaciona o índice do dedo à imagem da impressão digital.
  • skippedFingers - Lista de índices das capturas puladas.
  • handsPhoto - Foto original da mão que gerou as impressões digitais.
  • thumbPhoto - Foto original do polegar.

Caso o usuário encerre a aplicação antes de finalizar a captura bionmétrica, o método fingerCaptureDidAbort será chamado. Você pode implementar este método para tratar este cenário.

3.2.1. Recuperando as imagens originais

É possível recuperar as imgens originais através da classe BCCFingerReturnData, conforme mostrado abaixo:

let leftSlapPhoto = returnData.leftHand?.handsPhoto
let rightSlapPhoto = returnData.rightHand?.handsPhoto
let leftThumbPhoto = returnData.leftHand?.thumbsPhoto
let rightThumbPhoto = returnData.rightHand?.handsPhoto

3.3. Projeto Exemplo

Este é um exemplo de projeto funcional para captura de impressões digitais utilizando o BCC Finger iOS:

import UIKit
import FingerPhoto
import BCCFinger

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func startCaptureAction(_ sender: UIButton) {
        BCCFingerBuilder(self, delegate: self)
            .initializeCapture()
    }
}

extension ViewController: BCCFingerDelegate {

    func fingerCaptureDidFinish(
        _ returnData: BCCFinger.BCCFingerReturnData,
        analytics: BCCFinger.BCCFingerAnalytics
    ) {
        // ...
    }

    func didAbortFingerCapture(
        analytics: BCCFinger.BCCFingerAnalytics
    ) {
        // ...
    }

}