> For the complete documentation index, see [llms.txt](https://docs.griaule.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.griaule.com/sdks/es/bcc-face/bccmobilefaceios.md).

# iOS

**BCC Face** es una biblioteca destinada a integrarse en una aplicación iOS desde un `.framework` archivo.

Usa la cámara del dispositivo para tomar una foto de un rostro con fines biométricos. Proporciona una sencilla prueba activa de vivacidad, que requiere que la persona sonría durante aproximadamente un segundo y/o mire a la derecha o a la izquierda. La prueba de vivacidad incluye una opción para que las instrucciones se reproduzcan por voz, lo que facilita el flujo de trabajo a los usuarios. Además, proporciona una prueba de vivacidad pasiva que puede usarse para verificar que la foto se tomó de una persona real sin requerir interacción del usuario.

Este manual está actualizado para la versión de BCC Face Mobile iOS `4.12.2`.

{% hint style="warning" %}
La **prueba de vivacidad pasiva** solo está disponible a partir de la versión `4.4.0` en adelante.
{% endhint %}

### Requisitos

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

### Instalación

#### Instalación de dependencias

1 - Añada los siguientes Pods a las dependencias de la aplicación en el 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 de Xcode usando el `pod init` comando en la terminal. El Podfile no aparecerá directamente en Xcode; se creará en el directorio del proyecto.
{% endhint %}

Se prefieren los frameworks dinámicos. Esto puede indicarse usando la `use_frameworks!` marca en el Podfile.

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

```ruby
platform :ios, '15.5'

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['DEVELOPMENT_TEAM'] = "YOUR_DEVELOPMENT_TEAM_KEY"
			config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
		end
	end
end
```

{% hint style="warning" %}
En versiones anteriores de BCC Face Lib iOS, también era necesario declarar `pod 'GoogleMLKit/FaceDetection'` en el Podfile de la aplicación. A partir de **la versión 4.12.2**, si la aplicación tiene esta dependencia, **se recomienda eliminarla** y ejecutar `pod install` nuevamente. BCC Face Lib ya incluye MLKit internamente; mantener esta declaración de pod provocará advertencias de clases duplicadas que pueden causar inestabilidad al iniciar la aplicación.
{% endhint %}

{% hint style="warning" %}
Se recomienda usar para su aplicación la misma versión mínima de iOS que la admitida por este framework: iOS 15.5, como en el ejemplo anterior. También es aconsejable establecer la `BUILD_LIBRARY_FOR_DISTRIBUTION = YES` marca en el Podfile para garantizar la compatibilidad con versiones antiguas del SDK.
{% endhint %}

2 - Cierre el proyecto de Xcode, abra una terminal, vaya a la carpeta donde se encuentra el Podfile y luego ejecute:

```bash
pod install
```

Cuando finalice la ejecución, se creará un archivo con la `.xcworkspace` extensión 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, deberá abrirse a través de este `.xcworkspace` archivo, ya que incluye las dependencias.
{% endhint %}

#### Importación y configuración

**Importación del proyecto**

* Abra el proyecto usando el `.xcworkspace` archivo.
* Añada el `BCCFace.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 de 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` del árbol del proyecto a la `Frameworks, Libraries and Embedded Content` sección.
* Cambie la `BCCFace.framework` configuración de `No incrustar` a `Incrustar y firmar`.
* Cambie la versión objetivo de su proyecto a un mínimo de iOS 15.5.

{% hint style="info" %}
Se recomienda desactivar iPad como objetivo.
{% endhint %}

**Configuración inicial**

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

```properties
Key   :  Privacy - Camera Usage Description
Value :  Permitir acceso a la cámara
```

El valor de la clave es un mensaje que se muestra al usuario cuando se solicita el permiso de uso de la cámara. Este valor puede dejarse en blanco o completarse con un mensaje personalizado.

### Uso

#### Parámetros y constructor

Para usar correctamente la biblioteca BCC Face, hay algunos parámetros obligatorios.

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

```swift
BCCFaceBuilder(self, delegate: self).initializeCapture()
```

***

La `BCCFaceBuilder` el constructor de la clase recibe los siguientes parámetros:

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

***

La `initializeCapture` el método 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.

***

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

* `buildSmileCheck(with smileProbability: ClosedRange<Float> = 0.5...1.0)` - Añade la sonrisa a la prueba de vivacidad y establece el umbral de aceptación. Esta función está activada de forma predeterminada.
* `removeSmileCheck()` - Elimina la sonrisa de la prueba de vivacidad.
* `buildRotationCheck(_ rotationChecks: [HeadRotationCheck], headRotationAngle: ClosedRange<Float> = -6.0...6.0)` - Define una lista de pruebas de vivacidad de rotación de cabeza y el ángulo máximo de rotación. Esta función está activada de forma predeterminada. Las opciones de rotación de cabeza son:

```swift
  enum class HeadRotationCheck {
  	case randomRotation
  	case leftRotation
  	case rightRotation
  }
```

* `removeHeadRotation()` - Elimina la rotación de cabeza de la prueba de vivacidad.
* `addPassiveLiveness()` - Añade la prueba de vivacidad pasiva. Esta función se usa para verificar que la foto capturada corresponde a una persona real sin requerir ninguna interacción del usuario. Para usar esta función, DEBE desactivar las comprobaciones activas de vivacidad (`removeSmileCheck()` y `removeHeadRotation()`), que se añaden de forma predeterminada.
* `buildSpeechSettings(_ speechSettings: SpeechSettings)` - Define los criterios para el habla de accesibilidad, usando los siguientes parámetros:

```swift
  class SpeechSettings(
  	public let volume: Float
  	public let startsMuted: Bool
  	public let pitch: Float
  	public let speed: Float
  )
```

* `volumen` - El volumen de audio entre `0.0` y `1.0`.
* `startsMuted` - Define si las instrucciones comienzan silenciadas o no (`true` para silenciadas).
* `tono` - Define el tono de voz de las instrucciones entre `0.5` (bajo) y `2.0` (alto).
* `velocidad` - Define la velocidad de voz de las instrucciones. Este valor debe ser positivo.

Los valores preestablecidos pueden accederse a través de la variable estática:

```swift
  public static let defaultSpeechSettings = SpeechSettings(
  	volume: 1.0,
  	startsMuted: true,
  	pitch: 1.0,
  	speed: 0.5
  )
```

* `removeSpeech()` - Elimina el habla de accesibilidad.
* `setInstructionEnable(_ enable: Bool)` - Define si la pantalla de instrucciones está activada o desactivada.
* `forceLanguage(_ language: BCCLanguages?)` - Fuerza que las instrucciones se muestren en un solo idioma. Si el idioma del dispositivo no es compatible, se usará inglés. Los idiomas compatibles son:

```swift
  public enum BCCLanguages: String {
  	case ptBR = "pt-BR"
  	case enUS = "en"
  	case esMX = "es"
  	case deviceLanguage = "deviceLanguage"
  }
```

* `enableFlashButton(_ enable: Bool)` - Habilita (`true`) o deshabilita (`false`) el botón de flash en la cámara trasera. Predeterminado: deshabilitado (`false`).
* `enableManualCapture(_ enable: Bool)` - Habilita (`true`) o deshabilita (`false`) el botón de captura manual, que permite omitir las comprobaciones automáticas de captura. Al realizar una captura manual, el usuario podrá revisar la foto capturada antes de finalizar el proceso.
* `setImageCompressionFormat(_ format: ImageCompressionFormat)` - Define el formato de compresión de una captura de vivacidad pasiva. Puede elegir entre `.jpeg` (predeterminado) o `.jpeg2000`.
* `enableIntegrityValidation(clientSecret: Data, nonce: Data)` - Habilita la validación de integridad para la vivacidad pasiva, una capa adicional de seguridad para garantizar la integridad de la carga útil.

Como referencia, aquí tiene una lista completa de parámetros y valores predeterminados:

```swift
var headRotationAngle: ClosedRange<Float> = -6.0...6.0
var openEyesProbability: ClosedRange<Float> = 0.8...1.1  // Obsoleto a partir de 4.12.2
var smileProbability: ClosedRange<Float> = 0.5...1.0
var livenessChecks: [LivenessChecks] = [.smileDetection]
var headRotationChecks: [HeadRotationCheck] = [.randomRotation]
var speechSettings: SpeechSettings? = .defaultSpeechSettings
var cameraSettings: CameraSettings = .defaultCameraSettings
var canEnableManualCapture: Bool = false
var canEnableFlash: Bool = true
var language: BCCLanguages? = nil
var showInstructions: Bool = false
var imageCompressionFormat: ImageCompressionFormat = .jpeg
var integrityValidationData: IntegrityValidationData? = nil
```

{% hint style="warning" %}
La prueba de vivacidad activa (usando sonrisa y rotación aleatoria de la cabeza) está activada de forma predeterminada. Para usar solo la comprobación de vivacidad pasiva, antes de añadirla debe eliminar los métodos de vivacidad activa del builder:

```swift
BCCFaceBuilder(self, delegate: self)
	.removeSmileCheck()
	.removeHeadRotation()
	.addPassiveLiveness()
```

{% endhint %}

Aquí tiene un fragmento de código para inicializar una captura usando solo la prueba de vivacidad pasiva:

```swift
// Desde el ViewController deseado...

// Cree el builder
let faceBuilder = BCCFaceBuilder(self, delegate: self)

// Configure el builder
faceBuilder
	.removeSmileCheck()
	.removeHeadRotation()
	.addPassiveLiveness()

// Inicialice la captura desde el builder
faceBuilder.initializeCapture(self.navigationController)
```

#### Valores devueltos

Los resultados de la última captura facial pueden recuperarse usando el `faceCaptureDidFinish` método de la `BCCFaceDelegate` interfaz:

```swift
func faceCaptureDidFinish(
	data: BCCFaceReturnData,
	analytics: BCCFaceReturnAnalytics
)
```

La `datos` objeto contiene las imágenes capturadas durante el proceso:

```swift
public struct BCCFaceReturnData {
	// Anteriormente 'photo', renombrado para seguir el mismo patrón que en Android
	public internal(set) var originalPhoto: UIImage
	public internal(set) var croppedPhoto: UIImage?

	// Resultado de vivacidad pasiva
	public internal(set) var passiveResult: Data?

	// API LEGACY: igual que 'originalPhoto'
	public var photo: UIImage { self.originalPhoto }
}
```

Las propiedades devueltas son:

* `originalPhoto` (*imagen*) - La foto original tomada por la cámara.
* `croppedPhoto` (*imagen*) - La foto recortada, que es la imagen del rostro recortada de la foto original.
* `passiveResult` (*Data*) - Contenido del archivo de la captura de vivacidad pasiva. Solo está presente si se capturó correctamente. Es el resultado de la captura de vivacidad pasiva como *Datos JPEG* o *JPEG 2000*. Estos datos pueden guardarse/exportarse directamente a un archivo o enviarse por la red (para la transmisión por red, los datos pueden codificarse fácilmente, por ejemplo, como una cadena Base64).

Si el usuario aborta la captura o si se produce cualquier fallo durante el proceso, se llamará al `faceCaptureDidAbort` método. Puede implementar este método para manejar este escenario.

#### Proyecto de ejemplo

Este es un proyecto de ejemplo funcional para captura facial usando BCC Mobile Face iOS:

```swift
import UIKit
import BCCFace

class ViewController: UIViewController {
	override func viewDidLoad() {
		super.viewDidLoad()
	}

	@IBAction func startCapture(_ sender: UIButton) {
		BCCFaceBuilder(self, delegate: self)
			.removeSmileCheck()
			.removeHeadRotation()
			.addPassiveLiveness()
			.buildCameraSettings(.frontSwitchable)
			.enableFlashButton(true)
			.initializeCapture(navigationController)
	}
}

extension ViewController: BCCFaceDelegate {
	func faceCaptureDidFinish(
		data: BCCFace.BCCFaceReturnData,
		analytics: BCCFace.BCCFaceAnalytics
	) {
		// ...
	}

	func faceCaptureDidAbort(
		analytics: BCCFace.BCCFaceAnalytics
	) {
		// ...
	}
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.griaule.com/sdks/es/bcc-face/bccmobilefaceios.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
