> 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/flutter/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>

### Flutter:

<pre class="language-swift"><code class="lang-swift">dependencies:
  fphi_sdkmobile_core:
<strong>    hosted:
</strong>      name: fphi_sdkmobile_core
      url: https://facephicorp.jfrog.io/artifactory/api/pub/pub-pro-fphi/
    version: ^&#x3C;versión>
</code></pre>

### 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>initSession</td><td>Controlador principal del componente, que se encarga de validar las licencias entre otras cosas.</td></tr><tr><td>initOperation</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>getExtraData</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>closeSession</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>

### initSession <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:

* Obteniendo la licencia a través de un servicio mediante una URL y API-KEY
* 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**.

```dart
@override
Future<Map> initSession({ required CoreConfigurationInitSession widgetConfigurationJSON }) async {
  final Map res = await methodChannel.invokeMethod('initSession', {"widgetConfigurationJSON": widgetConfigurationJSON.toJson()});
  return res;
}
```

## 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 ***CoreConfigurationInitSession*** que será la configuración del controlador del componente.

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

```dart
class CoreConfigurationInitSession
{
  String mLicenseUrl;
  String mLicenseApiKey;
  String mLicense;
  String? mLocale;
  bool? mEnableTracking;
  bool? mEnableDebugMode;
  dynamic mInternalOptions
}
```

### 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 %}

***

### initOperation <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 initOperation

```dart
@override
Future<Map> initOperation({ required TrackingConfiguration widgetConfigurationJSON }) async {
  final Map res = await methodChannel.invokeMethod('initOperation', {"widgetConfigurationJSON": widgetConfigurationJSON.toJson()});
  return res;
}
```

## 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 ***TrackingConfiguration*** que será la configuración del controlador del componente.

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

```dart
class TrackingConfiguration
{
  TrackingOperationType mType;
  String mCustomerId;
}
```

### 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 %}

***

### closeSession <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:

```dart
@override
Future<Map> closeSession() async {
  final Map res = await methodChannel.invokeMethod('closeSession', {});
  return res;
}
```

***

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

```dart
@override
Future<Map> getExtraData() async {
  final Map res = await methodChannel.invokeMethod('getExtraData', {});
  return res;
}
```

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

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

### initFlow

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 FphiSdkmobileCore().initFlow(widgetConfigurationJSON: FlowConfiguration(
    mCustomerId: customerId,
    mFlow: "f40c098c-a878-4976-aef1-2af6bbf55148"
));
```

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:

<pre class="language-dart"><code class="lang-dart">// Si initFlow retorna STATUS_OK. Llamo a los flujos, invocando uno a uno los controladores
CoreWidget().initFlow().then((r) async
{
  r.map((r) async
  {
    if (r.finishStatus == SdkFinishStatus.STATUS_OK).
    {
      /* Se llamarán tantos métodos de seteos del flow's como flujos se usen */
      /* En el ejemplo un flow típico de onboarding */
      await SelphiFaceWidget().setSelphiFlow().then((value) {
        if (kDebugMode) {
          print(value);
        }
      });
      await SelphIDWidget().setSelphidFlow().then((value) {
        if (kDebugMode) {
          print(value);
        }
      });
      
      /* Al final de agregar los flujos, se lanza el startFlow(Siempre que los métodos anteriores no fallen) */
      await CoreWidget().startFlow().then((value)
      {
        if (kDebugMode) {
          print(value);
        }
      }).onError((error, stackTrace) {
        if (kDebugMode) {
          print(error);
        }
      });
    }
  });
}).onError((error, stackTrace) {
  if (kDebugMode) {
    print(error);
  }
});

/* Los resultados se escuchan implementando un BasicMessage, con el key 'core.flow' */
const channel = BasicMessageChannel&#x3C;dynamic>('core.flow', StringCodec());
channel.setMessageHandler((message) async
{
  if (jsonDecode(message!)['flow'] == "SELPHID")
  {
    if (kDebugMode) {
      print(SelphIDResult.fromMap(jsonDecode(message)));
    }
  }
  else if (jsonDecode(message!)['flow'] == "SELPHI")
  {
    if (kDebugMode) {
      print(SelphiFaceResult.fromMap(jsonDecode(message)));
    }
  }
  else
  {
    if (kDebugMode) {
      print(jsonDecode(message));
    }
  }
  return '';
<strong>});
</strong></code></pre>

## 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:

```dart
class CoreResult {
  final SdkFinishStatus finishStatus;
  final String finishStatusDescription;
  final String errorDiagnostic;
  final String? errorMessage;
  final String? data;
}
```

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