> 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/captura-de-nfc.md).

# Captura de NFC

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

El *Componente* tratado en el documento actual recibe el nombre de ***NFC Component***. Éste se encarga de realizar la lectura de nfc de documentos de identidad y pasaportes. Sus principales funcionalidades son las siguientes:

* Gestión interna del sensor de NFC.
* Gestión de permisos.
* Análisis de documento.
* Análisis del progreso.
* Asistente en los procesos de lectura.
* Devolución de toda la información posible a leer
* Devolución de imágenes cuando estén disponible para su lectura

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.

## Dependencias <a href="#id-21-dependencias-requeridas-para-la-integracion" id="id-21-dependencias-requeridas-para-la-integracion"></a>

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', '~> $SDK_VERSION'
```

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

```
pod 'FPHISDKNFCComponent', '~> $NFC_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 NFC deberá incluirse en los módulos del proyecto:

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

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

| **Controlador** | **Descripción**                      |
| --------------- | ------------------------------------ |
| NFCController   | Controlador principal de lectura NFC |

## Lanzamiento simplificado

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 de la captura:

```swift
let controller = NfcController(data: nfcConfigurationData, viewController: viewController,  output: { sdkResult in
        // Do whatever with the result
        ...
    }, stateDelegate: nil)
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 *NFCConfigurationData* que será la configuración del controlador del componente.

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

```swift
static var nfcConfiguration: NfcConfigurationData {
        return NfcConfigurationData(documentNumber: // Num soporte,
                                    birthDate: // "dd/MM/yyyy",
                                    expirationDate: // "dd/MM/yyyy")
}
```

Los datos necesarios son los del documento que se va a capturar.

## 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, **internamente** disponemos de la clase NFCPassportReaderError. Este enumerado contiene muchos errores específicos que no aportan información útil si son devueltos al integrador, por lo que son transformados a un tipo más simple (**ErrorType**):

* NFC\_CANCEL\_BY\_USER: El usuario ha cancelado el proceso.
* NFC\_COMPONENT\_LICENSE\_ERROR: La licencia del componente no es correcta.
* NFC\_EMPTY\_LICENSE: El String de licencia está vacío.
* NFC\_EXTRACT\_DATA\_ERROR: Error en los datos extraídos.
* NFC\_INITIALIZATION\_ERROR: Error de inicialización.
* NFC\_LAST\_COMMAND\_EXPECTED: Error en el comando de finalización
* NFC\_ERROR: Error general
* NFC\_ERROR\_DATA: Error en los datos de entrada
* NFC\_ERROR\_DISABLED: NFC deshabilitado
* NFC\_ERROR\_ILLEGAL\_ARGUMENT: NFC con un tag incorrecto
* NFC\_ERROR\_IO: Error de entrada/salida
* NFC\_ERROR\_NOT\_SUPPORTED: NFC no soportado
* NFC\_ERROR\_TAG\_LOST: Conexión perdida
* NFC\_OPERATION\_NOT\_CREATED: No hay ninguna operación en curso.
* NFC\_TIMEOUT: Timeout en el proceso.

**NOTA**: `NFC_INVALID_MRZ_KEY` *implica que la conexión no se ha podido establecer por culpa de que los datos de entrada de la configuración (documentNumber, birthDate, expiryDate) no son correctos. Todos los lanzamientos de lectura para ese NFC fallarán mientras no se inicialice un NFCController nuevo con los datos correctos.*

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

En la parte de *data*, dispondremos de la clase *NfcResult*.

```
public class NfcResult {
    public let nfcRawData: NfcRawData
    public private(set) var nfcDocumentInformation: NfcDocumentInformation?
    public private(set) var nfcPersonalInformation: NfcPersonalInformation?
    public let nfcImages: NfcImages?
    public let nfcSecurityData: NfcSecurityData
    public private(set) var nfcValidations: NfcValidations?
}

extension NfcResult {
    public var personalData: [String: String]
    {
        ...
    }
}
```

En el caso de este componente, los campos devueltos son los siguientes:

**nfcRawData**

Información obtenida por cada tipo de dato en formato crudo.

**nfcDocumentInformation**

Información obtenida del documento ordenada por:

* type
* documentNumber
* issuer
* expirationDate
* mrzString

**nfcPersonalInformation**

Información obtenida del documento ordenada por:

* name
* surname
* address
* nationality
* personalNumber
* birthdate
* placeOfBirth
* gender

**nfcImages**

Información de imágenes obtenida del documento ordenada por:

* facialImage
* fingerprintImage
* signatureImage

**nfcSecurityData**

Información de datos de seguridad del documento ordenada por:

* ldsVersion
* dataGroupsHashes
* dataGroupsRead
* documentSigningCertificateData
* issuerSigningCertificateData

**nfcValidations**

Información de las validaciones del documento ordenada por:

* accessProtocol
* activeAuthenticationSupported
* activeAuthenticationValidation
* chipAuthenticationValidation
* dataGroupsHashesValidation
* documentSigningValidation
* issuerSigningValidation

**personalData**

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

## Información avanzada

Este apartado amplía la información del componente.

### Configuración avanzada del componente <a href="#id-51-class-nfcconfigurationdata" id="id-51-class-nfcconfigurationdata"></a>

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

A continuación se detallan todos los campos que forman parte de esta clase.

**documentNumber**

Indica el número de documento o número de soporte dependiendo del documento a realizar la lectura.

Éste campo es obligatorio.

**birthDate**

Indica la fecha de nacimiento que aparece en el documento ("dd/MM/yyyy").

Éste campo es obligatorio.

**expirationDate**

Indica la fecha de expiración que aparece en el documento ("dd/MM/yyyy").

Éste campo es obligatorio.

**extractionTimeout**

Establece el tiempo máximo que se puede realizar la lectura.

**showTutorial**

Indica si el componente activa la pantalla de tutorial. En esta vista se explica de forma intuitiva cómo se realiza la captura.

**vibrationEnabled**

iOS no permite añadir vibración mientras se hacen lecturas de NFC.

**enableDebugMode**

Activación del modo depuración del componente.

**skipPace**

Indica que solo se desea realizar la lectura BAC de NFC. Es una lectura con información más simple y rápida que permite la lectura de más variedad de documentos.

**showDiagnostic**

Si se le da valor true, al producirse un error o una falta de permisos, el sdk mostrará una pantalla con el error devuelto por el widget.

**issuer**

Indicamos el pais de origen del documento a leer.

**documentType**

Indica el tipo de documento que se va a leer: - ID\_CARD - PASSPORT - FOREIGN\_CARD

**activeAuthenticationChallenge**

Este parámetro permite inyectar un desafío personalizado que puede comprobarse posteriormente para proteger contra ataques de repetición.

**onlyPACE**

Si es verdadero, solo detectará documentos PACE/SAC. Disponible únicamente a partir de iOS ≥ 16. Requiere la cadena PACE en el archivo de *entitlements*.

**tagConnectionLostTimer**

Antes existía un único temporizador que podía abarcar más de una petición cuando la respuesta era grande.

## Personalización del componente

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

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**                                                                                          |
| ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| nfc\_component\_start\_message                             | \nDesliza el documento\nhasta que el dispositivo lo detecte\n                                      |
| nfc\_component\_reading\_face\_message                     | Extrayendo imagen de la cara.                                                                      |
| nfc\_component\_reading\_images\_message                   | Extrayendo imágenes.                                                                               |
| nfc\_component\_reading\_document\_message                 | Extrayendo los datos del documento.                                                                |
| nfc\_component\_error\_retrieving\_document\_data\_message | Ha ocurrido un error durante la captura de los datos del documento                                 |
| nfc\_component\_read\_successful\_title                    | NFC leído exitosamente                                                                             |
| nfc\_component\_error                                      | ¡Ups! El NFC no ha podido ser leído                                                                |
| text\_error\_tag\_connection\_lost                         | Lectura interrumpida. Vuelve a poner el documento en la parte superior.                            |
| text\_error\_tag\_connection\_lost\_timer                  | Hubo un error en la lectura. Por favor, cancela para reiniciar el proceso.                         |
| nfc\_component\_timeout\_desc                              | Has excedido el tiempo de lectura de NFC. Por favor intenta de nuevo                               |
| text\_chip\_duplicated\_session\_error                     | El proceso de captura se ha duplicado, por favor vuelva a intentarlo tras desaparecer este mensaje |
| text\_chip\_security\_serial\_number\_title                | Número de serie                                                                                    |
| text\_chip\_security\_algorithm\_sign\_title               | Algoritmo de firma                                                                                 |
| text\_chip\_security\_algorithm\_public\_key\_title        | Algoritmo de clave pública                                                                         |
| text\_chip\_security\_certificated\_impress\_title         | Impresión de certificado                                                                           |
| text\_chip\_security\_editor\_title                        | Editor                                                                                             |
| text\_chip\_security\_subject\_title                       | Sujeto                                                                                             |
| text\_chip\_security\_valid\_from\_title                   | Válido desde                                                                                       |
| text\_chip\_security\_valid\_still\_title                  | Válido hasta                                                                                       |
| text\_loading\_optional\_description                       | Leyendo, por favor, no mueva el documento                                                          |
| icon\_loading\_filled\_circle                              | 🟢                                                                                                 |
| icon\_loading\_void\_circle                                | ⚪️                                                                                                 |
| nfc\_component\_end\_confirmation\_title                   | Finalizar                                                                                          |
| nfc\_component\_end\_confirmation\_message                 | ¿Seguro que finalizar el proceso?                                                                  |
| nfc\_component\_cancel                                     | Cancelar                                                                                           |
| nfc\_component\_agree                                      | Aceptar                                                                                            |
| nfc\_component\_tutorial                                   | Pon **en contacto** el documento con la parte trasera de tu dispositivo.                           |
| nfc\_component\_tutorial\_iphone\_15                       | Pon **en contacto** el documento con la parte delantera de tu dispositivo.                         |
| text\_tutorial\_nfc\_title                                 | Lectura de NFC                                                                                     |
| text\_tutorial\_nfc\_button\_ok                            | COMENZAR                                                                                           |
| text\_tutorial\_nfc\_button\_tip                           | MIRA ESTOS CONSEJOS                                                                                |
| nfc\_component\_tutorial\_title                            | Escanear NFC                                                                                       |
| nfc\_component\_tutorial\_button\_disabled                 | PREPARANDO NFC                                                                                     |
| nfc\_component\_tutorial\_1                                | Cuando pasamos una tarjeta por un sensor, hay un intercambio de información llamado NFC.           |
| nfc\_component\_tutorial\_2                                | En tu móvil, el sensor está en la zona marcada. Aquí deberás juntar tu documento.                  |
| nfc\_component\_tutorial\_3                                | Para una mejor lectura, quita la funda de tu móvil.                                                |
| nfc\_component\_tutorial\_3\_pass                          | Mantén **cerrado** el pasaporte para hacer la lectura.                                             |
| nfc\_component\_next                                       | SIGUIENTE                                                                                          |
| nfc\_component\_previous                                   | ANTERIOR                                                                                           |
| nfc\_component\_more\_info\_finish                         | FINALIZAR                                                                                          |
| diagnostic\_tag\_connection\_lost\_title                   | La lectura no finalizó                                                                             |
| diagnostic\_tag\_connection\_lost\_description             |                                                                                                    |

De este modo, si se desea modificar por ejemplo el texto “*COMENZAR*” de la clave `text_tutorial_nfc_button_ok` para el idioma **es-MX**, se deberá ir al archivo **Localizable.strings** de la carpeta **es-MX.lproj** si es que existe (si no, se deberá crear) y ahí, añadir:

`"text_tutorial_nfc_button_ok"="EMPEZAR";`

Si un mensaje no se especifica en el fichero del idioma, este se rellenará con el mensaje por defecto.

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

Las animaciones a usar se inicializan similarmente en la variable animations con un diccionario, teniendo como valor una string con el nombre de la animación que se encuentre en xcassets que se desee usar.

```
case nfc_anim_tuto_id_male
case nfc_anim_tuto_id_male_iphone_15
case nfc_anim_tuto_id_female
case nfc_anim_tuto_passport
case nfc_anim_tuto_1
case nfc_anim_tuto_2
case nfc_anim_tuto_2_iphone_15
case nfc_anim_tuto_3
case nfc_anim_tuto_3_pass
```

<br>
