> For the complete documentation index, see [llms.txt](https://docs.caf.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.caf.io/caf-sdk/caf-sdk-pt-br/ios/getting-started-with-the-sdk-2/customizing-document-detector.md).

# Personalizando o Document Detector

{% hint style="warning" %}

## Este guia abrange a versão 7.0.0 e superiores. Para versões anteriores à 7.0.0, consulte a [documentação legada](/caf-sdk/caf-sdk-pt-br/ios/getting-started-with-the-sdk-5.md).

{% endhint %}

## Visão geral

Esta página é uma **referência campo a campo** de tudo o que os integradores podem alterar em **Detector de Documentos**: cópia, captura da UI, etapas do fluxo, comportamento de upload, proxy opcional, filtragem de passaporte, personalizações de strings e cores globais.

***

### Interface de personalização

Pressuponha **`Certta.shared.configure(configuration:)`** já tenha sido executado com um **token móvel** e **ID do usuário**. Importe **`UIKit`** e **`CafSDK`** (e faça o link **DocumentDetector** de acordo com sua distribuição).

#### 1. Abertura mínima — UI padrão, frente e verso do RG

Usa **`CerttaDocumentDetectorUIConfiguration()`** para que todos os campos da UI usem os padrões do SDK. Apenas **`o fluxo`** é personalizado.

```swift
import UIKit
import CafSDK

final class DocumentFlowViewController: UIViewController {

    func startDocumentDetector() {
        CerttaDocumentDetector.shared.delegate = self

        let flow: [CafDocumentDetectorStep] = [
            CafDocumentDetectorStep(stepType: .rgFront),
            CafDocumentDetectorStep(stepType: .rgBack)
        ]

        let configuration = CerttaDocumentDetectorConfiguration(
            flow: flow,
            ui: CerttaDocumentDetectorUIConfiguration(),
            enableMultiLanguage: true
        )

        CerttaDocumentDetector.shared.open(from: self, configuration: configuration)
    }
}

extension DocumentFlowViewController: CerttaDocumentDetectorDelegate {
    func didFinish(result: String) {
        // Envie `result` para o seu backend (payload assinado).
    }

    func didFinishWith(_ error: CerttaError) {
        // Mapeie `error` / `error.message` para a UI (veja o README).
    }
}
```

Defina **`Certta.shared.delegate`** se precisar de **`certtaDidCancel()`** / **`certtaDidLog`**.

#### 2. UI estruturada — seleção, instruções, moldura de captura, upload

Construa **`CerttaDocumentDetectorUIConfiguration`** campo por campo. Este exemplo habilita **envio**, personaliza **as instruções**, reduz **as tentativas**, e ajusta **as cores da moldura** durante a captura.

```swift
func makeDocumentConfiguration() -> CerttaDocumentDetectorConfiguration {
    var ui = CerttaDocumentDetectorUIConfiguration()

    ui.documentSelectionScreen.title = "Tipo de documento"
    ui.documentSelectionScreen.subtitle = "Escolha o documento que vai fotografar"
    ui.documentSelectionScreen.titlesByDocumentKind = [
        .rg: "RG",
        .cnh: "CNH"
    ]

    ui.instructionsScreen.title = "Como fotografar"
    ui.instructionsScreen.message = "Coloque o documento inteiro dentro da área e evite reflexos."
    ui.instructionsScreen.steps = [
        "Segure o telefone firme",
        "Centralize o documento na moldura"
    ]
    ui.instructionsScreen.primaryButtonTitle = "Continuar"

    ui.captureScreen.documentFrameNeutralColor = .label
    ui.captureScreen.documentFrameValidationFailedColor = .systemRed
    ui.captureScreen.documentFrameValidationPassedColor = .systemGreen
    // ui.captureScreen.fontName = "MyFont-Regular"  // Nome PostScript, se estiver embutido

    ui.uploadSettings = CafUploadSettings(
        enable: true,
        compress: true,
        fileFormats: [.jpeg, .png],
        maximumFileSize: 5_000_000
    )
    ui.showPreview = true
    ui.showPopup = true
    ui.requestTimeout = 90
    ui.maxRetryAttempts = 4

    let flow = [
        CafDocumentDetectorStep(stepType: .rgFront),
        CafDocumentDetectorStep(stepType: .rgBack)
    ]

    return CerttaDocumentDetectorConfiguration(flow: flow, ui: ui, enableMultiLanguage: true)
}

// Uso:
// CerttaDocumentDetector.shared.open(from: self, configuration: makeDocumentConfiguration())
```

#### 3. Cópia e ilustração por etapa

Use **`CafDocumentDetectorStep`** inicializadores para substituir rótulos, **`UIImage`**&#x6F;pcional, e mensagens para uma única etapa.

```swift
let flow: [CafDocumentDetectorStep] = [
    CafDocumentDetectorStep(
        stepType: .rgFront,
        customStepLabel: "Frente do RG",
        customIllustration: UIImage(named: "illustration-rg-front"),
        showStepLabel: true,
        customMessage: "Capture a frente nítida, sem cortes.",
        customOkButtonTitle: "OK"
    ),
    CafDocumentDetectorStep(stepType: .rgBack)
]
```

#### 4. Personalizações de strings (`CafDDCustomization`)

Passe um ou mais structs de personalização dentro de **`CerttaDocumentDetectorCustomization`**. Elas se mapeiam para strings nativas de DD **personalizadas** (prévia, popup de upload, linhas de progresso, captura com falha).

```swift
var ui = CerttaDocumentDetectorUIConfiguration()

let previewStrings = CafPreviewCustomization(
    title: "Conferir foto",
    message: "O texto está legível?",
    okButton: "Usar esta foto",
    tryAgainButton: "Tirar de novo"
)

let uploadProgress = CafUploadMessagesCustomization(
    sending: "Enviando…",
    verifyingIntegrity: "Verificando…",
    processingData: "Processando…",
    almostDone: "Quase lá…",
    timeBetweenMessages: 1.2
)

let failed = CafFailedPhotoCustomization(
    title: "Foto rejeitada",
    description: "Tente novamente com melhor iluminação.",
    continueButton: "Continuar"
)

ui.customization = CerttaDocumentDetectorCustomization(
    ddCustomizations: [previewStrings, uploadProgress, failed]
)

let configuration = CerttaDocumentDetectorConfiguration(
    flow: [
        CafDocumentDetectorStep(stepType: .cnhFront),
        CafDocumentDetectorStep(stepType: .cnhBack)
    ],
    ui: ui
)
```

#### 5. Inicializador legado — `CafDocumentDetectorLayout` + `CafInstructionsConfiguration`

Quando você preferir não usar **`CerttaDocumentDetectorUIConfiguration`**, monte **`o layout`**, **`a configuração de instruções`**, e **`as configurações de upload`** você mesmo.

```swift
var layout = CafDocumentDetectorLayout()
layout.setCloseButton(image: UIImage(systemName: "xmark.circle.fill"))
layout.setFeedbackColors(
    CafDocumentFeedbackColors(
        defaultColor: .white,
        errorColor: .systemRed,
        successColor: .systemGreen
    )
)

var instructions = CafInstructionsConfiguration(
    enabled: true,
    captureTitle: "Captura",
    captureDescriptionText: "Alinhe o documento.",
    captureSteps: ["Passo 1", "Passo 2"],
    captureButtonTitle: "Capturar"
)

let configuration = CerttaDocumentDetectorConfiguration(
    flow: [
        CafDocumentDetectorStep(stepType: .passport)
    ],
    layout: layout,
    uploadSettings: CafUploadSettings(enable: true),
    instructionsConfig: instructions,
    requestTimeout: 60,
    showPreCapturePopup: true,
    showPreview: true,
    ddCustomizations: [],
    enableMultiLanguage: true,
    selectDocumentConfig: nil,
    maxRetryAttempts: 3
)
```

#### 6. Ponte a partir do completo `CafDocumentDetectorConfig`

Se você já monta **`CafDocumentDetectorConfig`** (demo, JSON ou builder legado), envolva-o com **`init(from:)`**. Os campos **não** armazenados em **`CerttaDocumentDetectorConfiguration`** ainda recebem **os padrões do hub** em tempo de execução — veja **Mapeamento do Hub**.

```swift
let full = CafDocumentDetectorConfig(
    flow: [
        CafDocumentDetectorStep(stepType: .rgFront),
        CafDocumentDetectorStep(stepType: .rgBack)
    ],
    proxySettings: CafProxySettings(hostname: "proxy.example.com", port: 443),
    allowedPassportCountryList: [.bra, .usa]
)

let configuration = CerttaDocumentDetectorConfiguration(from: full)
CerttaDocumentDetector.shared.open(from: self, configuration: configuration)
```

> **Observação:** O proxy e a lista de passaportes em **`full`** são **não** encaminhados pelo mapeamento interno do hub do Certta da mesma forma que **`CafSDKProvider` + `CafDocumentDetectorConfig`** — para comportamento garantido de proxy / allowlist, use **`CafSDKProvider.Builder`** com um completo **`CafDocumentDetectorConfig`** (veja abaixo).

#### 7. Controle total — `CafSDKProvider.Builder` + proxy / passaporte / atrasos

Use este caminho quando você precisar definir **proxy**, **`getUrlExpireTime`**, **`currentStepDoneDelay`**, **`allowedPassportCountryList`**, ou campos de captura manual exatamente. Pseudocódigo:

```swift
var config = CafDocumentDetectorConfig(
    flow: [CafDocumentDetectorStep(stepType: .passport)],
    proxySettings: CafProxySettings(hostname: "10.0.0.1", port: 8080),
    getUrlExpireTime: "3600",
    currentStepDoneDelay: 0.5,
    allowedPassportCountryList: [.bra],
    maxRetryAttempts: 5
)

let provider = CafSDKProvider.Builder(
    self,
    mobileToken: token,
    personId: userId,
    environment: .prod,
    configuration: CafSDKConfiguration(
        presentationOrder: [.documentDetector],
        colorConfig: nil,
        waitForAllServices: true,
        enableTransitionScreens: true
    ).setDocumentDetectorConfig(config)
) { event in
    // Trate CafUnifiedEvent (sucesso, falha, erro, log etc.)
}.build()

provider.start()
```

Exato **`CafSDKConfiguration`** e o tratamento do callback dependem do seu app; veja **a referência de configuração** e os exemplos do produto.

#### 8. Ponte legado `CafDocumentDetectorLayout` + `CafInstructionsConfiguration` para `CerttaDocumentDetectorUIConfiguration`

Se você já tem **`CafDocumentDetectorLayout`** e **`CafInstructionsConfiguration`** (ou **`CafSelectDocumentConfig`**) de uma integração anterior, use:

```swift
let ui = CerttaDocumentDetectorUIConfiguration(
    layout: existingLayout,
    instructions: existingInstructions,
    documentTypeSelection: existingSelectConfig // ou nil
)

let configuration = CerttaDocumentDetectorConfiguration(
    flow: [CafDocumentDetectorStep(stepType: .rgFront)],
    ui: ui
)
```

Os padrões para **`as configurações de upload`**, **`showPreview`**, etc., são definidos dentro desse inicializador de ponte — ajuste os campos em **`ui`** após a construção, se necessário.

#### 9. Cores da sessão antes de abrir o DD

```swift
// Depois de Certta.shared.configure(...)
Certta.shared.setColorConfiguration(
    CafColorConfiguration(
        primaryColor: "#34D690",
        secondaryColor: "#012D1F",
        contentColor: "#323232",
        backgroundColor: "#FFFFFF",
        mediumColor: "#D1D1D1",
        dialogBackgroundColor: "#FFFFFF",
        dialogBorderColor: "#E5E5E7"
    )
)
```

Use **`UITraitCollection`** (ou sua camada de tema) para construir **diferentes** **`CafColorConfiguration`** valores para claro vs. escuro, se necessário.

#### 10. Opcional: aquecer com `loadSession`

```swift
let configuration = CerttaDocumentDetectorConfiguration(
    flow: [CafDocumentDetectorStep(stepType: .rgFront)],
    ui: CerttaDocumentDetectorUIConfiguration()
)

CerttaDocumentDetector.shared.loadSession(from: self, configuration: configuration)
// … depois, a mesma configuração:
CerttaDocumentDetector.shared.open(from: self, configuration: configuration)
```

***

### `CerttaDocumentDetectorUIConfiguration`

Tipo raiz para a UI estruturada. Os padrões abaixo correspondem ao **Swift** inicializador em **CafSDK**.

| Propriedade                      | Tipo                                         | O que faz                                                                                                                                                          | Padrão (típico)                                                    |
| -------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ |
| **`documentSelectionScreen`**    | `CafDocumentDetectorDocumentSelectionScreen` | Títulos/subtítulos para o seletor de **tipo de documento** ; rótulos por tipo. Se todos estiverem vazios, a configuração de seleção pode ser omitida internamente. | Veja a seção aninhada                                              |
| **`layoutResourceName`**         | `String?`                                    | Reservado para hooks futuros de **nativos** de layout; **não é usado** pela UI padrão.                                                                             | `nil`                                                              |
| **`instructionsScreen`**         | `CafDocumentDetectorInstructionsScreen`      | Pré-captura **as instruções** (título, mensagem, passos, botão, imagem de cabeçalho). Mapeia para **captura** campos de `CafInstructionsConfiguration`.            | Veja a seção aninhada                                              |
| **`captureScreen`**              | `CafDocumentDetectorCaptureScreen`           | **Durante a captura**: botão de fechar, cores da moldura (neutra / erro / sucesso), nome da fonte. Mapeia para `CafDocumentDetectorLayout`.                        | Veja a seção aninhada                                              |
| **`as configurações de upload`** | `CafUploadSettings`                          | Se os uploads são executados, compressão, formatos, tamanho máximo.                                                                                                | **`enable: false`** (padrão da UI do Certta; alinhado com Android) |
| **`showPreview`**                | `Bool`                                       | Mostra **prévia pós-captura** antes de continuar.                                                                                                                  | **`true`**                                                         |
| **`requestTimeout`**             | `Int`                                        | Tempo limite da requisição em **segundos** (HTTP).                                                                                                                 | **`60`**                                                           |
| **`showPopup`**                  | `Bool`                                       | Mostra **popup de pré-captura** (portão de instruções).                                                                                                            | **`true`**                                                         |
| **`maxRetryAttempts`**           | `Int`                                        | Máx **as tentativas** quando a captura/validação falhar.                                                                                                           | **`2`**                                                            |
| **`customização`**               | `CerttaDocumentDetectorCustomization`        | Wrapper para **`[CafDDCustomization]`** (texto do pop-up de upload, strings de pré-visualização, mensagens de progresso do upload, foto com falha).                | Customizações vazias                                               |

#### `CafDocumentDetectorDocumentSelectionScreen`

| Propriedade                      | Tipo                            | O que faz                                                                 |
| -------------------------------- | ------------------------------- | ------------------------------------------------------------------------- |
| **`título`**                     | `String?`                       | Título principal da tela do tipo de documento.                            |
| **`subtítulo`**                  | `String?`                       | Subtítulo / descrição abaixo do título.                                   |
| **`titlesByDocumentKind`**       | `[CafDocumentTypeKey: String]?` | Substituir rótulo por **lógico** grupo de documento (ex.: `.rg`, `.cnh`). |
| **`descriptionsByDocumentKind`** | `[CafDocumentTypeKey: String]?` | Substituir texto secundário por grupo.                                    |

**`CafDocumentTypeKey`**: `rg`, `rgDigital` (`rg_digital`), `cnh`, `cnhDigital` (`cnh_digital`), `crlv`, `rne`, `ctps`, `passport`, `any`.

#### `CafDocumentDetectorInstructionsScreen`

| Propriedade              | Tipo        | O que faz                                | Padrão |
| ------------------------ | ----------- | ---------------------------------------- | ------ |
| **`ativado`**            | `Bool`      | Ative ou desative a etapa de instruções. | `true` |
| **`título`**             | `String?`   | Título da visualização de instruções.    | `nil`  |
| **`message`**            | `String?`   | Texto do corpo (ex.: como escanear).     | `nil`  |
| **`etapas`**             | `[String]?` | Linhas de tópicos / etapas.              | `nil`  |
| **`primaryButtonTitle`** | `String?`   | CTA principal (ex.: “Continuar”).        | `nil`  |
| **`headerImage`**        | `UIImage?`  | Imagem opcional acima do texto.          | `nil`  |

#### `CafDocumentDetectorCaptureScreen`

Controles **captura ao vivo** chrome (sobreposição, controle de fechar, cores da moldura, tipografia).

| Propriedade                              | Tipo                  | O que faz                                                                 | Padrão        |
| ---------------------------------------- | --------------------- | ------------------------------------------------------------------------- | ------------- |
| **`closeButtonImage`**                   | `UIImage?`            | Personalizado **fechar** ícone.                                           | `nil`         |
| **`closeButtonSize`**                    | `CGFloat?`            | Área de toque / tamanho do ícone.                                         | `nil`         |
| **`closeButtonTintColor`**               | `UIColor?`            | Tom para o controle de fechar.                                            | `nil`         |
| **`closeButtonContentMode`**             | `UIView.ContentMode?` | Como a imagem é redimensionada.                                           | `nil`         |
| **`documentFrameNeutralColor`**          | `UIColor`             | Cor da moldura **antes** do retorno de validação.                         | **`.black`**  |
| **`documentFrameValidationFailedColor`** | `UIColor`             | Moldura quando a validação **falha**.                                     | **`#E21B45`** |
| **`documentFrameValidationPassedColor`** | `UIColor`             | Moldura quando a validação **passa**.                                     | **`#0BAA43`** |
| **`fontName`**                           | `String?`             | Fonte personalizada **nome PostScript** para a cópia do DD onde aplicada. | `nil`         |

#### `CerttaDocumentDetectorCustomization`

| Propriedade            | Tipo                   | O que faz                                                                                                                                                                      |
| ---------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **`ddCustomizations`** | `[CafDDCustomization]` | Array de **`CafDDUploadCustomization`**, **`CafPreviewCustomization`**, **`CafUploadMessagesCustomization`**, **`CafFailedPhotoCustomization`** (veja as customizações do DD). |

***

### `CerttaDocumentDetectorConfiguration` (parâmetros)

Usado com **`CerttaDocumentDetector.shared.open(from:configuration:)`**.

#### Recomendado: `init(flow:ui:enableMultiLanguage:)`

| Entrada                   | Função                                                                                  |
| ------------------------- | --------------------------------------------------------------------------------------- |
| **`o fluxo`**             | **`[CafDocumentDetectorStep]`** — necessário para uma sessão real (ordem das capturas). |
| **`ui`**                  | **`CerttaDocumentDetectorUIConfiguration`** — toda a interface descrita acima.          |
| **`enableMultiLanguage`** | Propaga para o runtime (`enableMultiLanguage`). Padrão **`true`**.                      |

#### Legado: `init(flow:layout:uploadSettings:instructionsConfig:requestTimeout:showPreCapturePopup:showPreview:ddCustomizations:enableMultiLanguage:selectDocumentConfig:maxRetryAttempts:)`

| Parâmetro                          | Padrão                            | O que faz                                                                                                                      |
| ---------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| **`o fluxo`**                      | `[]`                              | Etapas de captura.                                                                                                             |
| **`o layout`**                     | `CafDocumentDetectorLayout()`     | Veja Layout.                                                                                                                   |
| **`as configurações de upload`**   | `CafUploadSettings(enable: true)` | Veja Upload.                                                                                                                   |
| **`a configuração de instruções`** | `CafInstructionsConfiguration()`  | Veja Instruções.                                                                                                               |
| **`requestTimeout`**               | `60`                              | Segundos (`TimeInterval`).                                                                                                     |
| **`showPreCapturePopup`**          | `true`                            | Mesma função da UI **`showPopup`**.                                                                                            |
| **`showPreview`**                  | `false`                           | Pré-visualização pós-captura (o caminho padrão da UI geralmente é `true` por meio de `CerttaDocumentDetectorUIConfiguration`). |
| **`ddCustomizations`**             | `[]`                              | Veja as customizações do DD.                                                                                                   |
| **`enableMultiLanguage`**          | `true`                            | Pacotes / comportamento multilíngue.                                                                                           |
| **`selectDocumentConfig`**         | `nil`                             | Texto do seletor de documentos; veja Seleção.                                                                                  |
| **`maxRetryAttempts`**             | `2`                               | Limite de tentativas.                                                                                                          |

#### `init(from: CafDocumentDetectorConfig)`

Copia todos os campos sobrepostos de um **`CafDocumentDetectorConfig`**. O **hub Certta** ainda se aplica **fixos** valores para campos não presentes em **`CerttaDocumentDetectorConfiguration`** ao montar a configuração de runtime (veja o README — mapeamento do Hub).

***

### `CafDocumentDetectorConfig` (modelo completo)

Use com **`CafSDKProvider.Builder`** quando você precisar de todas as opções. Lista de propriedades (padrões de **CafSDK**):

| Propriedade                        | Tipo                           | O que faz                                                                                |
| ---------------------------------- | ------------------------------ | ---------------------------------------------------------------------------------------- |
| **`o fluxo`**                      | `[CafDocumentDetectorStep]`    | Etapas ordenadas.                                                                        |
| **`o layout`**                     | `CafDocumentDetectorLayout`    | Layout da UI de captura + cores de feedback + fonte.                                     |
| **`as configurações de upload`**   | `CafUploadSettings`            | Pipeline de upload.                                                                      |
| **`a configuração de instruções`** | `CafInstructionsConfiguration` | Conteúdo das instruções e das instruções de upload.                                      |
| **`manualCaptureEnabled`**         | `Bool?`                        | Permitir o caminho de captura manual quando suportado.                                   |
| **`manualCaptureTime`**            | `TimeInterval`                 | Tempo para captura manual.                                                               |
| **`requestTimeout`**               | `TimeInterval`                 | Tempo limite de rede (segundos).                                                         |
| **`showPopup`**                    | `Bool`                         | Pop-up de instruções antes da captura.                                                   |
| **`proxySettings`**                | `CafProxySettings?`            | Opcional **proxy reverso** para o tráfego da API.                                        |
| **`previewShow`**                  | `Bool`                         | Tela de pré-visualização pós-captura.                                                    |
| **`ddCustomizations`**             | `[CafDDCustomization]`         | Customizações de string / tela.                                                          |
| **`getUrlExpireTime`**             | `String?`                      | Tratamento de expiração de URL de imagem personalizada quando aplicável.                 |
| **`enableMultiLanguage`**          | `Bool`                         | Multilíngue.                                                                             |
| **`currentStepDoneDelay`**         | `TimeInterval`                 | Atraso **entre** etapas (segundos).                                                      |
| **`allowedPassportCountryList`**   | `[CafCountryCode]?`            | Restringir **passport** emissores (códigos no estilo ISO). `nil` = sem filtro adicional. |
| **`selectDocumentConfig`**         | `CafSelectDocumentConfig?`     | Strings da UI de seleção de documentos.                                                  |
| **`sdkType`**                      | `CafSdkPlatform`               | Tag da plataforma (ex.: **`.nativeIos`**).                                               |
| **`maxRetryAttempts`**             | `Int`                          | Máx. de tentativas por etapa.                                                            |

***

### `CafDocumentDetectorStep` & `CafDocumentStepType`

Cada etapa é um alvo de captura, opcionalmente **substituído** para rótulos e recursos.

#### `CafDocumentStepType`

| Caso                                   | Significado                                           |
| -------------------------------------- | ----------------------------------------------------- |
| **`rgFront` / `rgBack` / `rgFull`**    | Variações do documento de identidade brasileiro (RG). |
| **`cnhFront` / `cnhBack` / `cnhFull`** | Variações da CNH.                                     |
| **`crlv`**                             | CRLV.                                                 |
| **`rneFront` / `rneBack`**             | RNE.                                                  |
| **`ctpsFront` / `ctpsBack`**           | CTPS.                                                 |
| **`passport`**                         | Passaporte.                                           |
| **`any`**                              | Captura genérica / flexível.                          |

#### `CafDocumentDetectorStep` campos

| Propriedade               | Tipo                  | O que faz                                                |
| ------------------------- | --------------------- | -------------------------------------------------------- |
| **`stepType`**            | `CafDocumentStepType` | Qual lado do documento capturar.                         |
| **`customStepLabel`**     | `String?`             | Substituir o título da etapa na UI.                      |
| **`customIllustration`**  | `UIImage?`            | Ilustração personalizada para esta etapa.                |
| **`showStepLabel`**       | `Bool`                | Mostrar ou ocultar o rótulo da etapa. Padrão **`true`**. |
| **`customMessage`**       | `String?`             | Mensagem de instrução específica da etapa.               |
| **`customOkButtonTitle`** | `String?`             | Título do botão primário para esta etapa.                |

***

### `CafDocumentDetectorLayout` & cores de feedback

#### `CafDocumentDetectorLayout`

| Propriedade / API                                                                                   | O que faz                                                                                                      |
| --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| **`closeButtonImage`**, **`closeButtonSize`**, **`closeButtonColor`**, **`closeButtonContentMode`** | Controle de fechar; use **`setCloseButton(size:color:image:contentMode:)`** para definir em uma única chamada. |
| **`feedbackColors`**                                                                                | **`CafDocumentFeedbackColors`** — cores da linha da moldura; **`setFeedbackColors(_:)`**.                      |
| **`fonte`**                                                                                         | Nome da fonte PostScript para o texto do DD aplicável. **`setFont(name:)`**.                                   |

#### `CafDocumentFeedbackColors`

| Propriedade        | Padrão    | O que faz           |
| ------------------ | --------- | ------------------- |
| **`defaultColor`** | `.black`  | Moldura neutra.     |
| **`errorColor`**   | `#E21B45` | Validação falhou.   |
| **`successColor`** | `#0BAA43` | Validação aprovada. |

***

### `CafInstructionsConfiguration`

Dividir em **captura** e **envio** conteúdo das instruções (o Document Detector usa principalmente **captura** campos).

| Propriedade                                                                                                              | Usado para DD (caminho de captura)                       |
| ------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- |
| **`ativado`**                                                                                                            | Alternador principal das instruções.                     |
| **`captureTitle`**, **`captureDescriptionText`**, **`captureSteps`**, **`captureButtonTitle`**, **`captureHeaderImage`** | Tela de instruções antes da captura.                     |
| **`uploadTitle`**, **`uploadDescriptionText`**, **`uploadSteps`**, **`uploadButtonTitle`**, **`uploadHeaderImage`**      | Instruções da fase de upload (se o seu fluxo as exibir). |

***

### `CafSelectDocumentConfig` & `CafDocumentTypeKey`

| Propriedade              | O que faz                                                          |
| ------------------------ | ------------------------------------------------------------------ |
| **`screenTitle`**        | Título da seleção de documentos.                                   |
| **`descrição`**          | Subtítulo / texto de ajuda.                                        |
| **`customTitles`**       | Mapear **`CafDocumentTypeKey` → String** para títulos por tipo.    |
| **`customDescriptions`** | Mapear **`CafDocumentTypeKey` → String** para descrições por tipo. |

***

### `CafUploadSettings` & `CafFileFormatWrapper`

#### `CafUploadSettings`

| Propriedade           | Padrão                                           | O que faz                                                                                                                        |
| --------------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| **`ativar`**          | `true` (em **`CafDocumentDetectorConfig`** init) | Ativar/desativar upload. **UI da Certta** o padrão geralmente é **`false`** por meio de `CerttaDocumentDetectorUIConfiguration`. |
| **`comprimir`**       | `true`                                           | Comprimir antes do upload.                                                                                                       |
| **`fileFormats`**     | PNG, JPEG, HEIF, PDF, HEIC                       | Permitidos **`CafFileFormatWrapper`** valores.                                                                                   |
| **`maximumFileSize`** | `10_000_000`                                     | Tamanho máximo em **bytes**.                                                                                                     |

#### `CafFileFormatWrapper`

`png`, `jpeg`, `pdf`, `heif`, `heic` — mapeia para strings UTI internamente.

***

### `CafProxySettings`

| Propriedade                | O que faz                                                          |
| -------------------------- | ------------------------------------------------------------------ |
| **`hostname`**, **`port`** | Endpoint do proxy (obrigatório em **`init(hostname:port:)`**).     |
| **`user`**, **`password`** | Autenticação opcional via **`setAuthentication(user:password:)`**. |

***

### `CafDDCustomization` tipos

Todos conformam com **`CafDDCustomization`**. Passe-os dentro de **`CerttaDocumentDetectorCustomization.ddCustomizations`** ou **`CafDocumentDetectorConfig.ddCustomizations`**. Eles são aplicados ao **DocumentDetector** builder (`setCustomStrings`).

#### `CafDDUploadCustomization`

Pop-up em torno de **envio** confirmação: **`imagem`**, **`message`**, **`uploadButton`**, **`cancelButton`**.

#### `CafPreviewCustomization`

**Pré-visualização** tela após a captura: **`título`**, **`message`**, **`okButton`**, **`tryAgainButton`**.

#### `CafUploadMessagesCustomization`

**Progresso** strings durante o upload: **`sending`**, **`verifyingIntegrity`**, **`processingData`**, **`almostDone`**, **`timeBetweenMessages`**.

#### `CafFailedPhotoCustomization`

**Captura ruim** folha: **`título`**, **`descrição`**, **`continueButton`**.

***

### Lista de permissões para passaporte (`CafCountryCode`)

**`allowedPassportCountryList`**: array de **`CafCountryCode`** (códigos no estilo ISO baseados em string, ex.: **`bra`**, **`EUA`**). Limita quais **passport** emissores são aceitos quando essa validação se aplica. **`nil`** significa que não há restrição baseada em lista.

A enumeração é grande; veja **`CafCountryCode.swift`** em **CafSDK** para a lista completa.

***

### Cores globais

O Detector de Documentos respeita **`CafColorConfiguration`** fornecido via **Certta** (**`configurar`** / **`setColorConfiguration`**) para a UI compartilhada do CAF. Veja **Cores e temas**.

***


---

# 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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.caf.io/caf-sdk/caf-sdk-pt-br/ios/getting-started-with-the-sdk-2/customizing-document-detector.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
