Saltar al contenido principal
Version: 2.3.X

Flow - Lanzamiento continuo

1. Introducción

Flow es una funcionalidad que conecta la sección de Design Studio de la Plataforma con el SDK y la implementación que realiza el cliente. A través de un identificador de Flow, podrá lanzar un flujo diseñado en la web, que puede contener de 1 a N pasos de los componentes existentes en el SDK.

En el apartado de Lanzamiento simplificado se detallan los pasos necesarios para la integración básica del SDK. En esta sección se añade la información para el lanzamiento de este componente.


2. Dependencias requeridas para la integración

No es necesaria ninguna dependencia extra para utilizar Flow.

Se deberán añadir las dependencias requeridas de cada componente que se quiera lanzar dentro del Flow. Si se quiere lanzar reconocimiento facial, deberá ser necesario instalar el componente de Selphi, y así sucesivamente con el resto de componentes.


3. Controladores disponibles

ControladorDescripción
FlowControllerControlador principal de Flow. Lanzamiento de flujos publicados.
FlowPreviewControllerControlador para el lanzamiento de flujos pendientes de publicar (pruebas)

3.1. Controladores de componentes con flow

ControladorDescripción
FSelphiControllerReconocimiento facial
FSelphIDControllerReconocimiento documental
FVoiceControllerCaptura de voz
FPhingersControllerCaptura de huellas
FNfcControllerLectura de NFC
FQrReaderControllerLectura de QR
FPhacturasReaderControllerCaptura de facturas
FVideoIdControllerVideo Identificación
FVideoCallControllerVideo Asistencia

4. Inicialización del SDK con flow

La función de inicialización del SDK tiene el parámetro activateFlow para gestionar su activación:

val sdkConfig = SdkConfigurationData(
...
activateFlow = true,
...
)

val result = SDKController.initSdk(sdkConfig)

5. Uso del componente

5.1 Lanzamiento de un flujo publicado

Se usará el FlowController para lanzar un flujo que el cliente tiene publicado en la plataforma:

val flowController = FlowController (
FlowConfigurationData(
id = "flowId",
controllers = listOf(FSelphiController(), FSelphIDController()),
customerId = "customerId",
))

SDKController.launch(flowController)

5.2 Lanzamiento de un flujo pendiente de publicar

Se usará el FlowPreviewController para probar un flujo que el cliente tiene pendiente de publicar en la plataforma:

val flowController = FlowPreviewController (
FlowConfigurationData(
id = "flowId",
controllers = listOf(FSelphiController(), FSelphIDController()),
customerId = "customerId",
))

SDKController.launch(flowController)

5.3 Recoger resultados en la aplicación

Los resultados de cada paso del flujo se envían directamente a la plataforma. Si en algún caso se quieren recoger en la aplicación se deberá añadir:


flowController.stateFlow.collect { flowResult ->
Napier.d("APP: FLOW STEP ID ${flowResult.step?.id}")

when (flowResult.step?.key) {
FlowKeys.EXTERNAL_STEP.name -> {
delay(DELAY_EXTERNAL_STEP)
flowController.launchNextStep()
}

FlowKeys.SELPHI_COMPONENT.name -> {
when (val sdkResult = flowResult.result) {
is SdkResult.Error -> {
Napier.d("APP: Selphi FLOW ERROR: ${sdkResult.error.getSelphiError().name}")
}

is SdkResult.Success -> {
val result = sdkResult.data.getSelphiResult()
Napier.d("APP: Selphi OK ${result.bestImage?.bitmap?.byteCount}")
}
}
}

FlowKeys.SELPHID_COMPONENT.name -> {
when (val sdkResult = flowResult.result) {
is SdkResult.Error -> {
Napier.d("APP: SelphID FLOW ERROR: ${sdkResult.error.getSelphiError().name}")
}

is SdkResult.Success -> {
val result = sdkResult.data.getSelphIDResult()
Napier.d("APP: SelphID OK ${result.documentCaptured}")
}
}
}
}

if (flowResult.flowFinish) {
Napier.d("APP: FLOW FINISH")
}
}


6. Recepción del resultado

El resultado del flow tendrá 3 campos:

  • step: Información del paso del flujo que se ha realizado. Con el valor de “key” se podrá identificar el componente ejecutado en el paso.

  • result: Resultado del paso en formato SdkResult. Más información en la sección de 6. Retorno de resultado del Android Mobile SDK.

  • flowFinish: Flag que indicará si ha terminado el proceso

6.1. Recepción de errores

En la parte del error, dentro de SdkResult.Error dispondremos flowResult.step.key para identificar que componente ha fallado y el flowResult.result.error que contiene el error que ha ocurrido.

6.2. Recepción de ejecución correcta - data

En la ejecución correcta de un flujo, se lanzarán los componentes correspondientes hasta la finalización del mismo o hasta obtener un error.

Si el resultado de un paso lanzado es SdkResult.Success, se podrá localizar, por un lado, la key que identifica al componente y por otro lado el data con el resultado del componente, como es un resultado genérico, dentro del SDK, se ha creado un conversor para cada tipo de resultado. Ej:

flowController.stateFlow.collect { flowResult ->
Napier.d("APP: FLOW STEP ID ${flowResult.step?.id}")

when (flowResult.step?.key) {
FlowKeys.EXTERNAL_STEP.name -> {
delay(DELAY_EXTERNAL_STEP)
flowController.launchNextStep()
}

FlowKeys.SELPHI_COMPONENT.name -> {
when (val sdkResult = flowResult.result) {
is SdkResult.Error -> {
Napier.d("APP: Selphi FLOW ERROR: ${sdkResult.error.getSelphiError().name}")
}

is SdkResult.Success -> {
val result = sdkResult.data.getSelphiResult()
Napier.d("APP: Selphi OK ${result.bestImage?.bitmap?.byteCount}")
}
}
}

FlowKeys.SELPHID_COMPONENT.name -> {
when (val sdkResult = flowResult.result) {
is SdkResult.Error -> {
Napier.d("APP: SelphID FLOW ERROR: ${sdkResult.error.getSelphiError().name}")
}

is SdkResult.Success -> {
val result = sdkResult.data.getSelphIDResult()
Napier.d("APP: SelphID OK ${result.documentCaptured}")
}
}
}
}

if (flowResult.flowFinish) {
Napier.d("APP: FLOW FINISH")
}
}

Tras comprobar los resultados, deberemos revisar si el flow ha finalizado o aún quedan pasos, para poder gestionar los siguientes pasos fuera del SDK.

if (flowResult.flowFinish) {
Napier.d("APP: FLOW FINISH")
}