> 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/docs.facephi-en/sdks/sdk-mobile/framework-plugins/flutter/componentes/componente-principal.md).

# Main component

The installation of the **Core** **Plugin** is mandatory, regardless of the products required for use and the use case that has been defined. It contains basic features for the operation of the SDK, as well as other cross-cutting and necessary features for auxiliary plugins.

## Dependencies <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;version>
</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'
```

## Available methods

This component contains several methods that execute different functionalities:

<table data-header-hidden><thead><tr><th width="233.64453125"></th><th></th></tr></thead><tbody><tr><td><strong>Method</strong></td><td><strong>Description</strong></td></tr><tr><td>initSession</td><td>Main controller of the component, which is responsible for validating licenses, among other things.</td></tr><tr><td>initOperation</td><td>Method responsible for generating a new operation. Its id is retrieved in the result object, data parameter.</td></tr><tr><td>getExtraData</td><td>The getExtraData method allows generating the identifiers necessary for an operation that must continue in the <em>Facephi Validation Service</em> (Backend).</td></tr><tr><td>closeSession</td><td>Before the application is destroyed, the SDK session must be closed to notify the platform of its completion.</td></tr></tbody></table>

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

Before any component can be used, the SDK session must be initialized. This initialization should be done as soon as possible, preferably at the start of the application. At the same time, once all operations with the SDK Mobile have been completed, the session must also be closed.

The current component can be initialized in two ways, depending on how you want to inject the license.

The new licensing method allows licenses to be managed transparently for the integrator. The license can be injected in two ways:

* Obtaining the license through a service via a URL and API-KEY
* Injecting the license directly as a String

In both cases, the result will be returned through a Promise, which contains an object of the class **CoreResult**.

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

## Basic configuration <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

To launch the current component, an object must be created ***CoreConfigurationInitSession*** which will be the configuration of the component controller.

The basic configuration required for it is as follows:

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

### Advanced component configuration

Below are all the fields that are part of this class.

{% content-ref url="/pages/8de20a0612fefc3ed40ba226ed4e9e4d403555a7" %}
[Init Session Configuration](/docs.facephi-en/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>

When starting a process or flow, **always** the initOperation method must be called

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

## Basic configuration <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

To launch the current component, an object must be created ***TrackingConfiguration*** which will be the configuration of the component controller.

The basic configuration required for it is as follows:

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

### Advanced component configuration

Below are all the fields that are part of this class.

{% content-ref url="/pages/927144262d70be7548c816dd23cee42db3620f0a" %}
[Init Operation Configuration](/docs.facephi-en/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>

Before the application is destroyed, the SDK session must be closed to notify the platform of its completion. For this, the following code snippet is executed:

```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>

The getExtraData method allows generating the identifiers necessary for an operation that must continue in the *Facephi Validation Service* (Backend). This situation usually occurs in cases where, once the necessary information has been obtained in the client application, that information must be sent to a specific service for subsequent validation or analysis. If the results of those processes must be tracked in the Platform, it must be able to unify the first part of the process performed on the client with the last part performed in the service, since in the end they are part of the same operation.

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

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

The IDV process launches a flow configured in the platform using its ID (flowID). To do this, two methods must be invoked: **initFlow + startFlow**.

### initFlow

In this method, the necessary configuration will be set. The ID of the flow configured in the platform (flowID) and the ID of the client (customerID). See code:

```dart
await FphiSdkmobileCore().initFlow(widgetConfigurationJSON: FlowConfiguration(
    mCustomerId: customerId,
    mFlow: "f40c098c-a878-4976-aef1-2af6bbf55148"
));
```

To configure the flow controller, a list of the controllers for the components that will participate in the process will be created, which allows them to be initialized correctly. The order in which they are defined is not important; the flow itself will indicate the order in which they will be executed. For example:

* **setSelphiFlow**: Face Capture
* **setSelphidFlow**: Document Capture

Launch code:

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

## Receiving the result <a href="#id-6-recepcion-del-resultado" id="id-6-recepcion-del-resultado"></a>

The launch of ***ALL*** the methods will return the information in CoreResult format. A correct launch can be distinguished from an incorrect one:

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

{% content-ref url="/pages/c2409d1f2884ad7ba323fd2108cc99568268a702" %}
[Core Result](/docs.facephi-en/sdks/sdk-mobile/framework-plugins/extras/core/core-resultado.md)
{% endcontent-ref %}
