# iOS

**BCC Finger** é uma biblioteca destinada a ser integrada numa aplicação iOS a partir de um `.framework` arquivo. Utiliza a câmara do dispositivo para tirar uma fotografia das impressões digitais para fins biométricos.

Este Manual está atualizado para a versão 5.2.0 do BCC Finger Photo iOS.

## Requisitos

* Git
* Cocoapods, disponível em <https://cocoapods.org/>.

## Instalação

### Instalação de Dependências

1 - Adicione os seguintes Pods às dependências da aplicação no Podfile:

```ruby
pod 'lottie-ios'
```

{% hint style="info" %}
Se a aplicação não possuir um Podfile, ele pode ser criado na pasta raiz do seu projeto Xcode usando o comando `pod init` no terminal.
{% endhint %}

É preferível usar frameworks dinâmicos. Isso pode ser indicado usando a flag `use_frameworks!` no Podfile.

Um exemplo de Podfile com um target chamado BCCs-Sample é mostrado abaixo:

```ruby
target 'BCCs-Sample' do
	use_frameworks!

	pod 'lottie-ios'
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
```

{% hint style="warning" %}
É recomendado usar a versão mínima de iOS suportada pela sua aplicação como sendo a mesma deste framework: iOS 15.0, como no exemplo acima.
{% endhint %}

2 - Feche o seu projeto Xcode e abra no terminal a pasta onde está o seu Podfile; depois execute:

```bash
$ pod install
```

Após a execução terminar, um arquivo com a `.xcworkspace` extensão será criado na mesma pasta.

3 - Abra o novo `.xcworkspace` arquivo.

{% hint style="warning" %}
A partir de agora, sempre que o utilizador quiser abrir o projeto, é necessário abri-lo através deste `.xcworkspace` arquivo, pois ele inclui as dependências.
{% endhint %}

### Importação e Configuração

#### Importando o Projeto

* **Importando o Projeto**
* Abra o projeto usando o `.xcworkspace` arquivo.
* Adicione o `FingerPhoto.framework` arquivo ao projeto e depois adicione-o à lista de frameworks da sua aplicação.
  * Mova o `.framework` arquivo para a árvore de ficheiros do projeto.
    * Se já existir uma pasta frameworks, é recomendado mover o arquivo para lá
  * Abra as definições do projeto.
  * Vá para o separador **Geral** .
  * Clique e arraste o `.framework` para a árvore do projeto na secção **Frameworks, Libraries and Embedded Content** .
* Altere a definição de `BCCFinger.framework` de **Do not embed** para **Embed & Sign**.
* Defina a versão alvo do seu projeto para, no mínimo, **iOS 15**.

{% hint style="info" %}
Recomenda-se desativar o iPad como target.
{% endhint %}

#### Configuração Inicial

Esta versão não possui dependências do Firebase, nem de uma configuração inicial chamada pelo AppDelegate. A única configuração inicial necessária é que a aplicação solicite permissão de uso da câmara. Para isso, adicione a seguinte chave no `arquivo info.plist`, em Information Property List:

```none
Privacy - Camera Usage Description
```

O valor da chave é uma mensagem a ser exibida ao utilizador ao solicitar permissão de uso da câmara. Este valor pode estar em branco ou preenchido com a mensagem desejada.

## Utilização

### Parâmetros e Construtor

Um exemplo simples de uso da biblioteca é mostrado abaixo:

```swift
// Para inicializar uma nova captura
BCCFingerBuilder(self, delegate: self).initializeCapture()
```

A classe `BCCFingerBuilder` recebe os seguintes parâmetros:

* `hostVC: UIViewController` - Controlador de vista que chama o ecrã de captura.
* `delegate: BCCFingerDelegate` - Interface responsável por notificar eventos de captura (por exemplo, falha ou sucesso).

A classe `initialize` o método também aceita um parâmetro opcional, como mostrado abaixo:

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

Se quiser que a navegação seja feita através de um navigation controller, deve fornecê-lo ao chamar o método.

A classe `BCCFingerBuilder` a classe é responsável por tratar a configuração de utilização para `BCCFinger`. Os seguintes parâmetros são aceites para configurar a captura biométrica e o comportamento do software:

* `setSkipCaptureOption(_ enable: Bool)` - Ativa a opção de saltar a captura atual.
* `setDebugMode(_ enable: Bool)` - Ativa o modo de depuração.
* `buildCaptures(_ captures: BCCFingerCaptureType)` - Define o tipo de captura de impressões digitais. As opções são:

  ```swift
  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` - Apenas a mão esquerda, sem polegares.
  * `ONLY_RIGHT_HAND` - Apenas a mão direita, sem polegares.
  * `THUMBS` - Ambos os polegares.
  * `LEFT_THUMB` - Apenas o polegar esquerdo.
  * `RIGHT_THUMB` - Apenas o polegar direito.
  * `FULL_HANDS` - Ambas as mãos com polegares.
  * `FULL_LEFT_HAND` - Apenas a mão esquerda, com polegares.
  * `FULL_RIGHT_HAND` - Apenas a mão direita, com polegares.
* `buildBeginDelaySeconds(_ delay: Float)` - Define o atraso para iniciar o ajuste automático do limiar.
* `buildThreshold` - Define os parâmetros do limiar.
* `setShowInstructions(_ enable: Bool)` – Quando definido como `true`, ativa o ecrã de instruções (predefinição: `false`).

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

```swift
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
var showInstructions: Bool = true
var shouldIntercalateInstructions: Bool = true
```

### Valores de Retorno

Os resultados da última captura de impressões digitais podem ser obtidos através do `fingerCaptureDidFinish` método da `BCCFingerDelegate` interface:

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

A classe `returnData` o objeto contém os seguintes métodos para obtenção de dados:

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

  ```swift
  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:

  ```swift
  public var fingerprintPNG: UIImage
  public var wsqAsBase64: String
  ```

  * `fingerprintPNG` - Imagem PNG da impressão digital em tons de cinzento.
  * `wsqAsBase64` - Imagem WSQ da impressão digital codificada em base64.
* `getSkippedFingers()` - Retorna a lista de índices de todas as capturas de dedos ignoradas.

A classe `BCCFingerReturnData` a classe também contém atributos que armazenam as informações de captura agrupadas por mão:

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

Estes atributos podem ser nulos sempre que não forem solicitadas capturas para nenhuma das mãos.

A classe `HandData` a classe contém a seguinte informação:

```swift
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 com a imagem da impressão digital.
* `skippedFingers` - Lista de índices de todas as capturas de dedos ignoradas.
* `handsPhoto` - Fotografia original da mão da qual as impressões digitais foram extraídas.
* `thumbPhoto` - Fotografia original do polegar.

Se o utilizador abortar a captura, fechando antes de capturar as biometrias, o método `fingerCaptureDidAbort` será chamado. Pode implementar este método para tratar este cenário.

#### Obtenção de Imagens Originais

É possível obter as imagens originais através da `BCCFingerReturnData` classe, como mostrado abaixo:

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

### Projeto de Exemplo

Este é um projeto de exemplo funcional para uma captura de impressões digitais usando BCC Mobile Finger iOS:

```swift
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
	) {
		// ...
	}

}
```

## Instruções do Agente: Consultar Esta Documentação <a href="#agent-instructions-querying-this-documentation" id="agent-instructions-querying-this-documentation"></a>

Se precisar de informações adicionais que não estejam diretamente disponíveis nesta página, pode consultar a documentação dinamicamente fazendo uma pergunta.

Execute um pedido HTTP GET no URL da página atual com o parâmetro de consulta `ask` :

```
GET https://docs.griaule.com/sdks/bcc-finger/bccmobilefingerios.md?ask=<question>
```

A pergunta deve ser específica, autocontida e escrita em linguagem natural. A resposta conterá uma resposta direta à pergunta e excertos e fontes relevantes da documentação.

Use este mecanismo quando a resposta não estiver explicitamente presente na página atual, quando precisar de esclarecimentos ou contexto adicional, ou quando quiser obter secções relacionadas da documentação.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.griaule.com/sdks/bcc-finger/bccmobilefingerios.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
