> 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/framework-plugins/cordova/componentes/componente-principal.md).

# Componente principal

La instalación del **Core** **Plugin** es obligatoria, independientemente de los productos que se requieran utilizar y del caso de uso que se haya definido. Contiene funcionalidades básicas para el funcionamiento de la SDK, además de otras funcionalidades transversales y necesarias para los plugins auxiliares.

## Dependencias <a href="#id-2-dependencia" id="id-2-dependencia"></a>

### Cordova:

```swift
cordova plugin add @facephi/sdk-core-cordova@<versión>
```

### Android - Gradle:

```kotlin
api "com.facephi.androidsdk:sdk:$version"
api "com.facephi.androidsdk:core:$version"
implementation "com.facephi.androidsdk:tracking_component:$version"
```

### iOS - Cocoapods:

```swift
s.dependency 'FPHISDKMainComponent', '~> $version'
s.dependency 'FPHISDKTrackingComponent', '~> $version'
s.dependency 'FPHISDKLicensingComponent', '~> $version'
s.dependency 'FPHISDKTokenizeComponent', '~> $version'
s.dependency 'FPHISDKStatusComponent', '~> $version'
```

## Métodos disponibles

Este componente contiene varios métodos que ejecutan diferentes funcionalidades:

<table data-header-hidden><thead><tr><th width="233.64453125"></th><th></th></tr></thead><tbody><tr><td><strong>Método</strong></td><td><strong>Descripción</strong></td></tr><tr><td>launchInitSession</td><td>Controlador principal del componente, que se encarga de validar las licencias entre otras cosas.</td></tr><tr><td>launchInitOperation</td><td>Método que se encarga de generar una nueva operación. El id de la misma se recupera en el objeto de resultado, parámetro data.</td></tr><tr><td>launchGetExtraData</td><td>El método getExtraData permite generar los identificadores necesarios para una operación que deba continuar en el <em>Servicio de Validaciones de Facephi</em> (Backend).</td></tr><tr><td>launchCloseSession</td><td>Antes de que la aplicación se vaya a destruir, se deberá cerrar la sesión de la SDK para así avisar a la plataforma de su finalización.</td></tr></tbody></table>

### launchInitSession <a href="#id-2-inicializacion-de-la-sesion" id="id-2-inicializacion-de-la-sesion"></a>

Antes de poder utilizar cualquier componente, se deberá inicializar la sesión de la SDK. Esta inicialización se debe hacer lo más pronto posible, preferentemente al inicio de la aplicación. Al mismo tiempo, una vez terminadas todas las operaciones con la SDK Mobile, deberá cerrarse igualmente la sesión.

Se puede inicializar el componente actual de dos formas, dependiendo de cómo desees inyectar la licencia.

El nuevo método de licenciamiento permite gestionar las licencias de forma transparente para el integrador. La licencia se puede inyectar de dos maneras:

* a. Obteniendo la licencia a través de un servicio mediante una URL y API-KEY
* b. Inyectando la licencia directamente como String

En ambos casos, el resultado se devolverá por medio de una *Promise*, la cual contiene un objeto de la clase **CoreResult**.

```javascript
exports.launchInitSession = function (cfg) {
    return new Promise((resolve, reject) => {
        var config = [];
        try {
            config = [{
                config: cfg
            }];
        } catch (e) {
            console.log(e);
        }

        exec(resolve, reject, 'SdkCore', 'launchInitSession', config);
    });
};
```

## Configuración básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lanzar el componente actual, se deberá crear un objeto ***InitSessionConfiguration*** que será la configuración del controlador del componente.

La configuración básica necesaria para es la siguiente:

```typescript
export interface InitSessionConfiguration {
    license?: string;
    licenseUrl?: string;
    licenseApiKey?: string;
    enableTracking?: boolean;
    enableFlow?: boolean;
    enableSecurityMode?: boolean;
    internalOptions?: Record<string, string>;
    locale?: string;
}
```

### Configuración avanzada del componente

A continuación se detallan todos los campos que forman parte de esta clase.

{% content-ref url="/pages/ZiEkZXjLq8M6NL0zUogw" %}
[Init Session Configuración](/sdks/sdk-mobile/framework-plugins/extras/core/init-session-configuracion.md)
{% endcontent-ref %}

***

### launchInitOperation <a href="#id-3-inicializacion-de-la-operacion" id="id-3-inicializacion-de-la-operacion"></a>

Al iniciar un proceso o flujo, **siempre** se deberá realizar la llamada al método *launchInitOperation*

```javascript
exports.launchInitOperation = function (cfg) {
    return new Promise((resolve, reject) => {
        var config = [];
        try {
            config = [{
                config: cfg
            }];
        } catch (e) {
            console.log(e);
        }

        exec(resolve, reject, 'SdkCore', 'launchInitOperation', config);
    });
};
```

## Configuración básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lanzar el componente actual, se deberá crear un objeto ***InitOperationConfiguration*** que será la configuración del controlador del componente.

La configuración básica necesaria para es la siguiente:

```typescript
export interface InitOperationConfiguration {
    type: SdkOperationType;
    steps?: string[];
    customerId: string;
}
```

### Configuración avanzada del componente

A continuación se detallan todos los campos que forman parte de esta clase.

{% content-ref url="/pages/TDD3HgSYFGVXXpt1Tp9O" %}
[Init Operation Configuración](/sdks/sdk-mobile/framework-plugins/extras/core/init-operation-configuracion.md)
{% endcontent-ref %}

***

### launchCloseSession <a href="#id-6-cierre-de-sesion" id="id-6-cierre-de-sesion"></a>

Antes de que la aplicación se vaya a destruir, se deberá cerrar la sesión de la SDK para así avisar a la plataforma de su finalización. Para ello, se ejecuta el siguiente fragmento de código:

```javascript
exports.launchCloseSession = function (cfg) {
    return new Promise((resolve, reject) => {
        var config = [];
        try {
            config = [{
                config: cfg
            }];
        } catch (e) {
            console.log(e);
        }

        exec(resolve, reject, 'SdkCore', 'launchCloseSession', config);
    });
};
```

***

### launchGetExtraData <a href="#id-7-metodo-extradata" id="id-7-metodo-extradata"></a>

El método *getExtraData* permite generar los identificadores necesarios para una operación que deba continuar en el *Servicio de Validaciones de Facephi* (Backend). Esta situación suele darse en casos en los que, una vez obtenida la información necesaria en la aplicación del cliente, se deba enviar esa información a un determinado servicio para su posterior validación o análisis. En caso de que deban trackearse los resultados de esos procesos en la Plataforma, ésta deberá ser capaz de unificar la primera parte del proceso realizada en cliente con la última realizada en el servicio, ya que al final forman parte de la misma operación.

```javascript
exports.launchGetExtraData = function () {
    return new Promise((resolve, reject) => {
        var config = [];
        try {
            config = [];
        } catch (e) {
            console.log(e);
        }

        exec(resolve, reject, 'SdkCore', 'launchGetExtraData', config);
    });
};
```

## Lanzamiento de IDV <a href="#lanzamiento-de-idv" id="lanzamiento-de-idv"></a>

El proceso de IDV permite lanzar un flujo configurado en la plataforma a partir de su ID (flowID). Para ello se necesitará invocar dos métodos: **launchInitFlow + launchStartFlow**.

### launchInitFlow

En éste método se seteará la configuración necesaria. El ID del flujo configurado en la plataforma (flowID) y el ID del cliente (customerID). Véase código:

```dart
await facephi.plugins.sdkcore.launchInitFlow({
     "customerId": "cordova@facephi.com",
     "flow": "f40c098c-a878-4976-aef1-xxxxxxx"
})
```

Para configurar el controlador de flujos, se creará un listado de los controladores de los componentes que van a participar en el proceso, lo cual permite inicializarlos correctamente. El orden en el que se definan no es importante, será el propio flujo el que indique el orden en el que se ejecutarán. Por ejemplo:

* **setSelphiFlow**: Captura facial
* **setSelphidFlow**: Captura de documentos

Código para el lanzamiento:

```javascript
/* Los resultados se escuchan implementando un listener */
setTimeout(function()
{
    if (typeof facephi.plugins.sdkcore !== "undefined")
    {
        facephi.plugins.sdkcore.startListeningTrackingEvents(
            (event) => {
                console.log('📡 startListeningTrackingEvents recibido:', event);
            },
            (err) => {
                console.error('❌ Error:', err);
            }
        );
        facephi.plugins.sdkcore.startListeningFlowEvents(
            (event) => {
                console.log('📡 startListeningFlowEvents recibido:', event);
            },
            (err) => {
                console.error('❌ Error:', err);
            }
        );
    }
}, 2000);

await facephi.plugins.sdkcore.launchInitFlow({
     "customerId": "cordova@facephi.com",
     "flow": "f40c098c-a878-4976-aef1-xxxxxxx"
 })
.then(
    async (result) =>
    {
        if (parseInt(result.finishStatus) == SdkMobileFinishStatus.Ok)
        {
            console.log("launchInitFlow result", result);
            await facephi.plugins.sdkselphid.setSelphidFlow()
            .then(
                (result) => { console.log("setSelphidFlow result", result); },
                (err) => console.log(err),
            );
            await facephi.plugins.sdkselphi.setSelphiFlow()
            .then(
                (result) => { console.log("setSelphiFlow result", result); },
                (err) => console.log(err),
            );
            await facephi.plugins.sdkselphi.setSignatureSelphiFlow()
            .then(
                (result) => { console.log("setSignatureSelphiFlow result", result); },
                (err) => console.log(err),
            );
            
            /* Al final de agregar los flujos, se lanza el launchStartFlow(Siempre que los métodos anteriores no fallen) */
            await facephi.plugins.sdkcore.launchStartFlow()
            .then(
                (result) => { console.log("launchStartFlow result", result); },
                (err) => console.log(err),
            );
        }
    },
    (err) => console.log(err),
);
```

## Recepción del resultado <a href="#id-6-recepcion-del-resultado" id="id-6-recepcion-del-resultado"></a>

El lanzamiento de ***TODOS*** los métodos devolverá la información en formato **CoreResult**. Pudiendo diferenciarse entre un lanzamiento correcto y uno incorrecto:

<pre class="language-typescript"><code class="lang-typescript"><strong>export interface CoreResult {
</strong>    finishStatus: number;
    finishStatusDescription?: string;
    errorType: string;
    errorMessage?: string;
    data?: string;
}
</code></pre>

{% content-ref url="/pages/OfulgTvj6HOIQTMcT4M1" %}
[Core Resultado](/sdks/sdk-mobile/framework-plugins/extras/core/core-resultado.md)
{% endcontent-ref %}
