EN

  |  ES

/Funcionalidades de los SDK /App push /Flutter

SDK de Flutter

guía avanzada para configurar el SDK de Flutter

Indice

1. Propiedades configurables

En esta sección encontrarás una serie de funcionalidades más avanzadas y que requieren de un desarrollo más complejo. Aconsejamos que sea un desarrollador el encargado de esta configuración.

1.1. Activar las notificaciones geolocalizadas

El SDK de indigitall puede gestionar la localización del usuario. Esto te permite usar los filtros de localización en la pantalla de enviar campaña push (Campañas>Push>Nueva campaña push>Filtros>Filtros geográficos)


Location path on console

Una vez hayamos habilitado esta funcionalidad, el usuario final tendrá que dar su consentimiento al permiso de localización y habilitar los servicios de localización de su smartphone, para que la aplicación obtenga la ubicación exacta del usuario.


Incluir el parámetro requestLocation a tu inicialización.


...

IndigitallFlutterPlugin.init({ 
    IndigitallParams.PARAM_APP_KEY: "<YOUR_APP_KEY>", 
    IndigitallParams.PARAM_SENDER_ID: "<YOUR_SENDER_ID>", 
    IndigitallParams.PARAM_REQUEST_LOCATION: true 
  }, null, null, null);

...

1.2. Asociar el dispositivo a un usuario

Puedes asociar tu propio ID a cada dispositivo. De esta forma te será más sencillo e intuitivo trabajar con nuestra herramienta. Por ejemplo:


Para realizar esta asociación entre tu ID personalizado (externalId), y el identificador que maneja indigitall (deviceId), hay que invocar el método setExternalCode:


 IndigitallFlutterPlugin.setExternalCode("YOUR_EXTERNAL_ID", (device) => {
      //DO SOMETHING
  },(error) => {
      //LOG IndigitallErrorModelModel
  });


No te preocupes por nada. Tus IDs se cifran de forma irreversible en el propio teléfono y se mandan de forma segura a nuestros servidores. Ni siquiera el equipo de indigitall puede conocer esta información.

1.3. Filtro WiFi

Si se requiere recoger la información de la WiFi del usuario, además de la configuración del panel de Indigitall, deberás añadir el parámetro wifiFilterEnabled cuando se inicialice el SDK:


IndigitallFlutterPlugin.init({
  IndigitallParams.PARAM_APP_KEY: "<YOUR_APP_KEY>",
  IndigitallParams.PARAM_SENDER_ID: "<YOUR_SENDER_ID>",
  IndigitallParams.PARAM_WIFI_FILTER_ENABLED: true
});


1.3.1 Permisos Android

Para poder obtener la información de la wifi en adroid se necesitan los siguientes permisos y servicios declarados en el manifest:


  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

  // ANDROID 12 WIFI
  <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

//Servicio WiFi
<service
    android:name="com.indigitall.android.services.WifiStatusService"
    android:permission="android.permission.BIND_JOB_SERVICE" >
</service>

<receiver android:name="com.indigitall.android.receivers.WifiWakeLockReceiver">
    <intent-filter>
        <action android:name="AlarmReceiver.Action.NETWORK_ALARM" />
    </intent-filter>
</receiver>

1.3.2 Permisos iOS

Así mismo, deberás añadir en las opciones del proyecto en Xcode, en Signing & Capabilities la opción Access WiFi Information:


Access WiFi Information


1.4. Dominio personalizado

Si eres CLIENTE ENTERPRISE tienes que añadir este parámetro en la configuración para que la SDK apunte al entorno correcto:


IndigitallFlutterPlugin.init({ 
    IndigitallParams.PARAM_APP_KEY: "YOUR_APPKEY", 
    ...
    IndigitallParams.PARAM_URL_DEVICE_API: "YOUR_DEVICE_API_DOMAIN",
    IndigitallParams.PARAM_URL_INAPP_API: "YOUR_INAPP_API_DOMAIN",
    IndigitallParams.PARAM_URL_INBOX_API: "YOUR_INBOX_API_DOMAIN",}


2. Callbacks que ofrece el SDK

Nuestro SDK ofrece diversos callbacks que te ayudan tener mayor control del flujo de ejecución y a implementar comportamientos personalizados.


IndigitallFlutterPlugin.init({
      IndigitallParams.PARAM_APP_KEY: "YOUR_APPKEY", 
      IndigitallParams.PARAM_SENDER_ID: "YOUR_SENDER_ID", 
      IndigitallParams.PARAM_REQUEST_LOCATION: true 
    }, (device)=> {
            //LOG device onIndigitallInitialized
    }, (device)  => {
                //LOG device onNewUserRegistered
    }, (error) => {
              //LOG IndigitallErrorModel
});


 2.1. SDK inicializado


El callback onIndigitallInitialized se ejecutará cuando el SDK termine de inicializarse y el dispositivo esté preparado para recibir notificaciones de indigitall.


Recibe como parámetro el objeto Device con la información asociada al dispositivo.


IndigitallFlutterPlugin.init({
        IndigitallParams.PARAM_APP_KEY: "YOUR_APPKEY", 
        IndigitallParams.PARAM_SENDER_ID: "YOUR_SENDER_ID", 
        IndigitallParams.PARAM_REQUEST_LOCATION: true 
      }, (device)=> {
            print("Device: " + device.toString());
      }, null, null);

 2.2. Nuevo dispositivo registrado

El callback onNewUserRegistered se ejecutará cuando el dispositivo ha sido registrado por primera vez, es decir, en la primera ejecución de la app tras ser instalada.


Recibe como parámetro el objeto Device con la información asociada al dispositivo.


IndigitallFlutterPlugin.init({ 
    IndigitallParams.PARAM_APP_KEY: "YOUR_APPKEY", 
    IndigitallParams.PARAM_SENDER_ID: "YOUR_SENDER_ID", 
    IndigitallParams.PARAM_REQUEST_LOCATION: true 
  }, null, (device)=> {
      print("Device: " + device.toString());
  }, null);

 2.3. Se ha producido un error

El callback de error se ejecutará sólo si se produce un error durante la inicialización del SDK.


Recibe como parámetro el modelo IndigitallErrorModel, con el código y el mensaje de error.


IndigitallFlutterPlugin.init({
    IndigitallParams.PARAM_APP_KEY: "YOUR_APPKEY", 
    IndigitallParams.PARAM_SENDER_ID: "YOUR_SENDER_ID", 
    IndigitallParams.PARAM_REQUEST_LOCATION: true 
  }, (device)=> {
      //LOG device
  }, (errorModel) => {
      print("Error: "+ errorModel.errorMessage);
  });

3. Administrar dispositivo

Esta sección describe las diferentes acciones que se podrían realizar en un dispositivo indigitall.

3.1. Habilitar / deshabilitar el dispositivo

Puedes elegir deshabilitar el dispositivo para bloquear la recepción de notificaciones. Es un método muy útil para:


Para ello, dispones de los métodos deviceEnable y deviceDisable.


Debes instanciar un onjeto DeviceCallback y pasarlo como segundo parámetro. Este callback recibirá como parámetro el objeto device que contiene toda la información asociada al dispositivo.


IndigitallFlutterPlugin.deviceEnable((device) => {
  // Do something with device in success function
}, (error) => {
  // Do something in error function
});

IndigitallFlutterPlugin.deviceDisable((device) => {
  // Do something with device in success function
}, (error) => {
  // Do something in error function
});

4. Grupos de interés

Nuestro SDK te permite clasificar a los usuarios en diferentes grupos personalizables. Esto es muy útil para:


Recuerda que primero debes definir los grupos con los que quieres trabajar en la consola de indigitall (Herramientas > Grupos de interés). Consulta nuestro manual de usuario para más info.

4.1. Listar grupos

Usa el método topicsList para obtener la lista de grupos que están configurados en tu proyecto de indigitall. El callback de este método recibe como parámetro un array de Topics, que contiene la información de todos los grupos disponibles, además de un flag que indica si el usuario está incluido en alguno de ellos.


IndigitallFlutterPlugin.topicsList((topics) => {
  // Do something with topics in success function
}, (error) => {
  // Do something in error function
});

4.2. Gestionar suscripción

Para gestionar la suscripción del dispositivo a uno o varios grupos, existen dos métodos: topicsSubscribe y topicsUnsubscribe.

Opcionalmente ambos reciben un objeto TopicsCallback como tercer parámetro, que devolverá el listado de todos los Topic del proyecto.


// topics is typeof String[]
IndigitallFlutterPlugin.topicsSubscribe(topics, (topics) => {
  // Do something with topics in success function
}, (error) => {
  // Do something in error function
});

// topics is typeof String[]
IndigitallFlutterPlugin.topicsUnsubscribe(topics, (topics) => {
  // Do something with topics in success function
}, (error) => {
  // Do something in error function
});

5. Enviar eventos personalizados

Tu app puede mandar información a los servidores de indigitall para identificar las acciones y eventos que suceden en ella. Esto te permite automatizar acciones de retargeting.


Para registrar estos eventos hay que llamar al método sendCustomEvent, pasando como parámetro un ID descriptivo (puedes inventarte el que más te guste) y añadir los datos que necesites en un objeto JSON.


IndigitallFlutterPlugin.sendCustomEvent({
  IndigitallParams.PARAM_EVENT: "YOUR_CUSTOM_EVENT", 
  IndigitallParams.PARAM_CUSTOM_DATA:{}, () => {
    // Do something in success function
},(error) => {
    // Do something in error function
});

6. Mensajes In-App

Si quieres integrar los mensajes In-App en tu aplicación, puedes hacerlo con varios formatos complementarios:

6.1. Formato banner

A continuación te contamos como instanciar uno o varios mensajes In-App en formato banner.

Recuerda que primero deberías tenerlos definidos en la consola de indigitall. Consulta nuestro manual de usuario para más info.

6.1.1. Un único banner

Crea un Container, su tamaño debe coincidir con el que hayas definido en la consola de indigitall (Herramientas > Esquemas In-App/In-Web).


Container container = new Container(width: WIDTH, height: HEIGHT);



Una vez que se haya creado el código para mostrar la InApp, hay que instanciarla y llamarla en el método showInApp que podemos ver más abajo. Hay que pasarle como parámetros el código de la InApp, el id del Container anterior, el mismo container creado anteriormente y el callback oportuno para obtener la vista y el código. Este callback nos indicará si se ha cargado correctamente o no y en relación a este resultado haremos una acción u otra.


Un ejemplo de código está aquí

IndigitallFlutterPlugin.showInApp(IndigitallParams.PARAM_INAPP_CODE: 'YOUR_INAPP_CODE', (inApp, container) => {
 //DO SOMETHING
}, (error) => {
// Log error message
});

6.1.2. Múltiples banner

Si queremos tener varias InApp se tiene que realizar el paso anterior por cada componente que se quiera mostrar.

6.2. Formato PopUp

A continuación te contamos como instanciar un mensaje In-App en formato popup.

Recuerda que primero deberías tenerlo definido en la consola de indigitall. Consulta nuestro manual de usuario para más info.


  IndigitallFlutterPlugin.showPopUp(IndigitallParams.PARAM_INAPP_POPUP_CODE: 'YOUR_INAPP_CODE', (inAppCode) => {
     //DO SOMETHING
  }, (error) => {
    // Log error message
  });


Si quieres personalizar el icono de cerrar el Popup, puedes hacerlo con el siguiente método al que le podrás pasar nombre de la imagen o icono que debes adjuntar en las versiones nativas. En el caso de android en la carpeta drawable y en el caso de iOS en assets, si quisieras usar nuestro icono, bastaría con pasar un null. El parámetro closeIconDisabled es por si no quieres mostrar ningún icono, definiendo éste a true para ocultarlo o false para mostrarlo.


  InApIndigitallFlutterPluginp.showPopUp(
    {
      IndigitallParams.PARAM_INAPP_POPUP_CODE: 'YOUR_INAPP_CODE',
      IndigitallParams.PARAM_CLOSE_BUTTON: false,
      IndigitallParams.PARAM_CLOSE_ICON_DISABLED: 'YOUR_ICON_BUTTON_NAME'
    },
    (inApp) => {
      //DO SOMETHING
    },
    (error) => {
      //DO SOMETHING
    }
  );


7. Recogida de los datos de la push

En el caso de que quisieras obtener el objeto push de tipo json para realizar comprobaciones y/o cuando el usuario haga click en la notificación y sea con la acción de abrir app.

Te dejamos este código que ayudará a su obtención:

7.1. Android

Para Android, con llamar al siguiente método y una vez que se pulse en la notificación se recibirá el objeto push con la información correspondiente:


IndigitallFlutterPlugin.getPush(push => {
    //DO SOMETHING
    },(error) => {
      // Do something in error function
    });


7.2. iOS

Para el caso de iOS, hay que importar la librería Indigitall y añadir los siguientes métodos en el AppDelegate de la aplicación:


import Indigitall

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    Indigitall.handle(with: response ,withCompletionHandler: { (push, action) in
        print("Push object:", push)
        print("Push action app:", action.app)
    })
}

//@DEPRECATED
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("Push notification received: \(userInfo)")
    let data = userInfo["data"]
    let push = INPush(data as! NSMutableDictionary)
    print("Push object : \(push)")

#import <Indigitall/Indigitall.h>

- (void) userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler{
    [Indigitall handleWithResponse:response withCompletionHandler:^(INPush * _Nonnull push, INPushAction * _Nonnull action) {
        NSLog(@"Push object: %@", push);
        NSLog(@"Push object app: %@", action.app);
    }];
}

//@DEPRECATED
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{
    NSLog(@"Push notification received: %@", userInfo);
    NSMutableDictionary *data = userInfo[@"data"];
    INPush *push = [[INPush alloc]init:data];
    NSLog(@"Push object: %@",push);
}

8. Inbox

8.1. Configuración Inbox

En esta sección encontrarás una serie de funcionalidades más avanzadas y que requieren de un desarrollo más complejo. Aconsejamos que sea un desarrollador el encargado de esta configuración.


8.1.1. Identificación de usuarios

Para poder obtener las notificaciones del Inbox de Indigitall, el usuario debe identificarse. Primero hay que inicializar la SDK de Indigitall para que genere nuestro identificador (deviceId) y poder asociarlo al ID personalizado que asocies a dispositivo, similar a como se explica aquí.


Para realizar las tareas de registro, se usan estos dos métodos:


//Identificación de usuario
IndigitallFlutterPlugin.logIn("YOUR_ID",(device) => {
      //DO SOMETHING  
  }, (error) => {
      //LOG IndigitallErrorModel 
  });

IndigitallFlutterPlugin.logOut(device => {
      //DO SOMETHING  
  }, (error) => {
      //LOG IndigitallErrorModel 
  });

8.1.2. Generar token de autentificación

En esta sección verás cómo se genera un token de validación para una aplicación que tenga configurado una autentificación con webhook. Para generar dicho token, se necesita añadir el JSON con la configuración.

Para ello, tendrás que añadir en cada llamada del Inbox un Map con la correspondiente configuración.

8.2. Funcionalidades principales del Inbox

Una vez hecho el registro del dispositivo correctamente, se puede empezar a realizar las peticiones del Inbox. Hay que tener en cuenta las siguientes características del Inbox, que opcionalmente son configurables.

8.2.1. Propiedades del Inbox

Las notificaciones del Inbox tendrán los siguiente estados de la clase InboxStatus:



Cada notificación vendrá asignada con un sendingId entero y único, para poder diferenciarlos y usarlos para algunas de las funcionalidades.

8.2.2. Obtener las notificaciones

Como se ha explicado anteriormente, para obtener las notificaciones se usa el siguiente método:


IndigitallFlutterPlugin.getInbox({"YOUR_AUTH_CONFIG_MAP:IF_NEED"}, (inbox) => {
    //DO SOMETHING
},(error) => {
    //LOG IndigitallErrorModel
});
8.2.2.1 Siguiente página

Una vez iniciado y lanzado la petición de Inbox, podemos pedir la siguiente página, que se realizada con el siguiente método:


IndigitallFlutterPlugin.getNextPage({"YOUR_AUTH_CONFIG_MAP_IF_NEED"}, (inbox) => {
         //DO SOMETHING
    },(error) => {
         //LOG IndigitallErrorModel
    });


Ten en cuenta que el callback del Inbox a parte de devolver el Inbox actualizado, devuelve un array que se llama newNotifications, en el que se irán las nuevas notificaciones que añadir al Inbox, para que, en caso de ser necesario, poder utilizar dicho array para moverte entre las páginas sin depender de las llamadas al Inbox.

8.2.3. Obtener la información de una notificación

Para obtener la información de una notificación en particular, hay que hacer la siguiente llamada con el sendingId de cada notificación:


IndigitallFlutterPlugin.getInfoFromNotificationWithSendingId({"YOUR_AUTH_CONFIG_MAP_IF_NEED"}, {IndigitallParams.PARAM_SENDING_ID:SENDING_ID}, (inboxNotification) => {
        //DO SOMETHING
},(error) => {
        //LOG IndigitallErrorModel
});

8.2.4. Editar el estado de una o más notificaciones

Para editar el estado de una o más notificaciones a la vez, se realiza con el siguiente método en el que se deben indicar los sendingIds de las notificaciones a editar y el estado al que se quiere cambiar:

//Modificar una notificación
IndigitallFlutterPlugin.modifyStatusFromNotificationWithSendingId({"YOUR_AUTH_CONFIG_MAP_IF_NEED"}, {
    IndigitallParams.PARAM_SENDING_ID:SENDING_ID, 
    IndigitallParams.PARAM_STATUS:STATUS
  }, (inboxNotification) => {
    //DO SOMETHING  
},(error) => {
    //LOG IndigitallErrorModel
});

//Modificar masivamente
IndigitallFlutterPlugin.massiveEditNotificationsWithSendingIdsList({"YOUR_AUTH_CONFIG_MAP_IF_NEED"}, {
    IndigitallParams.PARAM_SENDING_ID_LIST:[SENDING_IDS],
    IndigitallParams.PARAM_STATUS:STATUS
  }, () => {
    //DO SOMETHING
},(error) => {
    //LOG IndigitallErrorModel
});

8.2.5. Contadores de estado de las notificaciones

Para saber el número de notificaciones que hay en el Inbox según su estado, se reliza este método:

IndigitallFlutterPlugin.getMessageCount({"YOUR_AUTH_CONFIG_MAP_IF_NEED"}, (counters) => {
    //DO SOMETHING
},(error) => {
    //LOG IndigitallErrorModel
});

9. Firebase Utils

Si tienes instalado el plugin de Firebase debes agregar este código para asegurar que las notificaciones enviadas desde indigitall, se reciban y se muestren.


En los callbacks de Firebase, donde recibes un RemoteMessage, si la notificación proviene de indigitall, las siguientes líneas de código harán que se pinte.



FirebaseMessaging.onMessage.listen((event) {
  IndigitallFlutterPlugin.isIndigitallPushNotification(event.data, (isIndigitallPush) => {
    if (!isIndigitallPush) {
      //DO SOMETHING 
    }
  });

10. Changelog

[0.4.0] - 10/2021

Añadido

[0.3.0] - 10/2021

Añadido

[0.2.3] - 10/2021

Correcciones

[0.2.2] - 10/2021

Correcciones

[0.2.1] - 10/2021

Correcciones

[0.2.0] - 10/2021

Añadido

[0.1.3] - 09/2021

Correcciones

[0.1.2] - 09/2021

Correcciones

[0.1.1] - 09/2021

Correcciones

[0.1.0] - 08/2021

Añadido