Usando AppsFlyer com TWA

Visão geral: Use a AppsFlyer com Trusted Web Activities (TWA, atividades web confiáveis) para medir instalações e registrar eventos in-app.

Introdução

O que são atividades web confiáveis ​?

As atividades web confiáveis ​​(TWA) são uma nova maneira de integrar conteúdo da web ao seu aplicativo Android. O desafio da TWA é ser capaz de registrar eventos in-app. Este desafio é abordado neste artigo. Para mais informações sobre TWA, veja aqui.

TWA também pode ser usado com Progressive Web Apps.

O que são aplicativos web progressivos?

Progressive Web Apps (PWA, aplicativos web progressivos) são aplicativos que oferecem uma experiência semelhante a um aplicativo, mas na verdade são totalmente baseados na web. Uma forma de PWA é um aplicativo Android cujas atividades são baseadas em TWA. Esta é a forma de PWA que abordaremos neste artigo. TWA permite que você incorpore seu PWA em um aplicativo Android independente, permitindo efetivamente que você apresente seu aplicativo PWA existente na Play Store.

A outra forma, puramente baseada na web, não é abordada neste artigo. Para obter mais informações sobre o PWA, veja aqui.

Esta aba é sobre o PWA incorporado em uma atividade web confiável, um navegador web em tela cheia no aplicativo. Esses aplicativos possuem a classe de aplicativo global Android, mas cujas atividades são exclusivamente baseadas na web.

Esta forma de PWA permite medir instalações. A outra forma de PWA, puramente baseada na web, não oferece a opção de medir instalações.

TWA

Envio de eventos in-app a partir de TWA

Os eventos in-app são enviados usando o SDK da AppsFlyer a partir de atividades nativas do aplicativo. Como TWA é baseada na web e não é uma atividade nativa, você não pode enviar eventos in-app usando o SDK da AppsFlyer. Você pode usar eventos in-app de servidor para servidorcomo alternativa. Siga as instruções abaixo para enviar eventos de servidor para servidor com TWA.

Pré-requisitos

Antes de começar a enviar eventos TWA para a AppsFlyer, faça o seguinte:

  1. Adicione o seguinte repositório ao arquivo gradle no nível do projeto:
    maven { url "https://jitpack.io"}
  2. Adicione as seguintes bibliotecas:
    • Para bibliotecas android.support:
      • Adicione o seguinte em seu build.gradle:
        implementação 'com.github.GoogleChrome.custom-tabs-client:customtabs:91b4a1270b'
      • Importe as seguintes 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 androidX:
      • Adicione o seguinte em seu build.gradle:
        implementation 'com.github.GoogleChrome:android-browser-helper:ff8dfc4ed3'
      • Importe as seguintes 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;
        

Como buscar o ID da AppsFlyer

Para enviar eventos de servidor para servidor, você precisa do ID da AppsFlyer. Você pode obter o ID da AppsFlyer no Android SDK da AppsFlyer. 

Primeiro, certifique-se de integrar o Android SDK da AppsFlyer. Você pode então obter o ID da AppsFlyer usando a seguinte API SDK:

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

Enviando o ID da AppsFlyer para TWA

Você pode enviar o ID da AppsFlyer de duas maneiras:

Anexar ID da AppsFlyer e ID de usuário do cliente ao URL

Ao criar uma intenção de atividade web confiável, você pode passar parâmetros para seu 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);
}

Como buscar o ID da AppsFlyer

Depois que a atividade web for iniciada, você poderá recuperar o ID da AppsFlyer usando um simples snippet de JavaScript:

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

Depois de obter o ID da AppsFlyer, armazene-o no armazenamento local para uso posterior.

Envio de ID da AppsFlyer por meio de cabeçalhos personalizados

Você pode passar cabeçalhos personalizados para atividades web confiáveis. O servidor obtém esses cabeçalhos, os configura em cookies e os envia para o navegador. Você pode então recuperar o ID da 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);
}

Como buscar o ID da AppsFlyer

JavaScript não fornece uma API para permitir que os desenvolvedores acessem os cabeçalhos. Portanto, o servidor deve enviar os dados de conversão de volta para a atividade web como um cookie. O servidor obtém os cabeçalhos personalizados contendo o ID da AppsFlyer, analisa os dados e os envia para a página web como um cookie.

Quando a página carrega, um snippet JavaScript deve ser definido para buscar o cookie de ID da 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);


Enviando o evento in-app

Para enviar eventos in-app, você precisa enviar os dados do evento para o seu servidor e fazer com que ele envie o evento para a AppsFlyer. Existem alguns outros pré-requisitos para enviar eventos in-app:

  • Chave do desenvolvedor do SDK - Importante! A chave do desenvolvedor do SDK é um valor confidencial e não deve estar presente no TWA. Se você for usar o TWA e enviar eventos in-app de servidor para servidor, sempre armazene a chave de desenvolvedor do SDK com segurança no lado do servidor.
  • ID do aplicativo - o ID do aplicativo conforme aparece no Android Manifest.xml.

Depois de ter esses três parâmetros (ID da AppsFlyer, chave do desenvolvedor do SDK, ID do aplicativo), você poderá enviar o evento in-app. Sempre que um evento ocorre na atividade da web, você deve enviar uma solicitação ao seu servidor da web para lidar com esse evento. O webserver obtém os dados relacionados ao evento, compõe o evento e envia para a AppsFlyer.

Veja aqui exemplos de como enviar eventos in-app de servidor para servidor.

Personalizando conteúdo da web com dados de conversão

O SDK da AppsFlyer fornece dados de conversão por meio de duas APIs:

Você pode usar dados de conversão para personalizar o conteúdo da web.

Enviando dados de conversão para TWA

Depois de obter os dados de conversão de qualquer um dos métodos listados acima, você pode enviá-los para o seu servidor web. Para fazer isso, use cabeçalhos 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);
}

Buscando os dados de conversão do lado do cliente

JavaScript não fornece uma API para permitir que os desenvolvedores acessem os cabeçalhos. Portanto, o servidor deve enviar os dados de conversão de volta para a atividade web como um cookie. O servidor obtém os cabeçalhos personalizados contendo os dados de conversão, analisa os dados e os envia para a página da web como um cookie.

Quando a página carrega, um snippet JavaScript deve ser definido para buscar o cookie de dados de conversão e personalizar o conteúdo de forma correspondente. Por exemplo, se um usuário instalar o aplicativo a partir de uma campanha de ofertas de voos, você poderá preencher a atividade na web com conteúdo relevante para as ofertas promovidas pela campanha.

// 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 saber mais sobre casos de uso de dados de conversão, clique aqui.

PWA

Medindo instalações para PWA

Como acontece com qualquer outro aplicativo Android, você pode integrar o SDK da AppsFlyer ao aplicativo para medir instalações e obter dados de conversão.

Para medir instalações, tudo o que você precisa fazer é integrar o SDK seguindo as instruções aqui

Personalização de conteúdo usando dados de conversão

Você pode personalizar o conteúdo da web de acordo com a campanha que solicita ao usuário a instalação do seu aplicativo. Por exemplo, se um usuário instalar um aplicativo de uma campanha que oferece 20% de desconto em produtos de sua loja virtual. Você pode obter os dados de conversão e aplicar o desconto assim que o aplicativo abrir a atividade na web.

Para saber mais sobre como usar dados de conversão para personalizar conteúdo da web, siga as instruções aqui.

Gravando eventos no PWA

PWA faz uso de TWA, que são essencialmente atividades na web. Como TWA é baseada na web e não é uma atividade nativa, você não pode enviar eventos in-app usando o SDK da AppsFlyer. Como alternativa, você pode usar eventos in-app de servidor para servidor.

Siga as instruções aqui para saber como enviar eventos in-app para PWA.