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:
- Adicione o seguinte repositório ao arquivo gradle no nível do projeto:
maven { url "https://jitpack.io"}
- 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
- Adicione o seguinte em seu build.gradle:
- 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;
- Adicione o seguinte em seu build.gradle:
- Para bibliotecas android.support:
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:
- Obter dados de conversão - chamado quando o aplicativo é iniciado pela primeira vez após uma instalação e para lançamentos subsequentes do aplicativo.
- Atribuição na abertura do aplicativo - chamada quando o aplicativo está vinculado diretamente ao uso do OneLink.
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.