> 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/docs.facephi-pt-br/sdks/sdk-mobile/ios-sdk/modulos/captura-de-nfc.md).

# Captura de NFC

### Introdução <a href="#id-1-introduccion" id="id-1-introduccion"></a>

O *Componente* tratado no documento atual recebe o nome de ***Componente NFC***. Ele é responsável por realizar a leitura de NFC de documentos de identidade e passaportes. Suas principais funcionalidades são as seguintes:

* Gerenciamento interno do sensor de NFC.
* Gerenciamento de permissões.
* Análise do documento.
* Análise do progresso.
* Assistente nos processos de leitura.
* Retorno de todas as informações possíveis de serem lidas
* Retorno de imagens quando estiverem disponíveis para leitura

Na seção de [Lançamento simplificado](/docs.facephi-pt-br/sdks/sdk-mobile/ios-sdk/inicializacion/lanzamiento-simplificado.md) são detalhados os passos necessários para a integração básica do SDK. Nesta seção, é adicionada a informação para o lançamento deste componente.

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

Para evitar conflitos e problemas de compatibilidade, caso queira instalar o componente em um projeto que contenha uma versão antiga das bibliotecas da Facephi (*Widget*), eles deverão ser removidos por completo antes da instalação dos componentes da ***SDKMobile***.

### **CocoaPods**

* As dependências obrigatórias que deverão ter sido instaladas previamente (adicionando-as no arquivo Podfile do projeto) são:

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

* Para instalar o componente de NFC, deverá ser incluída a seguinte entrada no Podfile do aplicativo:

```
pod 'FPHISDKNFCComponent', '~> $NFC_VERSION'
```

### **SPM**

* As dependências obrigatórias que devem ter sido instaladas previamente são:

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

```

* Para instalar o componente de NFC, deverá ser incluído nos módulos do projeto:

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

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

| **Controlador** | **Descrição**                        |
| --------------- | ------------------------------------ |
| NFCController   | Controlador principal de leitura NFC |

## Lançamento simplificado

Uma vez iniciado o SDK e criada uma nova operação, será possível lançar o componente. Será possível fazer uso de qualquer um de seus controladores para executar sua funcionalidade.

Lançamento da captura:

```swift
let controller = NfcController(data: nfcConfigurationData, viewController: viewController,  output: { sdkResult in
        // Do whatever with the result
        ...
    }, stateDelegate: nil)
SDKController.shared.launch(controller: controller)
```

## Configuração básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lançar o componente atual, deverá ser criado um objeto *NFCConfigurationData* que será a configuração do controlador do componente.

A configuração básica necessária para isso é a seguinte:

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

Os dados necessários são os do documento que será capturado.

## Recebimento do resultado <a href="#id-7-recepcion-del-resultado" id="id-7-recepcion-del-resultado"></a>

Os controllers devolverão a informação necessária no formato SdkResult.

### Recepção de erros <a href="#id-71-recepcion-de-errores" id="id-71-recepcion-de-errores"></a>

Na parte do erro, **internamente** dispomos da classe NFCPassportReaderError. Este enumerado contém muitos erros específicos que não fornecem informação útil se forem retornados ao integrador, por isso são transformados em um tipo mais simples (**ErrorType**):

* NFC\_CANCEL\_BY\_USER: O usuário cancelou o processo.
* NFC\_COMPONENT\_LICENSE\_ERROR: A licença do componente não está correta.
* NFC\_EMPTY\_LICENSE: A String de licença está vazia.
* NFC\_EXTRACT\_DATA\_ERROR: Erro nos dados extraídos.
* NFC\_INITIALIZATION\_ERROR: Erro de inicialização.
* NFC\_LAST\_COMMAND\_EXPECTED: Erro no comando de finalização
* NFC\_ERROR: Erro geral
* NFC\_ERROR\_DATA: Erro nos dados de entrada
* NFC\_ERROR\_DISABLED: NFC desativado
* NFC\_ERROR\_ILLEGAL\_ARGUMENT: NFC com uma tag incorreta
* NFC\_ERROR\_IO: Erro de entrada/saída
* NFC\_ERROR\_NOT\_SUPPORTED: NFC não suportado
* NFC\_ERROR\_TAG\_LOST: Conexão perdida
* NFC\_OPERATION\_NOT\_CREATED: Não há nenhuma operação em andamento.
* NFC\_TIMEOUT: Timeout no processo.

**NOTA**: `NFC_INVALID_MRZ_KEY` *implica que a conexão não pôde ser estabelecida por causa de que os dados de entrada da configuração (documentNumber, birthDate, expiryDate) não estão corretos. Todos os lançamentos de leitura para esse NFC falharão enquanto não for inicializado um novo NFCController com os dados corretos.*

### Recebimento de execução correta - *data* <a href="#id-72-recepcion-de-ejecucion-correcta-data" id="id-72-recepcion-de-ejecucion-correcta-data"></a>

Na parte de *data*, teremos a classe *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]
    {
        ...
    }
}
```

No caso deste componente, os campos retornados são os seguintes:

**nfcRawData**

Informação obtida por cada tipo de dado em formato bruto.

**nfcDocumentInformation**

Informação obtida do documento ordenada por:

* type
* documentNumber
* issuer
* expirationDate
* mrzString

**nfcPersonalInformation**

Informação obtida do documento ordenada por:

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

**nfcImages**

Informação de imagens obtida do documento ordenada por:

* facialImage
* fingerprintImage
* signatureImage

**nfcSecurityData**

Informação de dados de segurança do documento ordenada por:

* ldsVersion
* dataGroupsHashes
* dataGroupsRead
* documentSigningCertificateData
* issuerSigningCertificateData

**nfcValidations**

Informação das validações do 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

## Informações avançadas

Esta seção amplia as informações do componente.

### Configuração avançada do componente <a href="#id-51-class-nfcconfigurationdata" id="id-51-class-nfcconfigurationdata"></a>

Para lançar o componente atual, deverá ser criado um objeto *NFCConfigurationData* que será a configuração do controlador do componente.

A seguir, são detalhados todos os campos que fazem parte desta classe.

**documentNumber**

Indica o número do documento ou número de suporte dependendo do documento a ser lido.

Este campo é obrigatório.

**birthDate**

Indica a data de nascimento que aparece no documento ("dd/MM/yyyy").

Este campo é obrigatório.

**expirationDate**

Indica a data de expiração que aparece no documento ("dd/MM/yyyy").

Este campo é obrigatório.

**extractionTimeout**

Define o tempo máximo em que a leitura pode ser realizada.

**showTutorial**

Indica se o componente ativa a tela de tutorial. Nesta tela é explicado de forma intuitiva como a captura é realizada.

**vibrationEnabled**

O iOS não permite adicionar vibração enquanto são feitas leituras de NFC.

**enableDebugMode**

Ativação do modo Debug do componente.

**skipPace**

Indica que somente a leitura BAC de NFC deve ser realizada. É uma leitura com informação mais simples e rápida que permite a leitura de mais variedade de documentos.

**showDiagnostic**

Se receber o valor true, ao ocorrer um erro ou uma falta de permissões, o SDK mostrará uma tela com o erro retornado pelo Widget.

**issuer**

Indicamos o país de origem do documento a ser lido.

**documentType**

Indica o tipo de documento que será lido: - ID\_CARD - PASSPORT - FOREIGN\_CARD

**activeAuthenticationChallenge**

Este parâmetro permite injetar um desafio personalizado que pode ser verificado posteriormente para proteger contra ataques de repetição.

**onlyPACE**

Se for verdadeiro, detectará apenas documentos PACE/SAC. Disponível somente a partir do iOS ≥ 16. Requer a string PACE no arquivo de *entitlements*.

**tagConnectionLostTimer**

Antes existia um único temporizador que podia abranger mais de uma requisição quando a resposta era grande.

## Personalização do componente

Além das alterações que podem ser feitas no nível do SDK (as quais são explicadas no documento de *Personalização do SDK*), este componente em específico permite a modificação da sua interface.

### Textos

Os textos podem ser personalizados sobrescrevendo o valor das seguintes chaves em um **Localizable.strings**. As chaves que contêm o sufixo ***\_alt*** são os literais usados nos rótulos de acessibilidade necessários para a funcionalidade de ***voice over***.

| **Name**                                                   | **Value**                                                                                     |
| ---------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| nfc\_component\_start\_message                             | \nDeslize o documento\naté que o dispositivo o detecte\n                                      |
| nfc\_component\_reading\_face\_message                     | Extraindo imagem do rosto.                                                                    |
| nfc\_component\_reading\_images\_message                   | Extraindo imagens.                                                                            |
| nfc\_component\_reading\_document\_message                 | Extraindo os dados do documento.                                                              |
| nfc\_component\_error\_retrieving\_document\_data\_message | Ocorreu um erro durante a captura dos dados do documento                                      |
| nfc\_component\_read\_successful\_title                    | NFC lido com sucesso                                                                          |
| nfc\_component\_error                                      | Ops! Não foi possível ler o NFC                                                               |
| text\_error\_tag\_connection\_lost                         | Leitura interrompida. Coloque novamente o documento na parte superior.                        |
| text\_error\_tag\_connection\_lost\_timer                  | Houve um erro na leitura. Por favor, cancele para reiniciar o processo.                       |
| nfc\_component\_timeout\_desc                              | Você excedeu o tempo de leitura de NFC. Por favor, tente novamente                            |
| text\_chip\_duplicated\_session\_error                     | O processo de captura foi duplicado, por favor tente novamente após esta mensagem desaparecer |
| text\_chip\_security\_serial\_number\_title                | Número de série                                                                               |
| text\_chip\_security\_algorithm\_sign\_title               | Algoritmo de assinatura                                                                       |
| text\_chip\_security\_algorithm\_public\_key\_title        | Algoritmo de chave pública                                                                    |
| text\_chip\_security\_certificated\_impress\_title         | Impressão de certificado                                                                      |
| text\_chip\_security\_editor\_title                        | Editor                                                                                        |
| text\_chip\_security\_subject\_title                       | Sujeito                                                                                       |
| text\_chip\_security\_valid\_from\_title                   | Válido desde                                                                                  |
| text\_chip\_security\_valid\_still\_title                  | Válido até                                                                                    |
| text\_loading\_optional\_description                       | Lendo, por favor, não mova o documento                                                        |
| icon\_loading\_filled\_circle                              | 🟢                                                                                            |
| icon\_loading\_void\_circle                                | ⚪️                                                                                            |
| nfc\_component\_end\_confirmation\_title                   | Finalizar                                                                                     |
| nfc\_component\_end\_confirmation\_message                 | Tem certeza de que deseja finalizar o processo?                                               |
| nfc\_component\_cancel                                     | Cancelar                                                                                      |
| nfc\_component\_agree                                      | Aceitar                                                                                       |
| nfc\_component\_tutorial                                   | Coloque **em contato** o documento com a parte traseira do seu dispositivo.                   |
| nfc\_component\_tutorial\_iphone\_15                       | Coloque **em contato** o documento com a parte frontal do seu dispositivo.                    |
| text\_tutorial\_nfc\_title                                 | Leitura de NFC                                                                                |
| text\_tutorial\_nfc\_button\_ok                            | COMEÇAR                                                                                       |
| text\_tutorial\_nfc\_button\_tip                           | VEJA ESTAS DICAS                                                                              |
| nfc\_component\_tutorial\_title                            | Escanear NFC                                                                                  |
| nfc\_component\_tutorial\_button\_disabled                 | PREPARANDO NFC                                                                                |
| nfc\_component\_tutorial\_1                                | Quando aproximamos um cartão de um sensor, há uma troca de informações chamada NFC.           |
| nfc\_component\_tutorial\_2                                | No seu celular, o sensor está na área marcada. Aqui você deverá aproximar seu documento.      |
| nfc\_component\_tutorial\_3                                | Para uma melhor leitura, retire a capa do seu celular.                                        |
| nfc\_component\_tutorial\_3\_pass                          | Mantenha **fechado** o passaporte para fazer a leitura.                                       |
| nfc\_component\_next                                       | SIGUIENTE                                                                                     |
| nfc\_component\_previous                                   | ANTERIOR                                                                                      |
| nfc\_component\_more\_info\_finish                         | FINALIZAR                                                                                     |
| diagnostic\_tag\_connection\_lost\_title                   | A leitura não foi concluída                                                                   |
| diagnostic\_tag\_connection\_lost\_description             |                                                                                               |

Dessa forma, se desejar modificar, por exemplo, o texto “*COMEÇAR*” da chave `text_tutorial_nfc_button_ok` para o idioma **es-MX**, deve-se ir ao arquivo **Localizable.strings** da pasta **es-MX.lproj** se existir (se não, deverá ser criado) e, então, adicionar:

`"text_tutorial_nfc_button_ok"="EMPEZAR";`

Se uma mensagem não for especificada no arquivo do idioma, ela será preenchida com a mensagem padrão.

### Animações <a href="#id-84-animaciones" id="id-84-animaciones"></a>

As animações a serem usadas são inicializadas de forma semelhante na variável animations com um dicionário, tendo como valor uma string com o nome da animação que se encontre em xcassets que se deseje 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>
