> 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/sdks/sdk-mobile/ios-sdk/inicializacion/integracion-idv-mobile.md).

# Integración IDV Mobile

## 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'
// COMPONENTES DE CAPTURA
pod 'FPHISDKSelphIDComponent', '~> $VERSION'
pod 'FPHISDKSelphiComponent', '~> $VERSION'
pod 'FPHISDKNFCComponent', '~> $VERSION'
pod 'FPHISDKCaptureComponent', '~> $VERSION'
pod 'FPHISDKVideoRecordingComponent', '~> $VERSION'
```

### Swift Package Manager (SPM)

```sh
// CORE
git@github.com:facephi-clienters/SDK-SdkPackage-SPM.git
git@github.com:facephi-clienters/SDK-TrackingPackage-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
git@github.com:facephi-clienters/SDK-CapturePackage-SPM.git
```

## Dependencias opcionales

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.

### Cocoapods

```sh
pod 'FPHISDKStatusComponent', '~> $VERSION'
pod 'FPHISDKTokenizeComponent', '~> $VERSION'
```

### Swift Package Manager (SPM)

```sh
git@github.com:facephi-clienters/SDK-StatusPackage-SPM.git
git@github.com:facephi-clienters/SDK-TokenizePackage-SPM.git
```

## 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
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**.
