Skip to main content

Flutter

Nuestro SDK nativo de Workflows para Flutter permite una experiencia rápida y fluida para tus usuarios, aprovechando las capacidades nativas de los dispositivos sin requerir un navegador web para funcionar. Distribuido de forma privada a través de OnePub, este SDK se instala como un package de Flutter y te permite ejecutar workflows, obtener información detallada del proceso y recibir eventos en tiempo real durante su ejecución.


Requisitos​

Para poder utilizar nuestro SDK de Flutter, debes cumplir con los siguientes requisitos:

  • Tener una cuenta en OnePub, ya que el SDK se distribuye en un host privado.
  • Contar con un Workflow creado a través de nuestra API de Workflows.
  • Tener instalado el SDK de Flutter (versión mínima >=3.3.0) y Dart (versión >=3.0.0 <4.0.0).
  • Tener instalado el CLI de OnePub en tu máquina.

Instalación​

Configuración del CLI de OnePub​

Para instalar nuestro SDK de Flutter, primero debes activar el CLI de OnePub. Ejecuta los siguientes comandos en la terminal:

flutter pub global activate onepub
onepub login

Nota: Se requiere un correo electrónico para recibir la invitación y tener acceso al paquete de workflows. Deberás iniciar sesión con tu cuenta de OnePub para poder instalar y actualizar el SDK.

Agregar la dependencia en tu proyecto​

Dentro del archivo pubspec.yaml de tu proyecto Flutter, agrega la dependencia del SDK:

dependencies:
workflows_flutter:
hosted: https://onepub.dev/api/jvaxpsdavu
version: ^1.24.0

Uso del SDK​

Una vez instalado el SDK, impórtalo en tu proyecto:

import 'package:workflows_flutter/workflows_flutter.dart';

Verificación de Licencia​

Antes de iniciar un workflow, debes verificar la licencia del SDK:

verifyWorkflowsLicense(cert: certificadoEnBytes, passphrase: certificadoEnBytes);

La función verifyWorkflowsLicense recibe los parámetros cert y passphrase como Uint8List.

danger

Las credenciales de licencia (cert y passphrase) serán compartidas de forma privada por tu administrador de cuenta.

danger

Por seguridad, no recomendamos almacenar el archivo de licencia ni la passphrase directamente en el bundle, assets o código fuente de la aplicación.

Se recomienda obtener estas credenciales desde una API segura o almacenarlas utilizando mecanismos de almacenamiento seguro del dispositivo, como Android Keystore y iOS Keychain.

Inicialización y Ejecución de un Workflow​

Utiliza el widget WorkflowsRenderer para inicializar y ejecutar un workflow. Este widget se encarga de lanzar el proceso, gestionar la interfaz y notificarte sobre los eventos que se producen durante la ejecución.

return WorkflowsRenderer(
workflowId: "YOUR_WORKFLOW_ID", // El ID del workflow creado previamente
workflowCustomization: WorkflowCustomization(
theme: WorkflowTheme(
primaryColor: "#468499",
secondaryColor: "#994684",
buttonPrimaryColor: "#468499",
buttonSecondaryColor: "#994684",
buttonTextPrimaryColor: "#FFFFFF",
buttonTextSecondaryColor: "#849946",
backgroundColor: "#c5f2cd",
facetecOverlayColor: "#ffd700",
showHeaderLogo: true,
),
textLocalization: TextLocalization(
localization: (Platform.isAndroid) ? "localizable.xml" : "Localizable.strings",
),
textFont: TextFont(
headerFont: (Platform.isAndroid) ? "montserrat_black.ttf" : "Montserrat-Black.ttf",
bodyFont: (Platform.isAndroid) ? "montserrat_regular.ttf" : "Montserrat-Regular.ttf",
buttonFont: (Platform.isAndroid) ? "playwrite_ar_regular.ttf" : "PlaywriteAR-Regular.ttf",
),
images: Images(
logo: "logo.png",
cameraPermissions: "camara.png",
uploadFaceScan: "facetec_upload.png",
uploadFaceSuccess: "facetec_success.png",
uploadFaceError: "facetec_error.png",
photoMathId: "photo_match_id_image.png",
photoMathIdBack: "photo_match_id_back_image.png",
cameraActiveTorch: "facetec_active.png",
cameraInactiveTorch: "facetec_inactive.png",
fingerPrint: "facetec_active.png",
successPage: "success_image.svg",
errorPage: "error_image.svg",
unavailablePage: "unavailable_image.svg",
locationPage: "location_image.svg",
biometricSignPage: "enroll_fingerprint_image.svg",
enrollFingerprintPage: "enroll_fingerprint_image.svg",
enrollBasicPage: "id_scan_image.svg",
enrollFullPage: "id_scan_image.svg",
authPage: "id_scan_image.svg",
livenessPage: "id_scan_image.svg",
faceEnrollment3dPage: "id_scan_image.svg",
),
),
onStart: (workflowResult) {
print("onStart ${workflowResult.success}");
print("onStart ${workflowResult.error}");
},
onStepEvent: (step) {
print("onStepEvent ${step.status}");
},
onWorkflowEvent: (workflow) {
print("onWorkflowEvent ${workflow.status}");
},
);

Archivos de localización​

Los textos del SDK pueden ser personalizados utilizando los archivos base de localización.

Descargas oficiales:

Importante: Asegúrate de completar correctamente los parámetros (workflowId, etc.) según los datos de tu proyecto.


Configuración Específica para Android​

Requisitos de SDK de Android​

  • API mínima: 29
  • API máxima: 36
  • API de compilación y destino: 36

Configuración del build.gradle (app)​

Dentro del archivo android/app/build.gradle, realiza los siguientes ajustes:

1. Agregar repositorio Maven​

Versión build.gradle (Groovy):

android {
// ...

repositories {
maven {
url "https://us-central1-maven.pkg.dev/gendra-services/workflows-mobile"
credentials {
username = "_json_key"
password = file("tu_archivo_credenciales.json").text
}
}
}
}

Versión build.gradle.kts (Kotlin DSL):

android {
// ...

repositories {
maven {
url = uri("https://us-central1-maven.pkg.dev/gendra-services/workflows-mobile")
credentials {
username = "_json_key"
password = file("tu_archivo_credenciales.json").readText()
}
}
}
}
danger

El archivo de service account (JSON) es proporcionado por REM. Contacta a tu administrador de cuenta para obtenerlo.

2. Configurar versiones del SDK​

android {
compileSdkVersion 36
defaultConfig {
minSdkVersion 24
targetSdkVersion 36
}
// ...
}

3. Configuración de Release Build​

Versión build.gradle (Groovy):

android {
// ...

buildTypes {
release {
shrinkResources false
}
}

aaptOptions {
noCompress "tflite", "task"
}

sourceSets {
main {
assets.srcDirs += 'src/main/assets'
}
}
}

Versión build.gradle.kts (Kotlin DSL):

android {
// ...

buildTypes {
release {
isShrinkResources = false
}
}

androidResources {
noCompress += listOf("tflite", "task")
}

sourceSets {
getByName("main") {
assets.srcDirs("src/main/assets")
}
}
}
danger

No excluyas librerías .so requeridas por el SDK usando packagingOptions o packaging.jniLibs.

Por ejemplo, NO debes usar:

packagingOptions {
exclude 'lib/arm64-v8a/libPhoenixAndroid.so'
}

El SDK depende de librerías nativas como:

lib/arm64-v8a/libPhoenixAndroid.so

Si se excluyen, la aplicación puede compilar pero fallará en ejecución, especialmente en la inicialización de biometría.

Reglas para ProGuard​

Agrega las siguientes reglas en el archivo proguard-rules.pro:

#Keep workflows flutter plugin classes
-keep class tools.rem.workflows_flutter_plugin.** { *; }

#Keep the mediapipe classes
-keep public class com.google.mediapipe.framework.Graph.** { *; }
-keep interface com.google.common.** { *; }
-keep class * extends com.google.common.flogger.** {*;}
-keep class com.google.common.** { *; }
-keep class com.google.common.flogger.** { *; }
-keep class com.google.mediapipe.tasks.** { *; }
-keep class com.google.mediapipe.tasks.vision.** { *; }
-keep class com.google.mediapipe.tasks.core.** { *; }
-keep class com.google.mediapipe.framework.ProtoUtil$* { *; }
-keep class com.google.mediapipe.framework.** { *; }
-keep class com.google.mediapipe.framework.image.** { *; }
-keep class com.google.mediapipe.** { *; }
-keep class com.google.mediapipe.proto.** { *; }
-keep class javax.lang.model.** { *; }
-keep class com.google.mediapipe.solutioncore.** { *; }
-keep class com.google.protobuf.** { *; }
-keep class org.tensorflow.lite.** { *; }
-dontwarn com.google.mediapipe.proto.CalculatorProfileProto$CalculatorProfile
-dontwarn com.google.mediapipe.proto.GraphTemplateProto$CalculatorGraphTemplate
-dontwarn org.tensorflow.lite.**
-dontwarn javax.annotation.**
-dontwarn javax.lang.model.**
-keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite.** { *; }
-keepclassmembers class com.google.mediapipe.**$$ExternalSyntheticLambda* { *; }
-keepattributes InnerClasses,EnclosingMethod,Signature,*Annotation*

#Keep the okhttp3 classes
-keep class okhttp3.** { *; }
-keep class okio.** { *; }

#Keep the gson classes
-keep class com.google.gson.** { *; }

#Keep the facetec classes
-dontwarn javax.annotation.Nullable
-dontwarn com.facetec.sdk.**
-keep,includecode,includedescriptorclasses class com.facetec.sdk.** { *; }

#Keep the cameraview classes
-keep class com.otaliastudios.cameraview.** { *; }
-dontwarn com.otaliastudios.cameraview.**

Ajuste en el AndroidManifest​

Para evitar conflictos de nombres en la aplicación, añade la siguiente línea en el elemento <application> del archivo AndroidManifest.xml:

<application
...
tools:replace="android:label">
...
</application>

Organización de Recursos Personalizados​

Coloca los assets en la carpeta res de la siguiente forma:

CarpetaTipo de RecursoFormatos
drawableImágenes.png, .jpeg
fontTipografías.ttf, .otf
rawImágenes vectoriales.svg
xmlTextos localizados.xml

Configuración Específica para iOS​

Requisitos de iOS​

  • Versión mínima: iOS 13.0
  • Versión máxima soportada: iOS 26.0

Configuración del Podfile​

En el archivo ios/Podfile, establece la versión mínima en 13 y añade el pod del SDK dentro del target Runner:

platform :ios, '13.0'

target 'Runner' do
# Otras configuraciones y pods
pod 'WorkflowsPluginDebug',
:podspec => 'https://storage.googleapis.com/workflows-mobile-sdk-artifacts/WorkflowiOS/WorkflowPods/9.7.124/debug/WorkflowsPluginDebug.podspec?cache=97124',
:configurations => ['Debug']
pod 'WorkflowsPluginRelease',
:podspec => 'https://storage.googleapis.com/workflows-mobile-sdk-artifacts/WorkflowiOS/WorkflowPods/9.7.124/release/WorkflowsPluginRelease.podspec?cache=97124',
:configurations => ['Release', 'Profile']
end

Instalación de Dependencias​

Desde la carpeta ios de tu proyecto Flutter, ejecuta:

pod install

Importante: Si actualizas la versión del paquete workflows_flutter, recomendamos limpiar las dependencias de CocoaPods antes de volver a instalar.

Desde la carpeta ios, ejecuta:

rm -rf Pods
rm Podfile.lock
pod install

Esto asegura que las dependencias nativas se reinstalen correctamente y evita conflictos con versiones previamente instaladas.


Permisos en Info.plist​

Agrega las siguientes entradas en el archivo Info.plist para solicitar permisos:

<key>NSCameraUsageDescription</key>
<string>3D Liveness Detection by FaceTec.</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need access to your microphone to record audio.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>The example App requires access to the device's location.</string>

Organización de Recursos en iOS​

Para usar recursos personalizados, agrégalos directamente a la carpeta del proyecto:

Tipo de RecursoFormatoUbicación
Textos.stringsCarpeta del proyecto
Imágenes SVG.svgCarpeta del proyecto
Tipografías.otf, .ttfCarpeta del proyecto
Imágenes PNG/JPG.png, .jpgAsset Catalog

FAQ​

¿Cómo obtengo el workflowId?​

El workflowId se obtiene al crear un Workflow mediante nuestra API de Workflows. La respuesta de la API te proporcionará este identificador.

¿Cómo obtengo las credenciales de licencia?​

Las credenciales de licencia (cert y passphrase) para la función verifyWorkflowsLicense serán compartidas de forma privada por tu administrador de cuenta.

rem

JOIN US ON

facebooktwitterLinkedIn
CONTACThello@rem.tools55-91-03-80-54
© Copyright rem 2022 All rights reserved.