> ## Documentation Index
> Fetch the complete documentation index at: https://docs-platform.services-valid.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Customização

> Personalize a aparência da UI do FaceTec v10 no iOS via LivenessFacetecSDKCustomization

A UI da captura é renderizada pelo próprio FaceTec SDK. Você consegue personalizá-la passando um `LivenessFacetecSDKCustomization` em `LivenessFacetecSDKConfig`. Cada propriedade é um espelho tipado da customização correspondente do FaceTec — quando você define um campo, ele é aplicado; quando deixa `nil`, o FaceTec usa o padrão.

## Estrutura geral

```swift theme={"theme":"catppuccin-latte"}
import LivenessFacetecSDK

var customization = LivenessFacetecSDKCustomization()

// Defina apenas o que precisar — tudo é opcional.
customization.cancelButton      = nil  // CancelButtonCustomization?
customization.feedback          = nil  // FeedbackCustomization?
customization.frame             = nil  // FrameCustomization?
customization.guidance          = nil  // GuidanceCustomization?
customization.oval              = nil  // OvalCustomization?
customization.overlay           = nil  // OverlayCustomization?
customization.resultScreen      = nil  // ResultScreenCustomization?
customization.vocalGuidance     = nil  // VocalGuidanceCustomization?
customization.orientationScreen = nil  // OrientationScreenCustomization?

let config = LivenessFacetecSDKConfig(customization: customization)

try await LivenessFacetecSDKClient.shared.initialize(config: config)
```

## Sub-customizações disponíveis

| Propriedade                                       | Tipo                              | O que controla                                                                       |
| ------------------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------ |
| `cancelButton`                                    | `CancelButtonCustomization?`      | Posição e imagem do botão de cancelar                                                |
| `feedback`                                        | `FeedbackCustomization?`          | Cores e fonte das mensagens de feedback em tela                                      |
| `frame`                                           | `FrameCustomization?`             | Borda, raio e sombra do frame                                                        |
| `guidance`                                        | `GuidanceCustomization?`          | Cores e fontes das telas de guia ("pronto" e "tente novamente")                      |
| `oval`                                            | `OvalCustomization?`              | Cor e espessura do oval de detecção e do indicador de progresso                      |
| `overlay`                                         | `OverlayCustomization?`           | Cor de fundo do overlay e imagem de branding                                         |
| `resultScreen`                                    | `ResultScreenCustomization?`      | Tela de resultado (cores, animações, barra de upload)                                |
| `vocalGuidance`                                   | `VocalGuidanceCustomization?`     | Modo de guia por voz e arquivos de som                                               |
| `orientationScreen`                               | `OrientationScreenCustomization?` | Tela exibida quando o dispositivo está em orientação não suportada                   |
| `exitAnimationSuccess` / `exitAnimationUnsuccess` | `ExitAnimationStyle?`             | Estilo da animação de saída da sessão                                                |
| `securityWatermarkImage`                          | `SecurityWatermarkImage?`         | Marca-d'água de segurança exibida durante a captura                                  |
| `strings`                                         | `[StringKey: String]?`            | Sobrescreve textos localizados da UI do FaceTec                                      |
| `featureFlags`                                    | `[String: Any]?`                  | Passthrough para feature flags da FaceTec, tipicamente fornecidas pelo suporte deles |

**Enums:**

| Enum                     | Casos                                                             |
| ------------------------ | ----------------------------------------------------------------- |
| `CancelButtonLocation`   | `.topLeft`, `.topRight`, `.disabled`, `.custom`                   |
| `VocalGuidanceMode`      | `.noVocalGuidance`, `.minimalVocalGuidance`, `.fullVocalGuidance` |
| `SecurityWatermarkImage` | `.faceTec`, `.faceTecZoom`, `.poweredBy`                          |
| `ExitAnimationStyle`     | `.none`, `.rippleOut`, `.rippleOutSlow`                           |

<Info>
  Não definir `securityWatermarkImage` (deixar `nil`) produz o watermark padrão, `.faceTec`. A FaceTec não oferece uma opção nativa de "sem watermark".
</Info>

## Temas alternativos

Todas as propriedades acima vivem, na verdade, dentro de `LivenessFacetecSDKCustomization.Theme` — as propriedades de nível superior (`customization.oval`, `customization.frame`, etc.) são atalhos para `customization.theme.oval`, `customization.theme.frame`, e assim por diante.

Isso existe porque a FaceTec permite configurar **dois temas alternativos completos**, aplicados automaticamente conforme a condição do ambiente:

| Campo            | Tipo     | Quando é aplicado                  |
| ---------------- | -------- | ---------------------------------- |
| `lowLight`       | `Theme?` | Ambientes de pouca luz             |
| `dynamicDimming` | `Theme?` | Durante o dimming dinâmico da tela |

Ambos aceitam exatamente o mesmo formato do tema padrão. Se não forem definidos, a FaceTec usa `customization.theme` também nessas condições.

```swift theme={"theme":"catppuccin-latte"}
var lowLightTheme = LivenessFacetecSDKCustomization.Theme()
var lowLightFrame = LivenessFacetecSDKCustomization.FrameCustomization()
lowLightFrame.backgroundColor = .black
lowLightTheme.frame = lowLightFrame

customization.lowLight = lowLightTheme
```

## Textos da interface

`strings: [StringKey: String]?` sobrescreve os textos localizados da interface da FaceTec. O enum `StringKey` cobre o subconjunto de chaves aplicável a um fluxo de 3D Liveness.

```swift theme={"theme":"catppuccin-latte"}
customization.strings = [
    .actionImReady: "Estou pronto",
    .resultFacescanSuccess3dEnrollmentMessage: "Verificação concluída!",
    .resultFacescanSuccess3d3dReverificationMessage: "Verificação concluída!"
]
```

<Warning>
  A FaceTec decide **no backend** se uma sessão é tratada como "Enrollment" (primeiro FaceMap do usuário) ou "3D-to-3D Reverification" (comparação com FaceMap existente) — o app iOS não sabe qual mensagem vai aparecer. Para garantir o mesmo texto de sucesso em qualquer caso, sobrescreva **as duas** chaves (`resultFacescanSuccess3dEnrollmentMessage` e `resultFacescanSuccess3d3dReverificationMessage`) com o mesmo valor.
</Warning>

## Exemplo: cores do oval e overlay sem branding

```swift theme={"theme":"catppuccin-latte"}
import LivenessFacetecSDK
import UIKit

var customization = LivenessFacetecSDKCustomization()

var oval = LivenessFacetecSDKCustomization.OvalCustomization()
oval.strokeColor    = UIColor(red: 0.72, green: 0.16, blue: 0.10, alpha: 1.0)
oval.progressColor1 = UIColor(red: 0.72, green: 0.16, blue: 0.10, alpha: 1.0)
oval.progressColor2 = UIColor(red: 0.91, green: 0.27, blue: 0.29, alpha: 1.0)
customization.oval = oval

var overlay = LivenessFacetecSDKCustomization.OverlayCustomization()
overlay.showBrandingImage = false
customization.overlay = overlay

let config = LivenessFacetecSDKConfig(customization: customization)
try await LivenessFacetecSDKClient.shared.initialize(config: config)
```

## Boas práticas

<Warning>
  Mudanças visuais profundas no fluxo do FaceTec precisam respeitar as diretrizes de marca da própria FaceTec — em especial, **a marca-d'água de segurança** (`securityWatermarkImage`) **não deve ser ocultada** sob risco de violar o contrato de uso do motor.
</Warning>

* **Mantenha contraste suficiente** entre o oval guia e o fundo para preservar a acessibilidade.
* **Evite fontes muito pequenas** em `guidance` — o FaceTec já balanceia tamanhos para legibilidade em câmeras frontais.
* **Teste em iPhones de tela compacta** (SE/Mini) — alguns elementos posicionados manualmente podem sobrepor o oval.
* **Reuse o mesmo `LivenessFacetecSDKCustomization`** entre o `initialize` e chamadas subsequentes; trocar a customização exige `stop()` seguido de um novo `initialize()`.

## Próximos passos

<CardGroup cols={2}>
  <Card title="Implementação" icon="code" iconType="regular" href="/plataforma/liveness/facetec/v10/sdk/ios/implementacao">
    Veja como passar a customização no `initialize`
  </Card>

  <Card title="Solução de problemas" icon="wrench" iconType="regular" href="/plataforma/liveness/facetec/v10/sdk/ios/troubleshooting">
    Diagnostique problemas com cores, fontes e recursos
  </Card>
</CardGroup>
