> 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***. Este é 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 (*Widgets*), eles deverão ser removidos completamente antes da instalação dos componentes da ***SDKMobile***.

### **CocoaPods**

* As dependências obrigatórias que devem 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 deverão 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 iniciar 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 é 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 as informações necessárias no formato SdkResult.

### Recebimento 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. Esse enumerado contém muitos erros específicos que não acrescentam informação útil se forem devolvidos 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 desabilitado
* NFC\_ERROR\_ILLEGAL\_ARGUMENT: NFC com um tag incorreto
* 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 curso.
* NFC\_TIMEOUT: Timeout no processo.

**NOTA**: `NFC_INVALID_MRZ_KEY` *significa que a conexão não pôde ser estabelecida porque os dados de entrada da configuração (documentNumber, birthDate, expiryDate) não estão corretos. Todas as tentativas de leitura para esse NFC falharão enquanto um novo NFCController não for inicializado 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ções obtidas de cada tipo de dado em formato bruto.

**nfcDocumentInformation**

Informações obtidas do documento organizadas por:

* type
* documentNumber
* issuer
* expirationDate
* mrzString

**nfcPersonalInformation**

Informações obtidas do documento organizadas por:

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

**nfcImages**

Informações de imagens obtidas do documento organizadas por:

* facialImage
* fingerprintImage
* signatureImage

**nfcSecurityData**

Informações dos dados de segurança do documento organizadas por:

* ldsVersion
* dataGroupsHashes
* dataGroupsRead
* documentSigningCertificateData
* issuerSigningCertificateData

**nfcValidations**

Informações das validações do documento organizadas 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 iniciar o componente atual, deverá ser criado um objeto *NFCConfigurationData* que será a configuração do controlador do componente.

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

**documentNumber**

Indica o número do documento ou o 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 para realizar a leitura.

**showTutorial**

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

**vibrationEnabled**

iOS não permite adicionar vibração durante as leituras de NFC.

**enableDebugMode**

Ativação do modo de depuração do componente.

**skipPace**

Indica que se deseja realizar apenas a leitura BAC de NFC. É uma leitura com informações mais simples e rápidas que permite a leitura de uma maior variedade de documentos.

**showDiagnostic**

Se lhe for dado 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 de 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 específico permite a modificação de 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 utilizados nas etiquetas de acessibilidade necessárias para a funcionalidade de ***VoiceOver***.

| **Name**                                                   | **Valor**                                                                                      |
| ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| nfc\_component\_start\_message                             | \nDeslize o documento\naté que o dispositivo o detecte\n                                       |
| nfc\_component\_reading\_face\_message                     | Extraindo a 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! O NFC não pôde ser lido                                                                   |
| text\_error\_tag\_connection\_lost                         | Leitura interrompida. Volte a colocar 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 do certificado                                                                       |
| text\_chip\_security\_editor\_title                        | Emissor                                                                                        |
| 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                   | Encerrar                                                                                       |
| nfc\_component\_end\_confirmation\_message                 | Tem certeza de que deseja finalizar o processo?                                                |
| nfc\_component\_cancel                                     | Cancelar                                                                                       |
| nfc\_component\_agree                                      | Aceitar                                                                                        |
| nfc\_component\_tutorial                                   | Posicione **em contato** o documento com a parte traseira do seu dispositivo.                  |
| nfc\_component\_tutorial\_iphone\_15                       | Posicione **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 a um sensor, ocorre uma troca de informações chamada NFC.         |
| nfc\_component\_tutorial\_2                                | No seu celular, o sensor está na área marcada. Aqui você deverá aproximar o 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                                       | PRÓXIMO                                                                                        |
| 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**, será necessário ir ao arquivo **Localizable.strings** da pasta **es-MX.lproj** caso exista (se não, será necessário criá-lo) 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 usar 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 esteja 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>
