> 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/productos/idv-suite/flujos-and-integraciones/configuracion-tecnica-del-cliente/sdk-mobile/ios-sdk/inicializacion.md).

# Inicialización

## Qué es IDV Mobile

**IDV (Identity Verification)** es el flujo que permite verificar y autenticar la identidad de una persona mediante la captura y validación de **rasgos biométricos**.

El flujo se configura previamente en la **plataforma de Facephi** y se ejecuta en la aplicación mediante su identificador (`flowId`).

## Dependencias necesarias

A continuación se detalla el listado de dependencias de los componentes disponibles para integrar un flujo de IDV en iOS. Instala únicamente los componentes de captura que se hayan licenciado.

### Cocoapods

```sh
// CORE
pod 'FPHISDKMainComponent', '~> $VERSION'
pod 'FPHISDKTrackingComponent', '~> $VERSION'
pod 'FPHISDKStatusComponent', '~> $VERSION'
pod 'FPHISDKTokenizeComponent', '~> $VERSION'
// COMPONENTES DE CAPTURA
pod 'FPHISDKSelphIDComponent', '~> $VERSION'
pod 'FPHISDKSelphiComponent', '~> $VERSION'
pod 'FPHISDKNFCComponent', '~> $VERSION'
pod 'FPHISDKCaptureComponent', '~> $VERSION'
pod 'FPHISDKVideoRecordingComponent', '~> $VERSION'
```

Para facilitar el proceso de integración se deja evidencia de un tabla la cual hace referencia a la dependencia de cada componente:

<table><thead><tr><th>Componente</th><th width="259.15625">Dependencia</th><th>Controlador</th></tr></thead><tbody><tr><td>Selfie</td><td>FPHISDKSelphiComponent</td><td><code>SelphiController</code></td></tr><tr><td>Selfie (con funcionalidad IAD)</td><td>FPHISDKSelphiIADComponent</td><td><code>SelphiController</code></td></tr><tr><td>Documento</td><td>FPHISDKSelphIDComponent</td><td><code>SelphIDController</code></td></tr><tr><td>Videograbación</td><td>FPHISDKVideoRecordingComponent</td><td><code>VideoRecordingController</code> / <code>StopVideoRecordingController</code></td></tr><tr><td>NFC</td><td>FPHISDKNFCComponent</td><td><code>NFCController</code></td></tr></tbody></table>

### Swift Package Manager (SPM)

```sh
// CORE (OBLIGATORIOS)
git@github.com:facephi-clienters/SDK-SdkPackage-SPM.git
git@github.com:facephi-clienters/SDK-TrackingPackage-SPM.git
git@github.com:facephi-clienters/SDK-StatusPackage-SPM.git
git@github.com:facephi-clienters/SDK-TokenizePackage-SPM.git
// COMPONENTES DE CAPTURA
git@github.com:facephi-clienters/SDK-SelphidMBSDRComponent-SPM.git
git@github.com:facephi-clienters/SDK-Selphi_component-SPM.git
git@github.com:facephi-clienters/SDK-NFC_component-SPM.git
git@github.com:facephi-clienters/SDK-VideoRecording-SPM.git
```

Para facilitar el proceso de integración se deja evidencia de un tabla la cual hace referencia a la dependencia de cada componente:

<table><thead><tr><th width="178.30078125">Componente</th><th width="296.1875">Dependencia</th><th>Controlador</th></tr></thead><tbody><tr><td>Selfie</td><td>git@github.com:facephi-clienters/SDK-Selphi_component-SPM.git</td><td><code>SelphiController</code></td></tr><tr><td>Selfie (con funcionalidad IAD)</td><td>git@github.com:facephi-clienters/SDK-Selphi_IAD<em>_</em>component-SPM.git</td><td><code>SelphiController</code></td></tr><tr><td>Documento</td><td>git@github.com:facephi-clienters/SDK-SelphidMBSDRComponent-SPM.git</td><td><code>SelphIDController</code></td></tr><tr><td>Videograbación</td><td>git@github.com:facephi-clienters/SDK-VideoRecording-SPM.git</td><td><code>VideoRecordingController</code> / <code>StopVideoRecordingController</code></td></tr><tr><td>NFC</td><td>git@github.com:facephi-clienters/SDK-NFC_component-SPM.git</td><td><code>NFCController</code></td></tr></tbody></table>

El SDK cuenta con varias librerías que agregan funcionalidad.

* Status -> Permite que el SDK muestre pantallas de tutorial y diagnóstico para cada componente, mejorando la experiencia de usuario.
* Tokenize -> Algunos servicios requieren el envío de los assets tokenizados. Esta librería añade los valores tokenizados a la respuesta del componente.

## Inicializar el SDK

El SDK funciona a través de un **controlador principal (`SDKController`)**, que debe inicializarse correctamente antes de poder lanzar cualquier flujo.

Facephi proporcionará el `apiKey` de la licencia necesario para la inicialización.

Tras una inicialización correcta, la aplicación tendrá acceso a **todos los flujos configurados para ese proyecto**.

```swift
let trackingController = TrackingController(trackingError: { trackingError in
    print("TRACKING ERROR: \(trackingError)")
}, enableLocation: enableLocation, debug: debugFlag)

SDKController.shared.initSdk(
        licensingUrl: SdkConfigurationManager.LICENSING_URL,
        apiKey: SdkConfigurationManager.APIKEY_LICENSING_IDV,
        output: { sdkResult in
            if sdkResult.finishStatus == .STATUS_OK {
                self.log("Licencia automática seteada correctamente")
            } else {
                self.log("Ha ocurrido un error al intentar obtener la licencia: \(sdkResult.errorType)")
            }
        },
        trackingController: trackingController,
        tokenizeController: tokenizeController,
        statusController: statusController,
        analyticsOutput: { time, component, type, info  in
            self.log("Analytics: \(Date()) \(component) - \(type) - \(info)")
        })
```

## Lanzar un flujo de IDV <a href="#lanzamiento-de-idv" id="lanzamiento-de-idv"></a>

El flujo de IDV se lanza mediante un `FlowController`, indicando:

* El **ID del flujo** configurado en plataforma (`flowId`).
* El **ID del cliente** (`customerId`).
* El **ID de autenticación** (`authenticationId`). Solo necesario si estamos ante un flujo de autenticación.
* La lista de **controladores** que pueden participar en el proceso.

Ejemplos de controladores habituales:

* `SelphiController` → Captura facial.
* `SelphIDController` → Captura de documentos.
* `StartVideoRecordingController` / `StopVideoRecordingController` → Grabación del proceso.

```swift
public func launchFlow(viewController: UIViewController, output: @escaping (SdkFlowResult) -> Void) {
        let selphidController = SelphIDController(data: nil, output: {
            print("SelphidController output: \($0.errorType)")
        }, viewController: viewController)
        
        let selphiController = SelphiController(data: nil, output: {
            print("SelphiController output: \($0.errorType)")
        }, viewController: viewController)
        
        let startVideoRecordingController = VideoRecordingController(viewController: viewController, output: {
            print("videoRecordingController output: \($0.errorType)")
        })
        
        let stopVideoRecordingController = StopVideoRecordingController(videoRecordingController: startVideoRecordingController, output: {
            print("stopVideoRecordingController output: \($0.errorType)")
        })
        
        let controllers: [IFlowableController] =
        [selphidController, selphiController, startVideoRecordingController, stopVideoRecordingController]
        
        let flowConfigurationData = FlowConfigurationData(
            id: 340260c3-0428-41d7-91c7-13c2a122cfc3,
            controllers: controllers,
            customerId: SdkConfigurationManager.customerId,
            authenticationId: authenticationId) // Parámetro opcional
        
        let flowController = SdkConfigurationManager.offlineFlow ? FlowOfflineController(flowConfigurationData: flowConfigurationData, output: output): FlowController(flowConfigurationData: flowConfigurationData, output: output)
        self.flowController = flowController
        SDKController.shared.launch(controller: flowController)
}
```

## Consultar flujos disponibles

Si necesitas obtener los flujos disponibles antes de lanzar uno de ellos, utiliza:

```kotlin
SDKController.shared.getFlowIds()
```

La función devuelve un listado con el **identificador del flujo** y su **tipo de operación**.
