> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/sdks/sdk-mobile/ios-sdk/modulos/video-identificacion.md).

# Videoidentificación - VideoID

## Introducción <a href="#id-1-introduccion" id="id-1-introduccion"></a>

La captura facial se realiza con el ***VideoID Component***.

Este componente se encarga de realizar la grabación de un usuario identificándose, mostrando la cara y su documento de identidad.

* Gestión interna de cámaras, micro y permisos.
* Conexión con los servicios.
* Lectura del OCR y captura del documento.

En el apartado de [Lanzamiento simplificado](/sdks/sdk-mobile/ios-sdk/inicializacion/lanzamiento-simplificado.md) se detallan los pasos necesarios para la integración básica del SDK. En esta sección se añade la información para el lanzamiento de este componente.

## Dependencia

Para evitar conflictos y problemas de compatibilidad, en caso de querer instalar el componente en un proyecto que contenga una versión antigua de las librerías de Facephi (*Widgets*), éstos deberán eliminarse por completo antes de la instalación de los componentes de la ***SDKMobile***.

### **Cocoapods**

* Las dependencias obligatorias que deberán haberse instalado previamente (añadiéndolas en el fichero Podfile del proyecto) son:

```
pod 'FPHISDKMainComponent', '~> $VERSION'
```

* Para instalar el componente de NFC deberá incluirse la siguiente entrada en el Podfile de la aplicación:

```
pod 'FPHISDKVideoIDComponent', '~> $VERSION'
```

### **SPM**

* Las dependencias obligatorias que deberán haberse instalado previamente son:

```
//HTTPS
https://github.com/facephi-clienters/SDK-SdkPackage-SPM.git
//SSH
git@github.com:facephi-clienters/SDK-SdkPackage-SPM.git

```

* Para instalar el componente de Vídeo identificación deberá incluirse en los módulos del proyecto:

```
//HTTPS
https://github.com/facephi-clienters/SDK-VideoIDPackage-SPM.git
//SSH
git@github.com:facephi-clienters/SDK-VideoIDPackage-SPM.git
```

## Permisos

En la aplicación cliente donde se vayan a integrar los componentes es necesario incorporar los siguientes elementos en el fichero **Info.plist**:

```
Es necesario permitir el uso de la cámara (Privacy - Camera Usage Description)
Es necesario permitir el uso del micrófono (NSMicrophoneUsageDescription - Privacy - Microphone Usage Description)
```

## Controladores disponibles <a href="#id-4-controladores-disponibles" id="id-4-controladores-disponibles"></a>

| **Controlador**            | **Descripción**                                    |
| -------------------------- | -------------------------------------------------- |
| VideoIdController          | Controlador principal de video identificación      |
| SignatureVideoIdController | Controlador para firmar un proceso con una Captura |

## Lanzamiento simplificado <a href="#id-4-lanzamiento-simplificado" id="id-4-lanzamiento-simplificado"></a>

Una vez iniciado el SDK y creada una nueva operación se podrá lanzar el componente. Se podrá hacer uso de cualquiera de sus controladores para ejecutar su funcionalidad.

Lanzamiento:

```
let controller = VideoIdController(
  data: videoIdConfigurationData,
  output: { sdkResult in
    // Do whatever with the result
    ...
  }, viewController: viewController)
SDKController.shared.launch(controller: controller)
```

## Configuración básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lanzar el componente actual, se deberá crear un objeto *VideoIdConfigurationData* que será la configuración del controlador del componente.

La configuración básica necesaria para es la siguiente:

```swift
static var videoIDConfiguration: VideoIDConfigurationData {
    return VideoIDConfigurationData(mode: .FACE_DOCUMENT_FRONT_BACK)
}
```

Los diferentes modos son:

* .ONLY\_FACE
* .FACE\_DOCUMENT\_FRONT
* .FACE\_DOCUMENT\_FRONT\_BACK

## Recepción del resultado <a href="#id-7-recepcion-del-resultado" id="id-7-recepcion-del-resultado"></a>

Los controllers devolverán la información necesaria en formato SdkResult.

### Recepción de errores <a href="#id-71-recepcion-de-errores" id="id-71-recepcion-de-errores"></a>

En la parte del error, dispondremos del enumerado común *ErrorType*:

* VID\_CANCEL\_BY\_USER: El usuario ha cancelado el proceso
* VID\_CANCEL\_LAUNCH: Se ha hecho una cancelación general del SDK
* VID\_COMPONENT\_LICENSE\_ERROR: La licencia del componente no es correcta
* VID\_EMPTY\_LICENSE: El String de licencia está vacío
* VID\_FACE\_DETECTION\_TIMEOUT: No se ha detectado cara
* VID\_INITIALIZATION\_ERROR: Error de inicialización
* VID\_MANAGER\_NOT\_INITIALIZED: Los managers son nulos
* VID\_NETWORK\_CONNECTION: Error en la conexión a internet
* VID\_NO\_DATA\_ERROR: Los datos de entrada son nulos
* VID\_OPERATION\_NOT\_CREATED: No hay ninguna operación en curso
* VID\_PERMISSION\_DENIED: El usuario ha rechazado los permisos
* VID\_SOCKET\_ERROR: Error en la conexión de los servicios
* VID\_TIMEOUT: Timeout en el proceso
* VID\_VIDEO\_ERROR: Error en el procesamiento del vídeo
* VID\_VIDEO\_RECORDING\_ACTIVE: No se puede iniciar porque el proceso de vídeo grabación está activo

### Recepción de ejecución correcta - *data* <a href="#id-62-recepcion-de-ejecucion-correcta-data" id="id-62-recepcion-de-ejecucion-correcta-data"></a>

En la parte de SdkResult.Success - *data*, dispondremos de la clase VideoIdResult.

El resultado devuelve las imágenes en formato **SdkImage**, es posible extraer el bitmap accediendo a *image.bitmap*. Si se quisiera convertir a base64 se puede utilizar la función:

`Base64.encodeToString(this.toByteArray(), Base64.NO_WRAP)`

Los campos devueltos en el resultado son los siguientes:

**frontDocumentData**

Datos del frente del documento. Incluye:

* documentImage: Imagen del documento
* documentFullImage: Imagen completa capturada
* documentFaceImage: Si se ha encontrado una cara en el documento se devuelve la imagen de la misma.
* iqaOverExposure: Valor numérico entre 0 y 1 que indica el nivel de sobreexposición de la imagen; un valor alto sugiere que la imagen está demasiado iluminada, lo que puede dificultar la lectura del documento.
* iqaReadable: Valor numérico entre 0 y 1 que indica la legibilidad del texto del documento; valores más altos implican que el texto es más claro y fácil de reconocer.
* iqaSharpness: Valor numérico entre 0 y 1 que indica la nitidez de la imagen del documento; valores altos reflejan una imagen más enfocada, lo que mejora la capacidad de extracción de datos.
* documentFaceImageTokenized: Si se ha encontrado una cara en el documento se devuelve la imagen cifrada de la misma.

**backDocumentData**

Datos del reverso del documento. Incluye:

* documentImage: Imagen del documento
* documentFullImage: Imagen completa capturada
* documentFaceImage: Si se ha encontrado una cara en el documento se devuelve la imagen de la misma.
* iqaOverExposure: Valor numérico entre 0 y 1 que indica el nivel de sobreexposición de la imagen; un valor alto sugiere que la imagen está demasiado iluminada, lo que puede dificultar la lectura del documento.
* iqaReadable: Valor numérico entre 0 y 1 que indica la legibilidad del texto del documento; valores más altos implican que el texto es más claro y fácil de reconocer.
* iqaSharpness: Valor numérico entre 0 y 1 que indica la nitidez de la imagen del documento; valores altos reflejan una imagen más enfocada, lo que mejora la capacidad de extracción de datos.
* documentFaceImageTokenized: Si se ha encontrado una cara en el documento se devuelve la imagen cifrada de la misma.

**faceImage**

Imagen del usuario capturada en la primera sección del proceso.

**ocrMap**

Mapa del OCR extraído del documento.

**ocrDiagnostic**

Diccionario con el diagnóstico OCR del documento. Las claves son los campos a validar y los valores son instancias de OcrDiagnostic.

Diagnóstico OCR extraído del documento.

* OK: El OCR es correcto.
* NOT\_FOUND: No se encuentra la clave OCR.
* TOLERANCE\_ERROR: El OCR no es correcto.
* WARNING: El OCR no es correcto, pero es solo una advertencia porque es un campo opcional.

**matchingSidesScore**

Valor numérico entre 0 y 1 que estima el nivel de coincidencia entre las caras del documento (frontal y trasera).

**documentType**

Tipo de documento obtenido.

**personalData**

Conjunto reducido de datos obtenidos del usuario:

* issuer
* documentNumber
* issueDate
* expiryDate
* name
* surname
* fullName
* gender
* birthDate
* birthPlace
* nationality
* address
* nfcKey
* numSupport
* mrz

**speechText**

Texto que el usuario deberá pronunciar durante la grabación del video.

**faceImageTokenized**

Imagen cifrada del usuario capturada en la primera sección del proceso.

## Personalización del componente <a href="#id-8-personalizacion-del-componente" id="id-8-personalizacion-del-componente"></a>

Aparte de los cambios que se pueden realizar a nivel de SDK (los cuales se explican en el documento de *Personalización del SDK*), este componente en concreto permite la modificación de su interfaz.

### Textos <a href="#id-81-textos" id="id-81-textos"></a>

Los textos pueden ser customizados sobreescribiendo el valor de las siguientes claves en un **Localizable.strings**. Las claves que contienen el sufijo ***\_alt*** son los literales utilizados en las etiquetas de accesibilidad necesarias para la funcionalidad de ***voice over***.

| **Name**                                                      | **Value**                                                                                      |
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| video\_id\_component\_init\_message\_face\_content\_desc      | Coloca tu rostro y el frente de tu documento en las marcas                                     |
| video\_id\_component\_finish\_message                         | ¡Video grabación finalizada!                                                                   |
| video\_id\_component\_finish\_button                          | FINALIZAR                                                                                      |
| video\_id\_component\_restart\_button                         | REPETIR GRABACIÓN                                                                              |
| video\_id\_component\_ready\_button                           | CONTINUAR                                                                                      |
| video\_id\_component\_exit\_alert\_cancel                     | Cancelar                                                                                       |
| video\_id\_component\_exit\_alert\_question                   | ¿Seguro que quiere finalizar el proceso?                                                       |
| video\_id\_component\_exit\_alert\_finish                     | Finalizar                                                                                      |
| video\_id\_component\_exit\_alert\_accept                     | Aceptar                                                                                        |
| video\_id\_component\_timeout\_title                          | Tiempo superado                                                                                |
| video\_id\_component\_timeout\_desc                           | No pudimos hacer la grabación a tiempo. Probemos de nuevo.                                     |
| video\_id\_component\_internal\_error\_title                  | Se ha producido un error                                                                       |
| video\_id\_component\_internal\_error\_desc                   | Probemos de nuevo.                                                                             |
| video\_id\_component\_close\_button\_alt                      | Cerrar                                                                                         |
| video\_id\_component\_back\_button\_alt                       | Atrás                                                                                          |
| video\_id\_component\_logo\_alt                               | Logo                                                                                           |
| video\_id\_component\_document\_front\_message                | Coloca el frente de tu documento en las marcas                                                 |
| video\_id\_component\_document\_front\_message\_readable      | Mantén el frente de tu documento en las marcas                                                 |
| video\_id\_component\_document\_front\_message\_not\_readable | Acerca el frente de tu documento a las marcas                                                  |
| video\_id\_component\_document\_back\_message                 | Ahora coloca el reverso de tu documento                                                        |
| video\_id\_component\_document\_back\_message\_readable       | Mantén el reverso de tu documento en las marcas                                                |
| video\_id\_component\_document\_back\_message\_not\_readable  | Acerca el reverso de tu documento a las marcas                                                 |
| video\_id\_component\_switch\_camera\_message                 | Prepara el documento mientras se procede al cambio de cámara                                   |
| video\_id\_component\_face\_message                           | Coloca tu cara dentro del marco.                                                               |
| video\_id\_component\_multiple\_face\_message                 | Varias caras detectadas. Coloca solo tu cara dentro del marco                                  |
| video\_id\_component\_speech\_message                         | Di en voz alta: "Yo (nombre y apellidos) acepto los términos y condiciones".                   |
| video\_id\_component\_front\_document\_captured\_message      | Frente del documento capturado correctamente                                                   |
| video\_id\_component\_document\_back\_finish\_message         | Reverso del documento capturado correctamente                                                  |
| video\_id\_component\_face\_timeout\_title                    | No hemos detectado tu rostro                                                                   |
| video\_id\_component\_face\_timeout\_desc                     | Por favor, coloca tu rostro en la marca para iniciar el proceso                                |
| video\_id\_component\_ocr\_error\_desc                        | El documento no se ha podido leer. Por favor, revisa la iluminación y la distancia a la cámara |

### Animaciones <a href="#id-82-animaciones" id="id-82-animaciones"></a>

Si se desea modificar las animaciones (lottie) de la SDK habría que incluir las animaciones con el mismo nombre en la carpeta res/raw/ de la aplicación.

```
video_id_anim_doc_and_face.json
video_id_anim_face.json
video_id_anim_loading.json
```
