# iOS

**BCC Finger** es una biblioteca diseñada para integrarse en una aplicación iOS desde un `.framework` archivo. Utiliza la cámara del dispositivo para tomar una foto de las huellas dactilares con fines biométricos.

Este manual está actualizado para BCC Finger Photo iOS versión 5.2.0.

## Requisitos

* Git
* Cocoapods, disponible en <https://cocoapods.org/>.

## Instalación

### Instalación de dependencias

1 - Agregue los siguientes Pods a las dependencias de la aplicación en Podfile:

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

{% hint style="info" %}
Si la aplicación no tiene un Podfile, puede crearse en la carpeta raíz de su proyecto Xcode usando el comando `pod init` en la terminal.
{% endhint %}

Es preferible usar frameworks dinámicos. Puede indicarse usando el flag `use_frameworks!` en Podfile.

A continuación se muestra un ejemplo de Podfile con un target llamado BCCs-Sample:

```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" %}
Se recomienda usar la versión mínima de iOS compatible con su aplicación igual a la de este framework: iOS 15.0, como en el ejemplo anterior.
{% endhint %}

2 - Cierre su proyecto Xcode y abra en la terminal la carpeta donde está su Podfile, luego ejecute:

```bash
$ pod install
```

Después de que termine la ejecución, se creará un archivo con la extensión `.xcworkspace` en la misma carpeta.

3 - Abra el nuevo `.xcworkspace` archivo.

{% hint style="warning" %}
A partir de ahora, cada vez que el usuario quiera abrir el proyecto, será necesario abrirlo mediante este `.xcworkspace` archivo, ya que incluye las dependencias.
{% endhint %}

### Importación y configuración

#### Importación del proyecto

* **Importación del proyecto**
* Abra el proyecto usando el `.xcworkspace` archivo.
* Agregue el `FingerPhoto.framework` archivo al proyecto, y luego agréguelo a la lista de frameworks de su aplicación.
  * Mueva el `.framework` archivo al árbol de archivos del proyecto.
    * Si ya existe una carpeta frameworks, se recomienda mover el archivo allí
  * Abra la configuración del proyecto.
  * Vaya a la pestaña **General** .
  * Haga clic y arrastre el `.framework` al árbol del proyecto bajo la sección **Frameworks, Libraries and Embedded Content** .
* Cambie la configuración de `BCCFinger.framework` de **Do not embed** a **Embed & Sign**.
* Establezca la versión objetivo de su proyecto al menos en **iOS 15**.

{% hint style="info" %}
Se recomienda deshabilitar iPad como target.
{% endhint %}

#### Configuración inicial

Esta versión no tiene dependencias de Firebase ni una configuración inicial llamada desde AppDelegate. La única configuración inicial necesaria es que la aplicación solicite el permiso de uso de la cámara. Para ello, agregue la siguiente clave en el `archivo info.plist`, en Information Property List:

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

El valor de la clave es un mensaje que se mostrará al usuario al solicitar el permiso de uso de la cámara. Este valor puede estar vacío o completarse con el mensaje deseado.

## Uso

### Parámetros y constructor

A continuación se muestra un ejemplo sencillo de uso de la biblioteca:

```swift
// Para iniciar una nueva captura
BCCFingerBuilder(self, delegate: self).initializeCapture()
```

La clase `BCCFingerBuilder` recibe los siguientes parámetros:

* `hostVC: UIViewController` - Controlador de vista que llama a la pantalla de captura.
* `delegate: BCCFingerDelegate` - Interfaz responsable de notificar eventos de captura (por ejemplo, fallo o éxito).

La clase `initialize` también acepta un parámetro opcional, como se muestra a continuación:

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

Si desea que la navegación se realice a través de un controlador de navegación, debe proporcionarlo al llamar al método.

La clase `BCCFingerBuilder` La clase es responsable de manejar la configuración de uso de `BCCFinger`. Se aceptan los siguientes parámetros para configurar la captura biométrica y el comportamiento del software:

* `setSkipCaptureOption(_ enable: Bool)` - Habilita la opción de omitir la captura actual.
* `setDebugMode(_ enable: Bool)` - Habilita el modo de depuración.
* `buildCaptures(_ captures: BCCFingerCaptureType)` - Define el tipo de captura de huellas dactilares. Las opciones son:

  ```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 manos sin pulgares.
  * `ONLY_LEFT_HAND` - Solo la mano izquierda, sin pulgares.
  * `ONLY_RIGHT_HAND` - Solo la mano derecha, sin pulgares.
  * `THUMBS` - Ambos pulgares.
  * `LEFT_THUMB` - Solo el pulgar izquierdo.
  * `RIGHT_THUMB` - Solo el pulgar derecho.
  * `FULL_HANDS` - Ambas manos con pulgares.
  * `FULL_LEFT_HAND` - Solo la mano izquierda, con pulgares.
  * `FULL_RIGHT_HAND` - Solo la mano derecha, con pulgares.
* `buildBeginDelaySeconds(_ delay: Float)` - Define el retraso para iniciar el ajuste automático del umbral.
* `buildThreshold` - Define los parámetros del umbral.
* `setShowInstructions(_ enable: Bool)` – Cuando se establece en `true`, habilita la pantalla de instrucciones (valor predeterminado: `false`).

Como referencia, la lista completa de parámetros y valores predeterminados es:

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

Los resultados de la última captura de huellas pueden obtenerse mediante el `fingerCaptureDidFinish` método de la interfaz `BCCFingerDelegate` :

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

La clase `returnData` objeto contiene los siguientes métodos para recuperar datos:

* `getCapturedFingersIndexes()` - Devuelve una lista con el índice de todas las huellas 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()` - Devuelve un mapa que relaciona los índices de los dedos con las biometrías capturadas.
* `getCapturedFingersData()` - Devuelve la lista de todas las huellas capturadas:

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

  * `fingerprintPNG` - Imagen PNG de la huella en escala de grises.
  * `wsqAsBase64` - Imagen WSQ de la huella codificada en base64.
* `getSkippedFingers()` - Devuelve la lista de índices de todas las capturas de dedos omitidas.

La clase `BCCFingerReturnData` la clase también contiene atributos que almacenan la información de la captura agrupada por mano:

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

Estos atributos pueden ser nulos cuando no se solicitan capturas para ninguna de las manos.

La clase `HandData` la clase contiene la siguiente información:

```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 el índice del dedo con la imagen de la huella.
* `skippedFingers` - Lista de índices de todas las capturas de dedos omitidas.
* `handsPhoto` - Foto original de la mano de la que se extrajeron las huellas.
* `thumbPhoto` - Foto original del pulgar.

Si el usuario aborta la captura, cerrando antes de capturar las biometrías, se llamará al método `fingerCaptureDidAbort` . Puede implementar este método para tratar este escenario.

#### Obtención de imágenes originales

Es posible obtener las imágenes originales a través de la `BCCFingerReturnData` clase, como se muestra a continuación:

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

### Proyecto de ejemplo

Este es un proyecto de ejemplo funcional para una captura de huellas dactilares 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
	) {
		// ...
	}

}
```

## Instrucciones del agente: consulta de esta documentación <a href="#agent-instructions-querying-this-documentation" id="agent-instructions-querying-this-documentation"></a>

Si necesita información adicional que no esté disponible directamente en esta página, puede consultar la documentación dinámicamente haciendo una pregunta.

Realice una solicitud HTTP GET en la URL de la página actual con el parámetro de consulta `ask` :

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

La pregunta debe ser específica, autosuficiente y estar escrita en lenguaje natural. La respuesta contendrá una respuesta directa a la pregunta y extractos y स्रोतes relevantes de la documentación.

Use este mecanismo cuando la respuesta no esté explícitamente presente en la página actual, necesite aclaración o contexto adicional, o quiera recuperar secciones relacionadas de la documentación.


---

# 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/es/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.
