Esta web ya no recibe mantenimiento. Por favor, visita documentation.indigitall.com para leer nuestra documentación actualizada.

SDK de Android

guía avanzada para configurar el SDK de Android

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.

Añade los permisos de localización incluyendo esta línea en el archivo AndroidManifest.xml:


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


Puedes encontrar el archivo AndroidManifest.xml en la siguiente ruta:


Ruta al fichero AndroidManifest.xml

Opciones que debes tener en cuenta

Hay dos modos de gestionar los permisos de localización:

  • Manual: Es la opción por defecto y es el desarrollador el encargado de gestionar los permisos de localización.
  • Automática: Es el SDK el que gestiona los permisos de localización.


A continuación te explicamos cómo configurar los permisos de localización en modo automático.


Hay que añadir el parámetro AutoRequestPermissionLocation cuando se inicialice el SDK. Esto se hace mediante el siguiente extracto de código:


//Cuando quieres inicializar indigitall
Configuration config = new Configuration
    .Builder("<YOUR-APP-KEY>", "<YOUR-SENDER-ID>")
    .setAutoRequestPermissionLocation(true)
    .build();
Indigitall.init(context, config);


En Android hay una clase donde se recibe el estado de los permisos después de que el usuario los haya cambiado mediante la configuración. Habría que añadir el siguiente trozo de código para capturar el estado de los permisos:


//En la clase que usas para recibir los resultados de pedir los permisos
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    Indigitall.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}

1.2. Establecer la Activity por defecto

La Activity por defecto es la pantalla inicial de tu app que se lanza cuando un usuario pulsa en una notificación que no lleva deeplink. También es el punto donde debes inicializar el SDK. Se establece mediante el parámetro DefaultActivity:


//Cuando quieres iniciar indigitall
Configuration config = new Configuration
    .Builder("<YOUR-APP-KEY>", "<YOUR-SENDER-ID>")
    .setDefaultActivity("YOUR_ACTIVITY")
    .build();
Indigitall.init(context, config);

1.3. 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:

  • Si tus usuarios se han identificado, podrías usar tu ID de usuario, o el email, o cualquier otro dato con el que estés acostumbrado a trabajar.
  • Si tus usuarios son anónimos porque no se han logado en la app, quizá dispongas de un sistema de métricas tipo Google Analytics o Commscore. Podrías usar el ID proporcionado por estas herramientas.


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


//Recuerda poner aquí tu código externo
Indigitall.setExternalCode(this, "YOUR_EXTERNAL_ID", new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        //DO SOMETHING
    }
    @Override
    public void onFail() {
        //LOG ERROR
    }
});


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.4. 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 en el manifest los permisos que se exponen a continuación, el servicio correspondiente al filtro y añadir el parámetro wifiFilterEnabled cuando se inicialice el SDK:



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

//Cuando quieres iniciar indigitall
Configuration config = new Configuration
    .Builder("<YOUR-APP-KEY>", "<YOUR-SENDER-ID>")
    .wifiFilterEnabled(true)
    .build();
Indigitall.init(context, config);
  • Desde android 8.0 para obtener los datos de las WiFi, que estén añadidos al manifest los permisos de localización. Mas información aquí: Android Developers

  • Tenga en cuenta que el tiempo de escaneo de la WiFi cuando la aplicación está en segundo plano o cerrada puede ser inexacto.

1.5. Layout custom

Si por alguna razón no se desea mostrar la push como la muestra android nativo, dejamos esta opción para mostrar la push con nuestro layout custom. Para ello añade el siguiente código en la configuración antes de llamar al init:



//Cuando quieres iniciar indigitall
Configuration config = new Configuration
    .Builder("<YOUR-APP-KEY>", "<YOUR-SENDER-ID>")
    .setLayoutBasic(LayoutBasic.custom)
    .build();
Indigitall.init(context, config);
  • Recuerda que a partir de android 10, el layout custom dará problemas de visualización de las imágenes si el móvil tiene activado el modo oscuro. Si no se indica el layout custom, se mostrará en modo nativo


1.6. 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:


//Cuando quieres iniciar indigitall
Configuration config = new Configuration
    .Builder("<YOUR-APP-KEY>", "<YOUR-SENDER-ID>")
    .setUrlDeviceApi(YOUR_DEVICE_API_DOMAIN)
    .setUrlInAppApi(YOUR_INAPP_API_DOMAIN)
    .setUrlInboxApi(YOUR_INBOX_API_DOMAIN)
    .build();
Indigitall.init(context, config);


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.


Para suscribirte a estos callbacks tienes que:

  • Instanciar el objeto InitCallBack y pasarlo como tercer parámetro del método init.
  • Sobreescribir los métodos que implementa la clase InitCallBack.


Indigitall.init(context, config, new InitCallBack(context){
   @Override
    public void onIndigitallInitialized(Permission[] permissions, Device device) {}
    @Override
    public void onNewUserRegistered(Device device) {}
    @Override
    public void onErrorInitialized(String error) {}
});

 2.1. SDK inicializado

El método onIndigitallInitialized del objeto InitCallBack se ejecutará cuando el SDK termine de inicializarse y el dispositivo esté preparado para recibir notificaciones de indigitall.


Recibe como parámetro:

  • Un array de objetos Permission. El primer elemento es el estado del permiso de notificaciones. El segundo elemento es el estado del permiso de localización.
  • Un objeto Device con la información asociada al dispositivo.


A continuación te mostramos un ejemplo que imprime logs sobre el estado de los permisos y la información del dispositivo.


Indigitall.init(context,config, new InitCallBack(context){
   @Override
    public void onIndigitallInitialized(Permission[] permissions, Device device) {
        super.onIndigitallInitialized(permissions, device);
        Log.d("Push Permission: ", permissions[0].toString());
        Log.d("Location Permission: ", permissions[1].toString());
        Log.d("Device: ", device.toString());
    }
});

 2.2. Nuevo dispositivo registrado

El método onNewUserRegistered del objeto InitCallBack 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.


Indigitall.init(context, config, new InitCallBack(context){
    @Override
    public void onNewUserRegistered(Device device) {
        super.onNewUserRegistered(device);
        Log.d("Device: ", device.toString());
    }
});

 2.3. Se ha producido un error

El método onErrorInitialized del objeto InitCallBack se ejecutará sólo si se produce un error durante la inicialización del SDK.


Recibe como parámetro la descripción del error.


Indigitall.init(context, config, new InitCallBack(context) {
    @Override
    public void onErrorInitialized(String error) {
        super.onErrorInitialized(error);
        Log.d("Error on Indigitall.init: ", error);
    }
});

3. Administrar dispositivo

3.1. Consultar información y estado del dispositivo

Puedes usar el método deviceGet para obtener la información que ha registrado el SDK en referencia al dispositivo.


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


Indigitall.deviceGet(context, new DeviceCallback() {
    @Override
    public void onSuccess(Device device) {
        Log.d("Device: ", device.toString());
    }
    @Override
    public void onFail() {}
});

3.2. Habilitar / deshabilitar el dispositivo

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

  • Implementar una pantalla de preferencias para que el usuario pueda habilitar / deshabilitar la recepción de notificaciones.
  • Evitar la recepción de notificaciones si el usuario no se ha logado, o no ha aceptado los términos de uso, etc.
  • Gestionar la Lista Robinson.


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.


Indigitall.deviceEnable(context, new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        Log.d("Device: ", device.toString());
    }
    @Override
    public void onFail() {}
});

Indigitall.deviceDisable(context, new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        Log.d("Device: ", device.toString());
    }
    @Override
    public void onFail() {}
});

4. Grupos de interés

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

  • Implementar una pantalla de preferencias para que el usuario pueda elegir los temas para los que quiere recibir notificaciones.
  • Etiquetar según la navegación o acciones que realice el usuario.
  • Segmentar las comunicaciones según si el usuario se ha identificado o es anónimo.
  • Segmentar en base al idioma, cultura, categoría de cliente, o en base a cualquier otro criterio que necesites.


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.


Indigitall.topicsList(context, new TopicsCallback() {
    @Override
    public void onSuccess(Topic[] topics) {
        //DO SOMETHING
    }
    @Override
    public void onFail() {}
});

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 Topic[] or typeof string[]
Indigitall.topicsSubscribe(context, topics, new TopicsCallback() {
    @Override
    public void onSuccess(Topic[] topics) {}
    @Override
    public void onFail() {}
});

//topics is typeof Topic[] or typeof string[]
Indigitall.topicsUnsubscribe(context, topics, new TopicsCallback() {
    @Override
    public void onSuccess(Topic[] topics) {}
    @Override
    public void onFail() {}
});

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.


Indigitall.sendCustomEvent(context, "YOUR_EVENT_ID", JSONObject("YOUR_CUSTOM_DATA"),object: EventCallback(context){
    override fun onSuccess() {
        // Do something in success function
    }
    override fun onError(error: Error) {
        //SHOW ERROR
    }
})

6. Mensajes In-App

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

  • Banner. Contenido estático que está siempre visible, pero permite al usuario seguir utilizando la aplicación.
  • Popup. Contenido a pantalla completa que obliga al usuario a pulsar o descartar la información.

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.


Crea una vista de WebView en tus layouts. El tamaño debe coincidir con el que hayas definido en la consola de indigitall (Herramientas > Esquemas In-App/In-Web). Recuerda traducir las unidades de PX a DP.


Si se configura en la consola que el banner se oculte a X segundos, hay que añadir a la llamada la activity en la que se encuentra el inApp y añadir el callback didDismissed en donde te indicará que ha transcurrido el tiempo configurado, devolviendo el webView y el código de inApp para que puedas, por ejemplo, ocultarlo.

6.1.1. Un único banner

Puedes seguir el ejemplo de a continuación:


<WebView
    android:id="@+id/myBanner"
    android:layout_width="230dp"
    android:layout_height="33.33dp"
/>


Instancia el mensaje In-App usando el método showInApp.


WebView view = findViewById(R.id.myBanner);

Indigitall.showInApp(getContext(), "myBanner_CODE", view, new ShowInAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("InApp loaded: ", inAppCode);
    }
    @Override
    public void onSuccess(InApp inApp) {
        Log.d("In-App: ", inApp);
    }
    @Override
    public void onFail(String inAppCode, WebView webView, String message) {}
});

//Si se configura en la campaña para que el banner se oculte a X segundos:

Indigitall.showInApp(getContext(), "myBanner_CODE", view, new InAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("InApp loaded: ", inAppCode);
    }

    @Override
    public void onSuccess(InApp inApp) {
        Log.d("In-App: ", inApp);
    }

    @Override
    public void onFail(String inAppCode, WebView webView, String error) {

    }

    @Override
    public void onShowTimeFinished(String inAppCode, WebView webView, int showTime) {
        super.onShowTimeFinished(inAppCode, webView, showTime);        
    }
});

6.1.2. Múltiples banner

Puedes seguir el ejemplo de a continuación:


<WebView
    android:id="@+id/myBanner"
    android:layout_width="230dp"
    android:layout_height="33.33dp"
/>
<WebView
    android:id="@+id/otherBanner"
    android:layout_width="250dp"
    android:layout_height="36dp"
/>


Instancia los mensajes In-App usando el método showInApp.


ArrayList<WebView> views = new ArrayList<>();
views.add(findViewById(R.id.myBanner));
views.add(findViewById(R.id.otherBanner));

ArrayList<String> codes = new ArrayList<>();
codes.add("myBanner_CODE");
codes.add("otherBanner_CODE");

Indigitall.showMultipleInApp(getContext(), codes, views, new ShowInAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("InApp loaded: ", inAppCode);
    }
    @Override
    public void onSuccess(InApp inApp) {
        Log.d("In-App: ", inApp);
    }
    @Override
    public void onFail(String inAppCode, WebView webView, String message) {
         //show error if inApp is Expired, inApp was shown or clicked more than x times configured on indigitall console
    }
});

//Si se configura en la campaña para que el banner se oculte a X segundos:
Indigitall.showMultipleInApp(getContext(), inAppCodeList, webViewList, new InAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("InApp loaded: ", inAppCode);
    }

    @Override
    public void onSuccess(InApp inApp) {
        Log.d("In-App: ", inApp);
    }

    @Override
    public void onFail(String inAppCode, WebView webView, String error) {
        //show error if inApp is Expired, inApp was shown or clicked more than x times configured on indigitall console
    }

    @Override
    public void onShowTimeFinished(String inAppCode, WebView webView, int showTime) {
        super.onShowTimeFinished(inAppCode, webView, showTime);
        Log.d("InApp onShowTimeFinished " + inAppCode);
    }
});

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.


Crea una vista de WebView en tus layouts. El tamaño debe coincidir con el que hayas definido en la consola de indigitall (Herramientas > Esquemas In-App/In-Web). Recuerda traducir las unidades de PX a DP.


ConstraintLayout view = findViewById(R.id.myPopupParentLayout)

Indigitall.showPopUp(view, getContext(), "myPopup_CODE", new ShowInAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("In-App loaded: ", inAppCode);
    }
    @Override
    public void onSuccess(InApp inApp) {
        Log.d("In-App: ", inApp);
    }
    @Override
    public void onFail(String inAppCode, WebView webView, String message) {}

    @Override
    public void didClicked() {
        Log.d("popUp","didClicked")
    }

    @Override
    public void  didClosed() {
        Log.d("popUp","didClosed")
    }
    @Override
    public void  didDismissed() {
        Log.d("popUp","didDismissed")
    }
    @Override
    public void onShowTimeFinished(
        String inAppCode,
        WebView webView,
        int showTime
    ) {
        Log.d("popUp", "onShowTimeFinished")
    }
    @Override
    public void didDismissForever(InApp inApp, Error error) {
        Log.d("Popup", "didDismissForever ")
    }

});


Si quieres personalizar el icono de cerrar el Popup, puedes hacerlo con el siguiente método al que le podrás pasar un ImageButton personalizado, 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.


ConstraintLayout view = findViewById(R.id.myPopupParentLayout)

ImageButton myImageButton = ImageButton(context);
.
.//set ImageButton params
.
boolean closeIconDisabled = false

Indigitall.showPopUp(view, getContext(), "myPopup_CODE", myImageButton, closeIcon, new ShowInAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("In-App loaded: ", inAppCode);
    }
    @Override
    public void onSuccess(InApp inApp) {
        Log.d("In-App: ", inApp);
    }
    @Override
    public void onFail(String inAppCode, WebView webView, String message) {}

    @Override
    public void didClicked() {
        Log.d("popUp","didClicked")
    }

    @Override
    public void  didClosed() {
        Log.d("popUp","didClosed")
    }
    @Override
    public void  didDismissed() {
        Log.d("popUp","didDismissed")
    }

    @Override
    public void onShowTimeFinished(String inAppCode, WebView webView, int showTime) {
        super.onShowTimeFinished(inAppCode, webView, showTime);
        Log.d("InApp onShowTimeFinished " + inAppCode);
    }
    @Override
    public void didDismissForever(InApp inApp, Error error) {
        Log.d("Popup", "didDismissForever ")
    }
});

6.3. Utilidades del InApp

En el caso de que quieras mostrar el esquema InApp de diferente manera a como lo pinta nuestra SDK, ponemos a tu disposición unos métodos para que podáis customizar el "pintado", sin que se vean afectadas ni las estadísticas ni las funcionalidades del InApp.

Recogida del objeto InApp


InAppIndigitall.inAppGet(context, inAppId, new InAppCallback(context){    
    @Override
    public void onFail(Error error) {
        super.onFail(error);
    }

    @Override
    public void onSuccess(InApp inApp) {
        //DO SOMETHING
    }
});

Comprobación si debería mostrarse el InApp

Gracias a las funcionalidades de InApp (a partir de la version 4.18.0), se puede indicar que el inApp se muestre o se pulse un número de veces máximo, o si en el caso del popUp, tras realizar una acción, como pulsar al botón cerrar, no se vuelva a mostrar. Para ello podríamos hacer lo siguiente dentro del método inAppGet que hemos visto anteriormente:


InAppIndigitall.inAppGet(context, inAppId, new InAppCallback(context){    
    @Override
    public void onFail(Error error) {
        super.onFail(error);
    }

    @Override
    public void onSuccess(InApp inApp) {
        if (inApp.getProperties().getDismissForever() &&
                PopUpUtils.INSTANCE.isInAppDismissForever(context, inApp)) {
            //InApp was dismissed forever
        } else {
            InAppUtils.INSTANCE.inAppWasShown(context, inApp, new InAppWasShownCallback() {
                @Override
                public void didExpired() {
                    //InApp  was expired
                }

                @Override
                public void didShowMoreThanOnce() {
                    //InApp  was shown more than" + inApp.getProperties().getNumberOfShows() +" times"
                }

                @Override
                public void didClickOut() {
                    //InApp  was clicked more than " + inApp.getProperties().getNumberOfClicks()+ " times"
                }

                @Override
                public void onSuccess() {
                    //SHOW INAPP OR DO SOMETHING
                }
            });
        }
    }
});

Acciones para contabilizar clicks o para no mostrar InApp nunca más

Para el caso de lo que llamamos Dismiss Forever, una vez que se realiza la acción, se debe llamar a este método:


PopUpUtils.INSTANCE.addNewInAppToDismissForever(context, inApp);

En el caso de que se quiera mostrar un inApp sólo si hace 'x' clicks o pulsaciones sobre él hay que añadir lo siguiente:


Boolean result = InAppUtils.INSTANCE.inAppWasClicked(context, inApp, intent);
  • En este método se mandan las estadísticas del click, no sólo el contador de clicks, por lo que devuelve un booleano sólo para confirmar que todo ha ido correctamente.


7. Inbox

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

7.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
Indigitall.logIn(this, "YOUR_EXTERNAL_ID", new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        //DO SOMETHING
    }
    @Override
    public void onFail() {
        //LOG ERROR
    }
});

//Desconexión
Indigitall.logOut(this, new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        //DO SOMETHING
    }
    @Override
    public void onFail() {
        //LOG ERROR
    }
});

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


El token tiene una fecha predeterminada de caducidad, una vez caducado en nuestro sistema, se lanzará un evento listener de tipo InboxAuthListener que indicará dicha caducidad y tendrá que devolvernos el JSON de configuración. Para recoger el listener, hay que implementarlo en la clase correspondiente, y sobreescribir el siguiente método:



public class YOUR_CLASS implements InboxAuthListener{
.
.
.
@Override
public JSONObject getAuthConfig() {
    return MY_JSON;
}

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

7.2.1. Propiedades del Inbox

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


  • Sent o enviado: la notificación se ha enviado al cliente, la ha podido leer o no.
  • Click: han pulsado sobre la notificación mostrada en el Inbox.
  • Delete o borrado: se ha borrado por parte del cliente la notificación del Inbox.


Las notificaciones también vendrán con un estado leído o 'read', para ayudar a diferenciar dichos estados.


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


En el caso particular de Android, cuando llega una nueva push de Indigitall al dispositivo del cliente, se genera una acción definida en un intent, que se puede utilizar para avisar al usuario de que tiene un nuevo mensaje en el Inbox. Para recogerlo hay que implementarlo de la siguiente manera:


@Override
protected void onResume() {
    super.onResume();
    if (getIntent() != null && getIntent().getExtras() != null){
        Bundle extras = getIntent().getExtras();
        if( extras != null && extras.containsKey(Push.EXTRA_PUSH)) {
            //DO SOMETHING
        }
    }
}

7.2.2. Obtener las notificaciones

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


 Inbox.Companion.getInbox(context, new InboxCallback(context) {
    @Override
    public void onSuccess(Inbox inbox) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        //LOG ERROR
    }
});
7.2.2.1 Siguiente página

Una vez obtenida la instancia Inbox, la usaremos para pedir la siguiente página, que se realizada con el siguiente métoto, en el caso de que no haya más páginas te lo indicará en el error con el códigoo 410:


inbox.getNextPage(context,new InboxCallback() {
    @Override
    public void onSuccess(Inbox inbox, newNotifications: ArrayList<InboxNotification>?) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        if (error.code == 410){
            //LOG NO HAY MÁS PÁGINAS
        }else{
            //LOG ERROR
        }
    }
});


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.

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


inbox.getInfoFromNotification(context, SENDING_ID , new InboxNotificationsCallback(context) {
    @Override
    public void onSuccess(InboxNotification inboxNotification) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        //LOG ERROR
    }
});

7.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
inbox.modifyStatusFromNotification(context,SENDING_ID,STATUS,new InboxNotificationsCallback(context) {
    @Override
    public void onSuccess(InboxNotification inboxNotification) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        //LOG ERROR
    }
});

//Modificar masivamente
inbox.massiveEditNotifications(context,[SENDING_IDS],STATUS,new BaseCallback() {
    @Override
    public void onSuccess(JSONObject json) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        //LOG ERROR
    }
});

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

Inbox.Companion.getMessagesCount(context, new InboxCountersCallback(context) {
        @Override
        public void onSuccess(InboxCounters inboxCounters) {
            //DO SOMETHING
        }
    });

8. Firebase Utils

Si tienes clases personalizadas de Firebase, puede que necesites deshabilitar los siguientes servicios del SDK, definidos en el manifest.xml.


<!-- <service
    android:name="com.indigitall.android.services.FirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>
    <service
    android:name="com.indigitall.android.services.FirebaseInstanceIdService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service> -->


Si este es tu caso, debes agregar este código para asegurar que las notificaciones enviadas desde indigitall, se reciban y se muestren.


En el servicio asociado a la acción _com.google.firebase.INSTANCE_IDEVENT añade esta línea para registrar el push token.


@Override
public void onTokenRefresh() {
    FirebaseUtils.setPushToken(context);
}


En el servicio asociado a la acción _com.google.firebase.MESSAGINGEVENT, si la notificación proviene de indigitall, las siguientes líneas de código harán que se pinte.



//Google
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    if(remoteMessage.getData() != null && !FirebaseUtils.pushNotificationIndigitall(remoteMessage, context)){
        //Your Code
    }
}

//Huawei
 override fun onMessageReceived(newRemoteMessage: RemoteMessage?) {
        if(remoteMessage.getData() != null && !HMSUtils.pushNotificationIndigitall(remoteMessage, context)){
        //Your Code
    }
 }    

9. Recogida de los datos de la push

En el caso de que quisieras obtener el objeto push de tipo json para realizar comprobaciones o acciones que tu aplicación requiera, te dejamos este código que ayudará a su obtención:


@Override
protected void onResume() {
    super.onResume();
    if (getIntent() != null && getIntent().getExtras() != null){
        Bundle extras = getIntent().getExtras();
        if( extras != null && extras.containsKey(Push.EXTRA_PUSH)) {
            Push push = new Push(extras.getString(Push.EXTRA_PUSH));
        }
    }
}


En el caso de la push cifrada, al objeto Push hay que pasarle el contexto como parámetro adicional:

@Override
protected void onResume() {
    super.onResume();
    if (getIntent() != null && getIntent().getExtras() != null){
        Bundle extras = getIntent().getExtras();
        if( extras != null && extras.containsKey(Push.EXTRA_PUSH)) {
            Push push = new Push(context,extras.getString(Push.EXTRA_PUSH));
        }
    }
}

9.1. Registrar estadísticas si se trata la acción de la Push.


Si se decide por tratar la acción de la Push de manera independiente sin pasar por nuestra SDK, se recoge el intent de la acción en vuestra activity dónde se debe llamar al método ServiceUtils.RegisterStatistics. Para este caso se puede, por ejemplo, crear una clase que extienda de nuestro PushNotification para generar el intent con los siguientes extras:


public class MyPushNotification extends PushNotification {
    Push push;
    Context context;

    public MyPushNotification(Push push) {
        super(push);
        this.push = push;
    }

    @Override
    public void showNotification(Context context) {
        this.context = context;
        super.showNotification(context);
    }

    protected PendingIntent getIntent(PushAction action, int clickedButton) {      
        Intent intent = action.getIntent(context);
        Intent indigitallIntent = new Intent(context, YOUR_ACTIVITY.class);
        indigitallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        indigitallIntent.putExtra(StatisticService.EXTRA_APP_KEY, PreferenceUtils.getAppKey(context));
        indigitallIntent.putExtra(StatisticService.EXTRA_PUSH_ID, push.getId());
        indigitallIntent.putExtra(StatisticService.EXTRA_CLICKED_BUTTON, clickedButton);
        indigitallIntent.putExtra(StatisticService.EXTRA_INTENT_ACTION, intent);
        indigitallIntent.putExtra(Push.EXTRA_PUSH, push.toString());
        if (action.getTopics() != null && action.getTopics().length>0){
            indigitallIntent.putExtra(StatisticService.EXTRA_ACTION_TOPICS, action.topicsToString());
        }
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addNextIntentWithParentStack(indigitallIntent);

        return stackBuilder.getPendingIntent((push.getId()*10) + clickedButton, PendingIntent.FLAG_UPDATE_CURRENT);
    }
}


Una vez recogida la push como explicamos en el apartado anterior, se debe llamar al siguiente método para el registro de estadísticas:

ServiceUtils.registerStatistics(context,indigitallIntent);


10. Documentación de referencia

Javadoc del SDK 4.8 para Android


11. Changelog

[4.19.1] - 03/2022

Correciones

  • Mejorar el rendimiento de las llamadas a la API

[4.19.0] - 03/2022

Añadido

  • Borrar las librerías de HMS para evitar problema de publicación en Play Store

[4.18.5] - 02/2022

Añadido

  • Actualizar huawei push lib para que sea compatible con android 31

[4.18.4] - 02/2022

Correcciones

  • Blindar posibles errores en la obtención de push token sin external apps

[4.18.3] - 02/2022

Correcciones

  • Guardar status device en SharedPreferences

[4.18.2] - 01/2022

Correciones

  • Cambiar condicionales para evitar usar librerías de HMS en dispositivos android.

[4.18.1] - 01/2022

Correciones

  • Eliminar librería Base de huawei

[4.18.0] - 01/2022

Anadido

  • InApp Dismiss Forever
  • Utilidades del InApp (numberOfClicks, numberOfShows)
  • Event custom para iurny

[4.17.5] - 12/2021

Correcciones

  • Añadir campo platform en la petición PUT cuando push secure está activa

[4.17.4] - 12/2021

Correcciones

  • Acción Abrir URL si SO de android es 11 o superior

[4.17.3] - 11/2021

Correcciones

  • Añadir campaignId al click de la push

[4.17.2] - 11/2021

Correcciones

  • Controlar error en caso de que google-service.json esté mal configurado

[4.17.1] - 11/2021

Correcciones

  • Ingesta de dispositivos

[4.17.0] - 10/2021

Añadido

  • Campo categoría en las notificaciones del Inbox

[4.16.2] - 10/2021

Correciones

  • Compatilibidad para librería de Xamarin

[4.16.1] - 10/2021

Correciones

  • Modelo CustomerField

[4.16.0] - 10/2021

Añadido

  • Compatibilidad con Android 12

[4.15.0] - 09/2021

Añadido

  • Customer Service

[4.14.0] - 09/2021

Añadido

  • Contador de clicks en inApp

[4.13.2] - 08/2021

Añadido

  • Añadido callback en InApp con el objeto InApp

[4.13.1] - 07/2021

Añadido

  • Actualizar librerías de Huawei

[4.13.0] - 07/2021

Añadido

  • Actualizar sdk target version a 30
  • Actualizar FirebaseMesssaging a 22.0.0

[4.12.4] - 07/2021

Correciones

  • Corregir la escala del popup según la densidad del terminal

[4.12.3] - 06/2021

Correciones

  • Actualizar librería Core de Huawei

[4.12.2] - 06/2021

Correciones

  • Actualizar librerías de Huawei

[4.12.1] - 06/2021

Añadido

  • Nueva clase HMSUtils para tratar la push

[4.12.0] - 05/2021

Añadido

  • Nuevo método para enviar evento personalizados con datos

    Correciones

  • Recogida de datos de los dispositivos
  • Si no implementas HMS, no necesitas añadir nada al gradle

[4.11.0] - 05/2021

Añadido

  • Ocultar inApp transcurrido un tiempo configurado en consola

[4.10.2] - 04/2021

Correciones

  • PopUp mostrar un número de veces definido en consola

[4.10.1] - 04/2021

Correciones

  • Mejorar recogida de model de inApp
  • Ocultar icono de cerrar en PopUp

[4.10.0] - 04/2021

Añadido

  • InApp acción abrir app
  • InApp mostrar un número de veces definido en consola
  • PopUp bordes redondeados

[4.9.9] - 03/2021

Correciones

  • Setear correctamente la actividad por defecto

[4.9.8] - 02/2021

Correciones

  • Mejorar tratamiento de acciones de botones

[4.9.7] - 02/2021

Correciones

  • Mejorar control en caso de que no se haya generado deviceId
  • Corregir extensión de la clase PushNotification en Harmony

[4.9.6] - 02/2021

Correciones

  • Mejorar funcionamiento en las pushes silenciosas

[4.9.5] - 02/2021

Correciones

  • Mejorar modelo de llamadas asíncronas

[4.9.4] - 02/2021

Correciones

  • Acceso al Servicio de HMSMessagingService

[4.9.3] - 01/2021

Correciones

  • Forzar actualización de token por caducidad si no se almacena en primera instancia

[4.9.2] - 01/2021

Correciones

  • Mostrar correctamente el body en android 6.0 e inferiores

[4.9.1] - 12/2020

Correciones

  • Estabilidad en solicitudes

[4.9.0] - 11/2020

Añadido

  • Push persistente

[4.8.6] - 10/2020

Correciones

  • Escalar popUp y añadir callbacks
  • Envío de estadísticas

[4.8.5] - 10/2020

Correciones

  • Añadir custom layout
  • Acceso a método showNotification

[4.8.4] - 10/2020

Correciones

  • Datos de plataforma

[4.8.3] - 09/2020

Correciones

  • Imagen en las pushes en dispositivos en huawei

[4.8.2] - 09/2020

Correciones

  • Ajustar popup al tamaño del dispositivo
  • Callback onErrorInitialized en caso de error en dominio

[4.8.1] - 08/2020

Correciones

  • Control de errores en obtención de push en dispositivos huawei antiguos.

[4.8.0] - 08/2020

Añadido

  • Push con datos cifrados

[4.7.0] - 07/2020

Añadido

  • Servicio de localización con HMS

[4.6.0] - 06/2020

Añadido

  • HMS - Huawei Mobile Services

[4.5.1] - 06/2020

Correcciones

  • Icono en pushes con layout nativo

[4.5.0] - 06/2020

Añadido

  • Inbox

[4.4.0] - 06/2020

Añadido

  • Abrir archivos *.pkpass

[4.3.0] - 05/2020

Añadido

  • Layout nativo por defecto

Correcciones

  • Modo oscuro

[4.2.0] - 04/2020

Añadido

  • Filtro WiFi

[4.1.1] - 03/2020

Correcciones

  • Recogida excepciones en inApp tipo PopUp

[4.1.0] - 03/2020

Añadido

  • Función 'no Action' en inApp

[4.0.2] - 03/2020

Correcciones

  • Primera petición de localización

[4.0.1] - 01/2020

Correcciones

  • Acción en botón sin subscripción a topics

[4.0.0] - 03/2020

Añadido

  • Añadido subscribir topics con los botones
  • Librería AndroidX

[3.1.0] - 08/2019

Añadido

  • Añadido el método sendCustomEvent para enviar eventos personalizados