Uso de AppsFlyer con TWA

De un vistazo: Utiliza AppsFlyer con actividades web de confianza (TWA) para medir las instalaciones y registrar eventos in-app.

Introducción

¿Qué son las actividades web de confianza?

Las actividades web de confianza (TWA, por sus siglas en inglés) son una nueva forma de integrar contenido web con tu aplicación de Android. El desafío con las TWA es poder registrar los eventos in-app. Hablamos sobre este desafío en este artículo. Para obtener más información sobre las TWA, consulta aquí.

Las TWA también se pueden utilizar con aplicaciones web progresivas.

¿Qué son las aplicaciones web progresivas?

Las aplicaciones web progresivas (PWA) son aplicaciones que ofrecen una experiencia similar a una aplicación, pero que en realidad están completamente basadas en la web. Una forma de PWA es una aplicación de Android cuyas actividades se basan en TWA. Esta es la forma de PWA que se analiza en este artículo. Las TWA te permiten integrar tu PWA dentro de una aplicación de Android independiente, lo que te permite presentar tu aplicación PWA existente en Play Store.

La otra forma, que se basa exclusivamente en la web, no se analiza en este artículo. Para obtener más información sobre las PWA, consulta aquí.

Esta pestaña analiza la PWA que está integrada en una actividad web de confianza, un navegador web de pantalla completa in-app. Estas aplicaciones tienen la clase de aplicación global de Android pero cuyas actividades se basan únicamente en la web.

Esta forma de PWA te permite medir las instalaciones. La otra forma de PWA, aquellas que están puramente basadas en web, no te dan la opción de medir las instalaciones.

TWA

Envío de eventos in-app desde TWA

Los eventos in-app se envían mediante el SDK de AppsFlyer desde actividades de la aplicación nativa. Dado que la TWA está basada en la web y no es una actividad nativa, no puedes enviar eventos in-app utilizando el SDK de AppsFlyer. Puedes utilizar eventos in-app de servidor a servidor como alternativa. Sigue las instrucciones a continuación para enviar eventos de servidor a servidor con TWA.

Requisitos previos

Antes de que puedas comenzar a enviar eventos desde TWA a AppsFlyer, haz lo siguiente:

  1. Agrega el siguiente repositorio al archivo gradle a nivel de proyecto:
    maven { url "https://jitpack.io"}
  2. Agrega las siguientes bibliotecas:
    • Para bibliotecas de android.support:
      • Agrega lo siguiente en tu build.gradle:
        implementation 'com.github.GoogleChrome.custom-tabs-client:customtabs:91b4a1270b'
      • Importa las siguientes bibliotecas:
        import android.support.customtabs.CustomTabsClient;
        import android.support.customtabs.CustomTabsIntent;
        import android.support.customtabs.CustomTabsServiceConnection;
        import android.support.customtabs.CustomTabsSession;
        import android.support.customtabs.trusted.TrustedWebActivityIntentBuilder;
        import static android.support.customtabs.TrustedWebUtils.EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY
    • Para bibliotecas de androidX:
      • Agrega lo siguiente en tu build.gradle:
        implementation 'com.github.GoogleChrome:android-browser-helper:ff8dfc4ed3'
      • Importa las siguientes bibliotecas:
        import androidx.browser.customtabs.CustomTabsClient;
        import androidx.browser.customtabs.CustomTabsIntent;
        import androidx.browser.customtabs.CustomTabsServiceConnection;
        import androidx.browser.customtabs.CustomTabsSession;
        import androidx.browser.trusted.TrustedWebActivityIntentBuilder;
        

Obtención del ID de AppsFlyer

Para enviar eventos de servidor a servidor, necesitas el ID de AppsFlyer. Puedes obtener el ID de AppsFlyer desde el SDK de AppsFlyer para Android. 

Primero, asegúrate de integrar el SDK de AppsFlyer para Android. Luego puedes obtener el ID de AppsFlyer usando la siguiente API del SDK:

String appsflyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(this);

Envío del ID de AppsFlyer a TWA

Puedes enviar el ID de AppsFlyer de dos maneras:

Agregación del ID de AppsFlyer y el ID de usuario del cliente a la URL

Cuando creas una intención de actividad web de confianza, puedes pasar parámetros a su URL:

private void launchTwa(String cuid, String af_id) {

    CustomTabsServiceConnection customTabsServiceonnection = new CustomTabsServiceConnection() {

        @Override
        public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
            Log.d(LOG_TAG, "onCustomTabsServiceConnected");

            // Setting up CustomTabsSession that is used to build an intent
            mClient = client;
            CustomTabsSession session = mClient.newSession(null);

            // Creating the intent to launch TWA using URL with query params that can be read by the Web App
            TrustedWebActivityIntentBuilder twaIntentBuilder = new TrustedWebActivityIntentBuilder(Uri.parse(defaultUri + "?cuid=" + cuid + "&appsflyer_id=" + af_id));
            Intent twaIntent = twaIntentBuilder.build(session);

            startActivity(twaIntent);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(LOG_TAG, "onCustomTabsServiceDisconnected");
        }
    };

    CustomTabsClient.bindCustomTabsService(getApplicationContext(), "com.android.chrome", customTabsServiceonnection);
}

Obtención del ID de AppsFlyer

Una vez que se inicia la actividad web, puedes recuperar el ID de AppsFlyer usando un simple fragmento de JavaScript:

let url = new URL(document.location.href);
    let appsflyerID;
url.searchParams.forEach((value, key) => {
    if(key === 'appsflyer_id') {
    	appsflyerID = value;
    }
})

Una vez que tengas el ID de AppsFlyer, guárdalo en el almacenamiento local para usarlo más adelante.

Envío de ID de AppsFlyer a través de encabezados personalizados

Puedes pasar encabezados personalizados a las actividades web de confianza. El servidor obtiene estos encabezados, los configura en cookies y los envía al navegador. Luego puedes recuperar el ID de AppsFlyer usando javascript:

private void launchTwa(String cuid, String af_id) { 
        CustomTabsServiceConnection customTabsServiceonnection = new CustomTabsServiceConnection() {

        @Override
        public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
            Log.d(LOG_TAG, "onCustomTabsServiceConnected");

            // Setting up CustomTabsSession that is used to build an intent
            mClient = client;
            CustomTabsSession session = mClient.newSession(null);

            // Creating the intent to launch TWA using URL with query params that can be read by the Web App
            TrustedWebActivityIntentBuilder twaIntentBuilder = new TrustedWebActivityIntentBuilder(Uri.parse(defaultUri);
            Intent twaIntent = twaIntentBuilder.build(session);

            // Passing additional custom headers to the intent so they can be read by the Web App
            Bundle customHeaders = new Bundle();
            customHeaders.putString("twa_params", "cuid=" + cuid + "&=appsflyer_id" + af_id");
            twaIntent.putExtra(Browser.EXTRA_HEADERS, customHeaders);
            startActivity(twaIntent);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(LOG_TAG, "onCustomTabsServiceDisconnected");
        }
    };

    CustomTabsClient.bindCustomTabsService(getApplicationContext(), "com.android.chrome", customTabsServiceonnection);
}

Obtención del ID de AppsFlyer

JavaScript no proporciona una API que permita a los desarrolladores acceder a los encabezados. Por lo tanto, el servidor debe enviar los datos de conversión a la actividad web como una cookie. El servidor obtiene los encabezados personalizados que contienen el ID de AppsFlyer, analiza los datos y los envía a la página web como una cookie.

Cuando se carga la página, se debe configurar un fragmento de JavaScript para recuperar la cookie de ID de AppsFlyer.

// get the conversion data cookie 
// function taken from https://plainjs.com/javascript/utilities/set-cookie-get-cookie-and-delete-cookie-5/
function getCookie(name) {
    var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
    return v ? v[2] : null;
}

// get the cookie
var conversionData = JSON.parse(getCookie('appsflyer_id'));
console.log(appsflyer_id);


Envío del evento in-app

Para enviar eventos in-app, debes enviar los datos del evento a tu servidor y hacer que tu servidor envíe el evento a AppsFlyer. Existen algunos otros requisitos previos para enviar eventos in-app:

  • Clave de desarrollador del SDK: ¡Importante! La clave de desarrollador del SDK es un valor confidencial y no debería estar presente en la TWA. Si vas a utilizar TWA y a enviar eventos in-app de servidor a servidor, almacena siempre la clave de desarrollador del SDK de forma segura en el lado del servidor.
  • ID de aplicación: el ID de la aplicación tal como aparece en Android Manifest.xml.

Una vez que tengas estos tres parámetros (ID de AppsFlyer, clave de desarrollador del SDK, ID de la aplicación), podrá enviar el evento in-app. Siempre que tenga lugar un evento en la actividad web, debes enviar una solicitud a tu servidor web para manejar este evento. El servidor web obtiene los datos relacionados con el evento, lo compone y lo envía a AppsFlyer.

Consulta aquí para ver ejemplos de cómo enviar eventos in-app de servidor a servidor.

Personalización del contenido web con datos de conversión

El SDK de AppsFlyer te proporciona datos de conversión a través de dos API:

Puedes utilizar datos de conversión para personalizar el contenido web.

Envío de datos de conversión a TWA

Una vez que obtengas los datos de conversión de cualquiera de los métodos enumerados anteriormente, puedes enviarlos a tu servidor web. Para hacerlo, usa encabezados personalizados:

private void launchTwa(Map<String, String> conversionData, String cuid, String af_id) { 
        CustomTabsServiceConnection customTabsServiceonnection = new CustomTabsServiceConnection() {

        @Override
        public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
            Log.d(LOG_TAG, "onCustomTabsServiceConnected");

            // Setting up CustomTabsSession that is used to build an intent
            mClient = client;
            CustomTabsSession session = mClient.newSession(null);

            // Creating the intent to launch TWA using URL with query params that can be read by the Web App
            TrustedWebActivityIntentBuilder twaIntentBuilder = new TrustedWebActivityIntentBuilder(Uri.parse(defaultUri);
            Intent twaIntent = twaIntentBuilder.build(session);

            // Passing additional custom headers to the intent so they can be read by the Web App
            Bundle customHeaders = new Bundle();
            customHeaders.putString("twa_params", "cuid=" + cuid + "&=" + af_id");
            customHeaders.putString("conversion_data", conversionData);
            twaIntent.putExtra(Browser.EXTRA_HEADERS, customHeaders);
            startActivity(twaIntent);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(LOG_TAG, "onCustomTabsServiceDisconnected");
        }
    };

    CustomTabsClient.bindCustomTabsService(getApplicationContext(), "com.android.chrome", customTabsServiceonnection);
}

Obtención de datos de conversión del lado del cliente

JavaScript no proporciona una API que permita a los desarrolladores acceder a los encabezados. Por lo tanto, el servidor debe enviar los datos de conversión a la actividad web como una cookie. El servidor obtiene los encabezados personalizados que contienen los datos de conversión, analiza los datos y los envía a la página web como una cookie.

Cuando se carga la página, se debe configurar un fragmento de JavaScript para recuperar la cookie de datos de conversión y personalizar el contenido en consecuencia. Por ejemplo, si un usuario instala la aplicación desde una campaña de ofertas de vuelos, puedes completar la actividad web con contenido relevante para las ofertas que promociona la campaña.

// get the conversion data cookie 
// function taken from https://plainjs.com/javascript/utilities/set-cookie-get-cookie-and-delete-cookie-5/
function getCookie(name) {
    var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
    return v ? v[2] : null;
}

// get the cookie
var conversionData = JSON.parse(getCookie('conversion_data'));
console.log(conversionData);
/*
conversion data example:
{ 
        campaign: "CAMPAIGN_NAME", // "None" if not specified on the link
        media_source: "MEDIA_SOURCE", //"None" if not specified on the link     
        cost_cents_USD : "0",
        is_first_launch: true,
        install_time: "2018-12-30 23:59:39.330",
        orig_cost: "0.0",
        af_click_lookback: "7d",
        click_time: "2018-12-30 23:59:09",
        cost_cents_USD: "0",
        af_status: "Non-organic"
}
*/

Para obtener más información sobre los casos de uso de datos de conversión, consulta aquí.

PWA

Medición de instalaciones de PWA

Al igual que con cualquier otra aplicación de Android, puedes integrar el SDK de AppsFlyer con la aplicación para medir las instalaciones y obtener datos de conversión.

Para medir las instalaciones, todo lo que necesitas hacer es integrar el SDK siguiendo las instrucciones aquí

Personalización del contenido utilizando datos de conversión

Puedes personalizar el contenido web según la campaña que solicita al usuario que instale tu aplicación. Por ejemplo, si un usuario instala una aplicación de una campaña que le ofrece un 20 % de descuento en productos de tu tienda web. Puedes obtener los datos de conversión y aplicar el descuento tan pronto como la aplicación abra la actividad web.

Para obtener información sobre el uso de datos de conversión para personalizar el contenido web, sigue las instrucciones aquí.

Registro de eventos en PWA

La PWA hace uso de las TWA, que son esencialmente actividades web. Dado que la TWA está basada en la web y no es una actividad nativa, no puedes enviar eventos in-app utilizando el SDK de AppsFlyer. Como alternativa, puedes utilizar eventos in-app de servidor a servidor.

Sigue las instrucciones aquí para aprender cómo enviar eventos in-app para PWA.