Visão geral: adicione a AppsFlyer a aplicativos Android para medir instalações de aplicativos, eventos in-app, fontes de mídia e muito mais.
1. Visão geral
- Versão do SDK: 6.2.3 (Notas de versão)
- Versões do SDK descontinuadas
O SDK da AppsFlyer para Android fornece instalação de aplicativos e funcionalidade de gravação de eventos para aplicativos Android. O SDK pode ser usado com Java/Kotlin.
Incorpore o SDK em seu aplicativo para gravar:
- Instalações de aplicativos
- Engajamento do usuário (por exemplo, sessões e eventos no aplicativo)
1.1 Integração com SDK—o que você precisa fazer
Guia | Propósito | Após a conclusão |
---|---|---|
Integração do SDK (obrigatória) |
Adicionar e configurar o SDK |
|
APIs principais (Recomendado) |
Mensurar eventos in-app e receita, ativar deep linking e coletar dados de conversão |
|
APIs adicionais |
Implementar e usar APIs opcionais. Por exemplo, desinstalar métrica e atribuição de referências. |
|
Documento de referência de APIs do SDK |
1.2 Compatibilidade do SDK com plataformas Android
- Iniciando o Android V4.0
- Plataformas não móveis baseadas no Android, como Smart TVs, incluindo o Fire TV da Amazon
- Mercados fora da store para aplicativos Android, como Amazon e Baidu
2. Adicione o SDK ao seu aplicativo
Essa seção descreve como adicionar o SDK da AppsFlyer ao seu projeto Android.
Importante!
O Android SDK V6
tem grandes alterações de versões anteriores para a funcionalidade e APIs do SDK, incluindo descontinuações e alterações no nome do método. Saiba mais sobre como migrar do SDK V5.x.
2.1 Adicione o SDK ao seu projeto
Use um dos seguintes métodos para adicionar o SDK ao seu aplicativo:
- [Melhores práticas] Usando Gradle
- Adicionar manualmente o SDK
- Adicione o código abaixo ao nível do Módulo /app/build.gradle antes de
dependencies
:repositories { mavenCentral() }
- Adicione a versão mais recente do SDK da AppsFlyer como uma dependência. Você pode encontrar a versão mais recente aqui.
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:6.0.0' }
- Sincronize o projeto para recuperar as dependências - veja a seguinte captura de tela:
2.2 Como adicionar o referenciador da instalação do Android ao seu aplicativo
O referenciador da instalação do Android melhora a precisão da atribuição, protege contra fraudes na instalação e muito mais. É compatível com o SDK da AppsFlyer para Android versão 4.8.6.
Nota
O Google desativou oBroadcastReceiver em março de 2020.
- Essa alteração não afeta o aplicativo.
- Você ainda pode precisar do BroadcastReceiver para atribuição fora da loja. Verifique com a loja onde o aplicativo está listado para ter certeza.
- Implementar o referenciador de instalação é obrigatório agora.
Há duas formas de adicionar o referenciador da instalação ao seu aplicativo:
- Use Gradle (recomendado)
- Adicione manualmente o referenciador da instalação
Adicione o referenciador da instalação do Android como uma dependência. Você pode encontrar a versão mais recente aqui.
-
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:5.+' implementation 'com.android.installreferrer:installreferrer:1.1' }
- Sincronize o projeto para recuperar as dependências - veja a seguinte captura de tela:
Se você estiver usando o ProGuard e quiser usar a nova API do referenciador do Google, defina a seguinte regra no ProGuard: -keep public class com.android.installreferrer.** { *; }
- Baixe o aar do referenciador da instalação
- Adicione-o ao projeto
- Adicione a seguinte permissão ao manifesto:
com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE
2.3 Defina permissões necessárias
Adicionar permissões ajuda a aumentar a taxa de atribuição de modelagem probabilística. Também permite que o SDK envie mais dados, como Wifi e dados da rede da operadora. Você pode encontrar esses dados em relatórios de dados brutos e usá-los para análise e otimização de campanhas.
Adicionar permissões necessárias
- Adicionar as seguintes permissões ao
AndroidManifest.xml
:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
2.4 Defina BroadcastReceiver para obter dados do Google Play
Nota
O Google desativou oBroadcastReceiver em março de 2020.
- Essa alteração não afeta o aplicativo.
- Você ainda pode precisar do BroadcastReceiver para atribuição fora da loja. Verifique com a loja onde o aplicativo está listado para ter certeza.
- Implementar o referenciador de instalação é obrigatório agora.
O BroadcastReceiver obtém informações do Google Play que a AppsFlyer usa para atribuição. O uso do BroadcastReceiver aumenta a taxa de atribuição.
As duas opções a seguir estão disponíveis para implementar o receptor de broadcast da referência de instalação:
Se você não tiver um receptor escutando no INSTALL_REFERRER
, em AndroidManifest.xml
, na tag do aplicativo
adicione o seguinte receptor:
<application>
<receiver android:name="com.appsflyer.SingleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
<application>
<receiver android:name="com.appsflyer.MultipleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
Dica
Se você receber o erro "Unresolved class SingleInstallBroadcastReceiver" após adicionar o receptor ao AndroidManifest.xml, certifique-se de montar o aplicativo primeiro.
3. Implemente e inicialize o SDK
Esta seção descreve como implementar e inicializar o SDK.
3.1 Recupere a sua chave do desenvolvedor
A AppsFlyer usa a chave do desenvolvedor para identificar exclusivamente sua conta. A chave do desenvolvedor é obrigatória porque permite que o SDK envie e recupere com segurança dados que pertencem à sua conta da AppsFlyer.
Aviso! Usar a chave de desenvolvedor errada ou uma chave de desenvolvedor incorreta afeta todo o tráfego enviado do SDK e interrompe a atribuição e os relatórios.
Para recuperar sua chave do desenvolvedor:
- Acesse o painel do seu aplicativo
- No painel, em Configuração, clique em Configurações do Aplicativo.
- Copie sua chave do desenvolvedor.
3.2. Inicialize o SDK
Registro da classe de aplicativo global
No arquivo AndroidManifest.xml
, dentro da tag do aplicativo
, adicione a seguinte linha:
android:name="<APP.PACKAGE.NAME>.<AFApplication>"
-
<APP.PACKAGE.NAME>
- substitua pelo nome do pacote do aplicativo. -
<AFApplication>
- substitua pelo nome que você definiu para a classe global do aplicativo.
Esta linha no manifest.xml informa ao aplicativo qual é o aplicativo global. Como mencionado acima, isso torna o SDK da AppsFlyer acessível globalmente em todo o aplicativo.
Inicialize o SDK
Recomendamos inicializar o SDK na classe de aplicativo global do aplicativo. Isso permite que o SDK seja inicializado em todos os cenários, incluindo links diretos.
As etapas listadas abaixo ocorrem dentro da classe de aplicativo global do aplicativo.
- Dentro da classe global do aplicativo, importe as seguintes bibliotecas
import android.app.Application; import android.util.Log; import com.appsflyer.AppsFlyerLib; import com.appsflyer.AppsFlyerConversionListener; import java.util.Map;
- Dentro da classe global, atribua sua chave do desenvolvedor a uma variável, preferencialmente denominada AF_DEV_KEY
Importante: é crucial usar a chave do desenvolvedor correta ao inicializar o SDK. O uso da chave do desenvolvedor incorreta afeta todo o tráfego enviado pelo SDK e causa problemas de atribuição e relatório.
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; //... }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; //... }
- Dentro da classe global, após a chamada para
super.onCreate()
, implemente oAppsFlyerConversionListener
. Veja o código abaixo na etapa 4. - Dentro da classe global, após o
ConversionListener
, inicialize o SDK usando o métodoinit()
.
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; @Override public void onCreate() { super.onCreate(); AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() { @Override public void onConversionDataSuccess(Map<String, Object> conversionData) { for (String attrName : conversionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName)); } } @Override public void onConversionDataFail(String errorMessage) { Log.d("LOG_TAG", "error getting conversion data: " + errorMessage); } @Override public void onAppOpenAttribution(Map<String, String> attributionData) { for (String attrName : attributionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + attributionData.get(attrName)); } } @Override public void onAttributionFailure(String errorMessage) { Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage); } }; AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, this); } }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; override fun onCreate() { super.onCreate() val conversionDataListener = object : AppsFlyerConversionListener{ override fun onConversionDataSuccess(data: MutableMap<String, Any>?) { data?.let { cvData -> cvData.map { Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}") } } } override fun onConversionDataFail(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } override fun onAppOpenAttribution(data: MutableMap<String, String>?) { data?.map { Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}") } } override fun onAttributionFailure(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } } AppsFlyerLib.getInstance().init(devKey, conversionDataListener, this) } }
- Dentro da classe global do aplicativo, chame
start()
.
AppsFlyerLib.getInstance().start(this);
AppsFlyerLib.getInstance().start(this)
3.4 Atraso na inicialização do SDK
Para atrasar a inicialização do SDK, você pode chamar start da classe de Atividade.
Essa opção pode ser usada se, por exemplo, você precisar adiar o start até receber o consentimento do usuário devido aos requisitos de GDPR, CCPA ou outros.
Ao invocar start na classe Atividade:
- Certifique-se de passar instância de Atividade como um argumento e não um Aplicativo.
- Se você planeja usar recursos de deep linking, adicione a API
start()
a qualquer outra Atividade à qual você possa vincular deep links que não tenha 'start' nela.
4. Teste as instalações
Tudo pronto para testar a integração do SDK simulando instalações orgânicas e não orgânicas. Depois de concluir essa seção, você verá dois tipos de instalações no dashboard da AppsFlyer: orgânicas e não orgânicas.
Para mais cenários de teste e instruções, consulte Testes de integração do SDK.
4.1 Registre seu dispositivo de teste
Antes de iniciar o teste de instalações, registre o dispositivo de teste.
4.2 Simule uma instalação orgânica
Instalações orgânicas são instalações não atribuídas, geralmente instalações diretas das lojas de aplicativos.
Para simular uma instalação orgânica:
- Verifique se você tem um dispositivo móvel conectado ao seu computador
- No Android Studio, abra o Logcat.
- No Android Studio, instale o aplicativo no dispositivo ou emulador.
- Aguarde o aplicativo iniciar.
- No Logcat, procure o nome do pacote do seu aplicativo.
Você deve ver o seguinte:
A parte destacada na captura de tela indica que o SDK relata uma instalação orgânica. Esses dados são provenientes do método onConversionDataSuccess
na classe AFApplication. A obtenção de dados de conversão é discutida mais adiante neste guia.
Observação: Ao iniciar o SDK V5, onConversionDataSuccess
é o nome do método para obter os dados de conversão. Se você estiver usando uma versão do SDK abaixo de 5.0.0, o nome do método será onInstallConversionDataLoaded
. Recomendamos que você atualize para o SDK 5.0.0. Clique aqui para saber mais.
Uma instalação orgânica agora deve aparecer na página Overview (Visão geral) do painel do aplicativo.
Se você não encontrar uma instalação no painel do aplicativo, consulte o guia de solução de problemas do SDK.
4.3 Simule uma instalação não orgânica
Uma instalação não orgânica é uma instalação atribuída que geralmente segue um engajamento de anúncio. Você pode simular uma instalação não orgânica usando links de atribuição.
Para simular uma instalação não orgânica:
- No manifesto, descubra qual é o nome do pacote do seu aplicativo, por exemplo, com.company.app.
- Na URL abaixo, substitua <app_id >pelo nome do pacote do aplicativo:
Por exemplo:https://app.appsflyer.com/<app_id>?pid=Test&c=Test
https://app.appsflyer.com/id0123456789?pid=Test&c=Test
- O parâmetro c especifica o nome da campanha.
- O parâmetro pid especifica o nome da fonte de mídia à qual a instalação é atribuída.
- A ID de publicidade (GAID) deve ser adicionada se você testar o clique de um computador (adicionando
&advertising_id=<GAID>
ao final do link na etapa 1).
- Na URL abaixo, substitua <app_id >pelo nome do pacote do aplicativo:
- Envie este URL para o dispositivo. Você pode fazê-lo, por exemplo, por e-mail ou WhatsApp.
- No dispositivo, clique no URL.
- Se o aplicativo estiver listado na loja de aplicativos, você será redirecionado para a loja de aplicativos. Não baixe e instale o aplicativo da loja de aplicativos. Prossiga para a etapa 5.
- Se o aplicativo não estiver listado na loja de aplicativos e ainda estiver em desenvolvimento, a tela mostrará uma mensagem de que o aplicativo não está disponível na loja de aplicativos. Simplesmente prossiga para a etapa 5.
- No Android Studio, abra o Logcat.
- Conecte o dispositivo ao seu computador usando um cabo USB.
- No Android Studio, instale o aplicativo no dispositivo.
- No Logcat, procure o nome do pacote do seu aplicativo.
Você deve ver o seguinte:
Uma instalação não orgânica agora deve aparecer na página de Visão Geral do dashboard do aplicativo.
Nota
Quando terminar de testar e depurar a integração do SDK, desative os logs do SDK.
Problemas conhecidos com a integração do SDK
Veja abaixo para saber mais sobre os possíveis problemas ao integrar o SDK e como superá-los.
Aviso do ProGuard
Se você estiver usando ProGuard e se deparar com um aviso sobre a nossa classe AFKeystoreWrapper
, adicione o seguinte código ao seu arquivo de regras do ProGuard:
-keep class com.appsflyer.** { *; }
Regras de backup
Se você adicionar android: fullBackupContent="true"
dentro da marcação <application> no AndroidManifest.xml, você pode receber o erro:
Falha na fusão do manifesto: Attribute application@fullBackupContent value=(true)
Para corrigir esse erro, adicione tools:replace="android:fullBackupContent"
na marcação <application> no arquivo AndroidManifest.xml.
Se você tiver suas próprias regras de backup especificadas (android:fullBackupContent="@xml/my_rules"
), além das instruções acima, mescle-as com as regras da AppsFlyer manualmente adicionando a seguinte regra:
<full-backup-content>
...//your custom rules
<exclude domain="sharedpref" path="appsflyer-data"/>
</full-backup-content>
Arquivos de recursos ausentes
Se você estiver usando Android SDK V5 e superior, certifique-se de que no arquivo APK, além de classes.dex e arquivos de recursos, você também tem a pasta com > appsflyer > interno com arquivosa- eb- dentro.
Observação: Em versões anteriores ao SDK 5.3.0, os nomes de arquivo são a. eb.
Verifique se você possui os arquivos necessários abrindo seu APK no Android Studio. Veja a captura de tela a seguir para referência.
Se estes arquivos estiverem ausentes, o SDK não poderá fazer solicitações de rede ao nosso servidor e você precisará entrar em contato com o nosso serviço de suporte ao cliente.
5. Gravação de eventos in-app
Observação: essas instruções são para desenvolvedores, mas a opinião do/da profissional de marketing é essencial, pois ele/ela deve decidir quais eventos in-app precisam ser registrados para mensurar a qualidade do usuário.
A gravação de eventos in-app e receitas permite avaliar a qualidade de seus usuários.
Os eventos in-app oferecem insights sobre o que está acontecendo em seu aplicativo. Recomendamos reservar um tempo e definir os eventos que você deseja registrar. O registro de eventos in-app ajuda a mensurar KPIs, como ROI (retorno sobre o investimento) e LTV (valor permanente).
Existem várias maneiras de gravar eventos in-app. A maneira mais comum é enviar eventos por meio do SDK, a qual discutimos neste artigo. Para conhecer outras maneiras de gravar eventos in-app, consulte o nosso guia de visão geral de eventos in-app.
Se o seu aplicativo pertencer a uma determinada vertical, por exemplo, viagens, jogos, eCommerce, dentre outros, você pode usar a lista completa de eventos in-app recomendados por vertical.
5.1 Nomes e parâmetros de eventos in-app
O SDK possui duas interfaces relacionadas a eventos in-app:
- AFInAppEventType — constantes para nomes de eventos in-app
- AFInAppEventParameterName — constantes para nomes de parâmetros do evento in-app
É altamente recomendável usar essas duas interfaces pelos seguintes motivos:
- A nomeação padrão permite que a AppsFlyer mapeie automaticamente eventos para SRNs, como Facebook, Google, Twitter e Snapchat.
- Compatibilidade com versões anteriores — se a AppsFlyer decidir alterar o nome de qualquer evento ou parâmetro de evento, sua implementação será compatível com versões anteriores.
Para usar essas duas interfaces, importe-as:
import com.appsflyer.AFInAppEventParameterName;
import com.appsflyer.AFInAppEventType;
Esta é a lista de nomes de eventos e estruturas recomendados.
5.2 Gravação de receita
É possível enviar receita com qualquer evento in-app. Use o parâmetro de evento af_revenue
(AFInAppEventParameterName.REVENUE
) para incluir receita no evento in-app. Você pode preenchê-lo com qualquer valor numérico, positivo ou negativo.
af_revenue
é o único parâmetro de evento que é contado na AppsFlyer como receita real nos dados brutos e painel. Para mais detalhes, clique aqui.
Ao enviar eventos com receita, lembre-se do seguinte:
- Se você definir o código de moeda (veja o exemplo abaixo), ele deverá ser um código ISO 4217 de 3 caracteres. (o padrão é USD).
- Você pode definir o código de moeda para todos os eventos chamando o método a seguir:
AppsFlyer.setCurrencyCode("ZZZ")
Para saber mais sobre definições de moeda, exibição e conversão de moeda, veja nosso guia sobre moeda de receita. - O valor da receita não deve conter separadores de vírgula, símbolo de moeda ou texto. Um evento de receita deve ser semelhante a 1234,56, por exemplo.
Exemplo: evento de compra de eventos in-app com receita
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt")
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD")
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue)
O evento de compra acima tem $1.234,56 em receita associada a ele, que aparece como receita no painel.
Gravação de receita negativa
Pode haver situações em que você deseja registrar receita negativa.
Por exemplo, um usuário recebe um reembolso pelos sapatos que comprou de você.
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,-200);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"shoes");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"4875");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , "cancel_purchase" , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE, -200)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE, "category_a")
eventValue.put(AFInAppEventParameterName.CONTENT_ID, "1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY, "USD")
AppsFlyerLib.getInstance().logEvent(applicationContext, "cancel_purchase", eventValue)
Observação
Observe o seguinte no código abaixo:
- O valor da receita é precedido por um sinal de menos.
- O nome do evento tem um valor único de "cancel_purchase" – para permitir que você identifique eventos de receitas negativas no painel e relatórios de dados brutos
5.3 Validação de compra in-app
O SDK da AppsFlyer fornece validação de recebimento de servidor para compras in-app. Para validar uma compra, chame validateAndLogInAppPurchase
.
Essa chamada gera automaticamente um evento in-app af_purchase
, desde que a compra seja validada.
public static void validateAndLogInAppPurchase(Context context,
String publicKey, String signature, String purchaseData,
String price, String currency, HashMap<String, String> additionalParameters);
Parâmetros do método
- String publicKey — chave pública do Google Developer Console
- String signature — assinatura da transação (retornada da API do Google quando a compra é concluída)
- String purchaseData — produto adquirido no formato JSON (retornado da API do Google quando a compra é concluída)
- String price — receita de eventos in-app a ser relatada à AppsFlyer.
- String currency — moeda do evento in-app a ser relatada à AppsFlyer
- HashMap<String, String> additionalParameters — parâmetros adicionais do evento in-app que aparecem no campo event_value nos dados brutos do evento in-app.
Retornos de chamada de sucesso e falha na validação da compra
Se você deseja saber se a tentativa de validar a compra foi bem-sucedida ou não, implemente registerValidatorListener na sua classe de aplicativo. Esse ouvinte possui dois blocos de retorno de chamada, um para "Sucesso" e outro para "Falha" (por qualquer motivo, incluindo falha na validação).
AppsFlyerLib.getInstance().registerValidatorListener(this,new
AppsFlyerInAppPurchaseValidatorListener() {
public void onValidateInApp() {
Log.d(TAG, "Purchase validated successfully");
}
public void onValidateInAppFailure(String error) {
Log.d(TAG, "onValidateInAppFailure called: " + error);
}
});
AppsFlyerLib.getInstance().registerValidatorListener(this, object : AppsFlyerInAppPurchaseValidatorListener {
override fun onValidateInApp() {
Log.d(LOG_TAG, "Purchase validated successfully")
}
override fun onValidateInAppFailure(error: String) {
Log.d(LOG_TAG, "onValidateInAppFailure called: $error")
}
})
Exemplo de uso de validação de uma compra:
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private void handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
Map<String, String> additional_event_values = new HashMap<>();
additional_event_values.put("some_parameter", "some_value");
String price= "10";
String currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(getApplicationContext(), PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private fun handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
val additional_event_values = HashMap<String, String>()
additional_event_values.put("some_parameter", "some_value");
val price= "10";
val currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(this, PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
A validação da compra in-app envia automaticamente um evento de compra in-app à AppsFlyer. Veja abaixo um exemplo de dados que são passados no parâmetro event_value:
{
"some_parameter":"some_value", // from additional_event_values
"af_currency":"USD", // from currency
"af_content_id":"test_id", // from purchase
"af_revenue":"10", // from revenue
"af_quantity":"1", // from purchase
"af_validated":true // flag that AF verified the purchase
}
Observação
Chamar validateAndTrackInAppPurchase
gera automaticamente um evento in-app af_purchase. O envio desse evento cria relatórios de eventos duplicados.
5.4 Limitações de eventos in-app
- Nome do evento: até 45 caracteres
- Valor do evento: não deve exceder 1000 caracteres - caso exceda, pode ser necessário restringi-lo.
- Preço e receita: use apenas dígitos e decimais, por exemplo, 5 ou 5,2
- Os valores de preço e receita podem ter até 5 dígitos após o ponto, por exemplo, 5.12345
- Os caracteres não ingleses são suportados em eventos no aplicativo, outras APIs do SDK, a partir do Android SDK V4.8.1.
5.5 Exemplos de gravação de eventos in-app
É possível gravar eventos in-app chamando trackEvent
com os parâmetros de nome e valor do evento. Consulte a documentação sobre Eventos in-app para obter mais detalhes.
Veja abaixo um exemplo simples de como gravar um evento de compra. Para obter uma lista abrangente de trechos de código prontos por vertical, consulte nosso guia sobre eventos avançados dentro do aplicativo por verticais.
Exemplo: evento de compra in-app
Map<String,Object> eventValues = new HashMap<>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200);
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY");
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes");
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues);
val eventValues = HashMap<String, Any>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200)
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY")
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes")
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues)
5.6 Como gravar eventos in-app offline
Se um usuário iniciar um evento quando a conexão à internet estiver indisponível, a Appsflyer ainda pode realizar o registro do evento. Confira como funciona:
- O SDK envia os eventos aos servidores da AppsFlyer e aguarda uma resposta.
- Se o SDK não receber 200 como resposta, o evento é armazenado no cache.
- Quando o próximo 200 como resposta for recebido, o evento armazenado é reenviado ao servidor.
- Se houver vários eventos no cache, eles são enviados para o servidor, um imediatamente após o outro.
Nota
O cache do SDK pode armazenar até 40 eventos, o que significa que apenas os primeiros 40 eventos que acontecem off-line são salvos. Tudo o que vem depois, até as próximas 200 respostas, é descartado.
A hora do evento que aparece nos dados brutos é a hora em que o evento é enviado à AppsFlyer após o dispositivo ficar online novamente. Não é a hora real do evento.
5.7 Lida com sucesso e falha ao gravar eventos in-app
Você pode definir um ouvinte ao gravar eventos in-app. O ouvinte permite definir lógica para dois cenários:
- Evento in-app gravado com sucesso.
- Ocorreu um erro ao gravar um evento in-app.
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Event sent successfully");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Event sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
Se um erro ocorrer ao gravar o evento in-app, um código de erro e uma descrição de string são fornecidos, conforme indicado na tabela a seguir.
Código do erro | Descrição da string |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param" ("Tempo limite do evento. Verifique parâmetro 'minTimeBetweenSessions'") |
11 |
"Skipping event because 'isStopped' enabled" ("Ignorando evento porque 'IsStopped' está ativado") |
40 |
Network error: Error description comes from Android (Erro de rede: descrição do erro vem do Android) |
41 |
"No dev key" ("Sem chave do desenvolvedor") |
50 |
"Status code failure" ("Falha no código do status")+ código de resposta real do servidor" |
6. Links diretos com OneLink
Observação: essas instruções são para desenvolvedores, mas a opinião do/da profissional de marketing é essencial porque ele/ela tem acesso ao dashboard da AppsFlyer, que é necessário para configurar o OneLink para deep linking.
Os links diretos permitem fornecer aos usuários a melhor experiência.
OneLink é a solução da AppsFlyer para atribuição multiplataforma, redirecionamento e links diretos.
6.1 Detecção e redirecionamento de dispositivo
O OneLink detecta o tipo de dispositivo após o clique, e redireciona o usuário para o destino correspondente, por exemplo, Google Play, loja de aplicativos para iOS, mercados fora da loja ou páginas da web.
O guia de redirecionamentos do OneLink discute a implementação de links de atribuição multiplataforma (não é necessária codificação do SDK). Também é a base para links diretos.
6.2 Links diretos
Os links diretos permitem enviar usuários a atividades específicas e servi-los com conteúdo personalizado. Isso é especialmente útil ao realizar campanhas de redirecionamento.
Para configurar links diretos com o OneLink, um profissional de marketing com acesso ao painel da AppsFlyer e um desenvolvedor com acesso ao aplicativo devem trabalhar juntos.
Consulte o nosso guia sobre configuração de links diretos com o OneLink.
6.3 Ligação direta adiada
A ligação direta adiada permite vincular novos usuários e servi-los com conteúdo personalizado após a instalação do aplicativo. Isso é diferente dos links diretos regulares, em que o aplicativo já deve estar instalado no dispositivo do usuário.
Para configurar a ligação direta adiada com o OneLink, o desenvolvedor também precisa de acesso ao painel da AppsFlyer.
A configuração para ligação direta adiada é a mesma que para links diretos. A única diferença é que você precisa implementar lógica adicional no aplicativo para aplicar link direto aos usuários e servi-los com conteúdo personalizado após a instalação e a inicialização do aplicativo.
Consulte o nosso guia sobre ligação direta adiada para saber mais.
6.4 Obter dados de link direto
O SDK fornece os dados de conversão ou engajamento após cada evento de instalação ou links diretos. É possível usar esses dados para personalizar o conteúdo e o comportamento do aplicativo programaticamente.
Para obter dados de links diretos quando o link direto é usado e o aplicativo é aberto, implemente o método onAppOpenAttribution.
Para obter dados de links diretos de reengajamento manualmente a qualquer momento, implemente o método performOnAppAttribution. Isso permite o acesso aos dados de reengajamento sem gravar um novo reengajamento.
Consulte o nosso guia sobre dados de links diretos para saber mais.
6.5 Configurar a resolução de deep link de notificação push
O método addPushNotificationDeepLinkPath
fornece aos proprietários de aplicativos uma interface flexível para configurar como os deep links são extraídos de payloads de notificação push.
Por padrão, o SDK procura um valor de deep link na chave af
do payload JSON
de uma notificação push. No entanto, muitos provedores de push usam esquemas JSON
próprios que o SDK não pode converter sem configuração adicional.
O addPushNotificationDeepLinkPath
permite configurar qual chave no payload da notificação push o SDK usa para o valor do deep link.
Use esse método se você estiver integrando seu aplicativo com provedores de push que não usam o esquema JSON
de notificação push padrão esperado pelo SDK.
Ao chamar addPushNotificationDeepLinkPath
, o SDK verifica se:
- A chave necessária existe no payload.
- A chave contém uma URL do OneLink válida.
addPushNotificationDeepLinkPath
deve ser chamado antes da chamada start()
.
Configuração básica
Considere a seguinte chamada para addPushNotificationDeepLinkPath
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
e esses cenários.
Cenário 1
Seu aplicativo é ativado por notificação push. Ele contém um payload estruturado da seguinte forma.
{
...
"deeply": {
"nested": {
"deep_link": "https://yourdeeplink2.onelink.me"
}
}
...
}
Nesse cenário, o SDK extrai o valor de deep_link
e prossegue com o fluxo do deep link.
Cenário 2
Seu aplicativo é ativado por notificação push. Ele contém um payload estruturado da seguinte forma.
{
...
"deeply": {
"nested": {
"banana": "https://yourdeeplink2.onelink.me"
}
},
...
}
Nesse cenário, quando a chamada executa o SDK, não consegue encontrar a chave deep_link
no payload. Portanto, nada acontece.
Cenário 3
Seu aplicativo é ativado por notificação push. Ele contém um payload estruturado da seguinte forma.
{
...
"deeply": {
"nested": {
"deep_link": "Corrupted url or regular string"
}
},
...
}
Nesse cenário, embora o SDK encontre a chave deep_link
, seu valor de deep link é inválido. Portanto, quando a chamada acima é executada, nada acontece.
Configuração avançada
Para configurar várias estruturas de payload útil possíveis, faça a chamada addPushNotificationDeepLinkPath
várias vezes:
- A primeira chamada que produz um valor de deep link válido é usada
- Outras chamadas são ignoradas
Se nenhuma das estruturas de payload corresponder ou nenhuma URL válida do OneLink for encontrada no payload, nada acontecerá.
Por exemplo, considere o seguinte payload:
{
...
"deeply": {
"nested": {
“deep_link”: “https://yourdeeplink2.onelink.me”
}
},
“this”: {
“is”: {
"banana": "phone"
}
}
...
}
e as seguintes chamadas para addPushNotificationDeepLinkPath
.
// this.is.deep_link key isn’t found - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "deep_link");
// this.is.banana key found, but contains invalid OneLink URL - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "banana");
// deeply.nested.deep_link key found and contains valid OneLink URL - proceed deep linking flow
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
// this.is.deep_link key isn’t found - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "deep_link");
// this.is.banana key found, but contains invalid OneLink URL - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "banana");
// deeply.nested.deep_link key found and contains valid OneLink URL - proceed deep linking flow
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
7. Obter dados de conversão
Você pode acessar os dados de atribuição em tempo real para cada nova instalação, a partir do SDK.
Isso permite que você atenda aos usuários com conteúdo personalizado ou envie-os para atividades específicas no aplicativo (consulte ligação direta adiada neste artigo). Isso melhora o engajamento do usuário com o aplicativo.
Para obter dados de conversão da AppsFlyer do Android SDK, implemente AppsFlyerConversionListener
.
import android.app.Application;
import com.appsflyer.AppsFlyerLib;
import com.appsflyer.AppsFlyerConversionListener;
import java.util.Map;
import android.util.Log;
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
@Override
public void onConversionDataSuccess(Map<String, Object> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
@Override
public void onConversionDataFail(String errorMessage) {
Log.d("LOG_TAG", "error getting conversion data: " + errorMessage);
}
@Override
public void onAppOpenAttribution(Map<String, String> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
@Override
public void onAttributionFailure(String errorMessage) {
Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage);
}
};
AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, getApplicationContext());
AppsFlyerLib.getInstance().start(this);
}
}
import com.appsflyer.AppsFlyerConversionListener
import com.appsflyer.AppsFlyerLib
import com.appsflyer.AppsFlyerLibCore.LOG_TAG
class AFApplication : Application() {
private val devKey = "qrdZGj123456789";
override fun onCreate() {
super.onCreate()
val conversionDataListener = object : AppsFlyerConversionListener{
override fun onConversionDataSuccess(data: MutableMap<String, Any>?) {
data?.let { cvData ->
cvData.map {
Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}")
}
}
}
override fun onConversionDataFail(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
override fun onAppOpenAttribution(data: MutableMap<String, String>?) {
data?.map {
Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}")
}
}
override fun onAttributionFailure(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
}
AppsFlyerLib.getInstance().init(devKey, conversionDataListener, applicationContext)
AppsFlyerLib.getInstance().start(this)
}
}
As APIs mais importantes na interface AppsFlyerConversionListener
são:
-
onInstallConversionData
- fornece dados de conversão para novas instalações. Observação: Ao iniciar o SDK V5,onConversionDataSuccess
é o nome do método para obter dados de conversão. Se você estiver usando uma versão do SDK abaixo de 5.0.0, o nome do método seráonInstallConversionDataLoaded
. Você deve fazer o upgrade para o SDK versão 5.0.0. Clique aqui para saber mais. -
onAppOpenAttribution
— fornece dados de conversão de redirecionamento quando um aplicativo existente é iniciado, manualmente ou por meio de links diretos.
Para saber mais sobre dados de conversão, consulte nosso guia sobre cenários de dados de conversão.
8. Atribuição
Aplicativos Android fora da loja
Com a AppsFlyer, você pode atribuir instalações para aplicativos Android fora da loja. Isso permite que você promova seus aplicativos e alcance públicos maiores em mercados onde o Google Play não está disponível.
Para obter mais detalhes sobre como atribuir instalações para aplicações fora da loja, leia aqui.
Aplicativos pré-instalados
Nas campanhas de pré-instalação, os proprietários de aplicativos podem solicitar aos fabricantes de dispositivos que pré-instalem seus aplicativos nos dispositivos antes de saírem da fábrica.
Com a AppsFlyer, você pode atribuir facilmente instalações de aplicativos pré-instalados. Quando os usuários iniciam seu aplicativo pela primeira vez, a AppsFlyer atribui a instalação ao fabricante como uma fonte de mídia.
Para mais detalhes, clique aqui.
Medir desinstalações
Para saber como configurar a métrica de desinstalação, leia aqui.
Configurando um listener de solicitação
Se você deseja receber uma confirmação de que a solicitação foi recebida com sucesso pelos servidores da AppsFlyer, implemente o listener AppsFlyerRequestListener.
O método de retorno de chamada onRequestSuccess()
é executado para cada resposta 200
a uma solicitação de atribuição feita pelo SDK.
O método de retorno de chamada onRequestFailure(String error)
é executado para qualquer outra resposta e retorna a resposta como a sequência de caracteres de erro.
Exemplo de implementação
AppsFlyerLib.getInstance().start(getApplicationContext(), "devKey", new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully, got 200 response code from server");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().start(this, "devKey", object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
Se ocorrer um erro durante o ouvinte de solicitação, um código de erro e uma descrição de string são fornecidos, conforme indicado na tabela a seguir.
Código do erro | Descrição da string |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param" ("Tempo limite do evento. Verifique parâmetro 'minTimeBetweenSessions'") |
11 |
"Skipping event because 'isStopped' enabled" ("Ignorando evento porque 'IsStopped' está ativado") |
40 |
Network error: Error description comes from Android (Erro de rede: descrição do erro vem do Android) |
41 |
"No dev key" ("Sem chave do desenvolvedor") |
50 |
"Status code failure" ("Falha no código do status")+ código de resposta real do servidor" |
Configuração de dados personalizados adicionais
É necessária a API setAdditionalData
para integrar-se no nível do SDK com várias plataformas de parceiros externas, incluindo Segment, Adobe e Urban Airship.
Use esta API apenas se o artigo de integração da plataforma afirmar especificamente que a API setAdditionalData é necessária.
Exemplo de código setAdditionalData
:
HashMap<String,Object> CustomDataMap = new HashMap<>();
CustomDataMap.put("custom_param_1","value_of_param_1");
AppsFlyerLib.getInstance().setAdditionalData(CustomDataMap);
val customDataMap = HashMap<String, Any>()
customDataMap.put("custom_param_1","value_of_param_1")
AppsFlyerLib.getInstance().setAdditionalData(customDataMap)
Atribuir sessões de aplicativo iniciadas a partir de sites próprios (domínios)
Os proprietários de aplicativos que usam links de aplicativos para links diretos (sem OneLink) e têm um domínio associado ao aplicativo podem atribuir sessões iniciadas por meio desse domínio usando o método appendParametersToDeepLinkingUrl
.
Por exemplo, um usuário faz uma pesquisa no Google e clica no seu domínio, www.exemplo.com:
- Se o usuário não tiver o aplicativo instalado, ele será direcionado para o site (www.example.com).
- Se o usuário tiver o aplicativo instalado no seu dispositivo, haverá um link direto para o aplicativo associado com www.exemplo.com. A sessão é atribuída à fonte de mídia (parâmetro
pid
) especificada emappendParametersToDeeplinkingUrl
.
Consulte a referência do SDK do Android para obter informações adicionais.
Observação: Smart Banners ajudam os proprietários de aplicativos a converter visitantes do site em usuários do aplicativo.
9. Sessões
Personalizar tempo entre sessões
Por padrão, deve haver um intervalo mínimo de 5 segundos entre duas inicializações de aplicativos para que essas duas sessões sejam contabilizadas separadamente (saiba mais sobre contabilização de sessões).
Use a seguinte API para definir o tempo mínimo entre sessões:
AppsFlyerLib.setMinTimeBetweenSessions(int seconds);
Definir um valor alto para o tempo personalizado entre inicializações pode gerar um impacto negativo nas APIs que dependem dos dados das sessões, como links diretos.
Sessões em background para aplicativos utilitários
Você pode relatar sobre novas sessões de usuário usando esse método de SDK. Por exemplo, isso pode ser útil para aplicativos utilitários executados em segundo plano.
Use esta API no onCreate() da sua atividade:
public void logSession(Context context);
Exemplo de uso:
AppsFlyerLib.getInstance().logSession(context);
10. Mídia própria
Corrigindo URLs encurtadas com links diretos (deep links)
Alguns serviços de terceiros, como provedores de serviços de e-mail, envolvem links em e-mails com seus próprios domínios de gravação de links. Alguns até permitem que você defina seus próprios domínios de gravação de links. Se o OneLink estiver agrupado nesses domínios, poderá limitar sua funcionalidade.
Para superar esse problema, você pode usar a API setResolveDeepLinkURLs
. Use esta API para obter o OneLink de domínios de clique que iniciam o aplicativo. Certifique-se de chamar essa API antes da inicialização do SDK.
Por exemplo, você tem 3 domínios de clique que redirecionam para o seu OneLink, que é https://mysubdomain.onelink.me/abCD. Use essa API para obter o OneLink ao qual seus domínios de clique redirecionam. Este método de API recebe uma lista de domínios que o SDK resolve. Adicione o seguinte código antes da inicialização do SDK.
AppsFlyerLib.getInstance().setResolveDeepLinkURLs("clickdomain.com", "myclickdomain.com", "anotherclickdomain.com");
O código acima permite usar seu domínio de clique, preservando a funcionalidade do OneLink. Os domínios de clique são responsáveis pela inicialização do aplicativo. A API, por sua vez, recebe o OneLink desses domínios de clique e, depois, é possível usar os dados desse OneLink para aplicar deep link e personalizar o conteúdo do usuário.
Gravação de Notificações por Push
Com a AppsFlyer, você pode medir as notificações push como parte de campanhas de redirecionamento.
Para habilitar esse recurso, chame o método sendPushNotificationData
dentro do método onCreate
de cada atividade iniciada após clicar na notificação:
AppsFlyerLib.getInstance().sendPushNotificationData(this);
Para mais informações sobre medição de notificações por push, leia aqui.
Atribuição de convite do usuário
Permitir que os usuários existentes convidem seus amigos e contatos como novos usuários para seu aplicativo pode ser um fator de crescimento importante para seu aplicativo. Com a AppsFlyer, você pode atribuir e registrar instalações originadas de convites do usuário em seu aplicativo.
Para obter detalhes, consulte o artigo de atribuição de convite do usuário.
Atribuição de promoções cruzadas
Para obter detalhes, consulte o artigo Atribuição de promoção cruzada aqui.
11. Identificadores de usuários
Obter o ID da AppsFlyer
Um ID da AppsFlyer é criado para cada nova instalação de um aplicativo. Você pode usar o ID da AppsFlyer para vários fins:
- Enviar eventos in-app de servidor para servidor.
- Combine o ID da AppsFlyer com os registros do usuário em seus sistemas de back-end.
- Mapear entradas ao mesclar dados das APIs pull e push.
Use a seguinte API para obter o ID da AppsFlyer:
public String getAppsFlyerUID(Context context);
Exemplo de uso:
String appsFlyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(this);
Definir ID de usuário cliente
Para definir sua ID de usuário cliente:
public void setCustomerUserId(String id);
Exemplo de uso:
AppsFlyerLib.getInstance().setCustomerUserId("myId");
Recomendamos definir o ID de usuário cliente no início do fluxo do aplicativo, pois ele está associado apenas aos eventos relatados após sua configuração:
- Se
setCustomerUserID
for chamado antes de chamarstart
, a ID de usuário cliente aparecerá nos relatórios de dados brutos para instalações e eventos. - Se for definido depois, o ID de usuário cliente será associado apenas a eventos registrados após a configuração do ID de usuário cliente.
Obtenção de ID do cliente (Customer User ID):
Para evitar definir o valor do ID de usuário cliente novamente após a primeira inicialização e reduzir as chamadas para o servidor a fim de obter o ID de usuário cliente, você pode verificar se o valor está vazio ou não, usando:
AppsFlyerProperties.getInstance().getString(AppsFlyerProperties.APP_USER_ID)
Para mais informações sobre ID de usuário cliente, clique aqui .
Atrasar init do SDK para customerUserID
É possível atrasar a inicialização do SDK até que o customerUserID esteja definido.
Para indicar que o SDK deve atrasar a inicialização para a chamada do ID de usuário cliente:
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
imediatamente antes do método init(). O resto da inicialização do SDK deve permanecer inalterado.
Uma vez que o customerUserID foi fornecido, chame
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
para fornecer o SDK com o ID de usuário do cliente relevante e iniciar o SDK.
O código deve aparecer da seguinte maneira:
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
AppsFlyerConversionListener conversionDataListener =
new AppsFlyerConversionListener() {
...
};
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
//WARNING! Removing above line doesn't cancel its effect.
// Replace with this to stop waiting for CUID:
// AppsFlyerLib.getInstance().waitForCustomerUserId(false);
AppsFlyerLib.getInstance().init(AF_DEV_KEY, getConversionListener(), getApplicationContext());
AppsFlyerLib.getInstance().start(this);
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
//Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
}
}
class AFApplication: Application() {
private val afDevKey = ""
override fun onCreate() {
super.onCreate()
val conversionDataListener = object: AppsFlyerConversionListener {
...
}
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
//WARNING! Removing above line doesn't cancel its effect.
// Replace with this to stop waiting for CUID:
// AppsFlyerLib.getInstance().waitForCustomerUserId(false);
AppsFlyerLib.getInstance().init(afDevKey, conversionDataListener, this)
AppsFlyerLib.getInstance().start(this)
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
// Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this)
}
}
Para saber mais sobre como adiar a inicialização do SDK até que o ID de usuário cliente esteja disponível, acesse aqui.
Aviso
Use essa API somente nos casos em que é adequada para a sua lógica de negócios. Usar esta API aumenta a chance de discrepâncias e pode tornar o aplicativo mais exposto à fraude.
Google Advertising ID
A partir da versão 4.8.0 do SDK, a AppsFlyer coleta automaticamente a google_advertising_id
.
O requisito para coletar esse código de publicidade do Google é relevante apenas para as versões 4.7.X ou inferiores do SDK.
ID do OAID, IMEI e Android
Pelo menos um identificador de dispositivo exclusivo deve ser coletado para ativar a atribuição. Os seguintes identificadores estão disponíveis: GAID, ID do Android, IMEI e OAID.
GAID - Google Advertising ID (ID de publicidade do Google)
Coletado automaticamente de aplicativos que contêm o Google Play Services. Se o GAID estiver disponível , o IMEI e o ID do Android NÃO devem ser coletados pelo aplicativo para evitar a violação da política do Google Play.
IMEI e Android ID
Desabilitado por padrão. Pode ser coletado APENAS para aplicativos que NÃO contêm o Google Play Services
Observação: A partir do Android 10 (API nível 29), lançado no final de 2019, o acesso ao parâmetro IMEI é restrito.
Para enviar esses IDs para a AppsFlyer:
- No aplicativo, abra Coletar IMEI do dispositivo e/ou ID do Android.
- Chame as seguintes APIs ANTES de chamar o método
start
:
AppsFlyerLib.getInstance().setImeiData("IMEI_HERE"); AppsFlyerLib.getInstance().setAndroidIdData("ANDROID_ID_HERE");
OAID - Open Advertiser Identifier (Identificador aberto de anunciante)
Desativando a coleta de ID do dispositivo
Os desenvolvedores podem optar por não coletar IMEI, ID do Android e OAID usando as seguintes APIs:
AppsFlyerLib.getInstance().setCollectIMEI(false);
AppsFlyerLib.getInstance().setCollectAndroidID(false);
AppsFlyerLib.getInstance().setCollectOaid(false);
12. Privacidade do usuário
Exclusão (opt-out)
Em alguns casos extremos, talvez seja necessário encerrar todos os registros do SDK devido à conformidade legal e de privacidade. Isso pode ser obtido com a API stop
. Depois que essa API é chamada, o SDK para de funcionar e não se comunica mais com os servidores da AppsFlyer.
AppsFlyerLib.getInstance().stop(true, getApplicationContext());
AppsFlyerLib.getInstance().stop(true, applicationContext);
Há vários cenários diferentes para a exclusão (opt-out) de usuários. É altamente recomendado seguir as instruções exatas do cenário relevante para seu aplicativo.
O SDK pode ser reativado chamando:
AppsFlyerLib.getInstance().stop(false, getApplicationContext());
AppsFlyerLib.getInstance().start(getApplicationContext(), <AF_DEV_KEY>);
AppsFlyerLib.getInstance().stop(false, applicationContext);
AppsFlyerLib.getInstance().start(applicationContext, <AF_DEV_KEY>);
Não chame start
se stop
estiver definido como true
. Você pode verificar o estado atual do SDK chamando:
AppsFlyerLib.getInstance().isStopped() // retorna true se o SDK for interrompido, caso contrário retorna false
AppsFlyerLib.getInstance().isStopped // returns true if SDK is stopped, false otherwise
Aviso
Use a API stop somente nos casos em que você deseja ignorar totalmente esse usuário de todo e qualquer registro. O uso dessa API afeta gravemente sua atribuição, coleta de dados e mecanismo de links diretos.
Anonimizar dados de usuários
Use esta API durante a inicialização do SDK para anonimizar explicitamente as instalações, eventos e sessões de um usuário:
public void anonymizeUser(boolean isDisabled);
Exemplo de uso:
AppsFlyerLib.getInstance().anonymizeUser(true);
O registro pode ser reiniciado chamando AnonymizeUser
definido como false.
Aviso
A anonimização de usuários afeta GRAVEMENTE suas informações de atribuição.Use essa opção APENAS em regiões que legalmente impedem você de coletar informações de seus usuários.
Excluir parceiros da obtenção de dados
Em alguns casos, os anunciantes podem querer parar de compartilhar dados no nível do usuário com ad networks/parceiros para determinados usuários. Os motivos para isso incluem:
- Políticas de privacidade como CCPA ou GDPR
- Mecanismos para o usuário optar por não participar
- Concorrência com alguns parceiros (ad networks, terceiros)
A AppsFlyer fornece dois métodos de API para interromper o compartilhamento de dados com alguns ou todos os parceiros:
- SetSharingFilter: usado por anunciantes para definir algumas (uma ou mais) redes/parceiros integrados para excluir da obtenção de dados.
- SetSharingFilterForAllPartners: usado por anunciantes para excluir todas as redes/parceiros integrados da obtenção de dados.
Esses métodos de filtragem são suportados a partir do SDK V5.4.1.
O método de filtragem deve ser chamado sempre que o SDK é inicializado e afeta a sessão toda. Se demorar para determinar se você precisa definir os filtros de compartilhamento, adie a inicialização do SDK.
Quando o método for ativado antes do primeiro start chame:
- Os usuários de SRNs são atribuídos como orgânicos e seus dados não são compartilhados com parceiros integrados.
- Os usuários de ad networks de cliques (não-SRNs) são atribuídos corretamente na AppsFlyer, mas não são compartilhados com as ad networks por meio de postbacks, APIs, relatórios de dados brutos ou por qualquer outro método.
Atualmente, os dados de desinstalação não podem ser filtrados usando esses métodos. No entanto, você pode parar de enviar eventos de desinstalação para parceiros usando suas páginas de configuração na AppsFlyer.
Referência do SDK do Android
getAppsFlyerUID
Descrição |
Obtenha o ID da AppsFlyer. Para obter mais informações, consulte aqui. |
Assinatura de método |
|
Exemplo de uso |
|
onAppOpenAttribution
Descrição |
Obtenha dados de links diretos quando o aplicativo for aberto por meio de um link direto. |
Assinatura do método |
|
onAttributionFailure
Descrição |
Manipular erros na obtenção de dados de links diretos. |
Assinatura do método |
|
onConversionDataSuccess
Descrição |
Obter dados de conversão após uma instalação. É útil para ligação direta adiada. Observação: no SDK |
Assinatura do método |
|
onConversionDataFail
Descrição |
Manipular os erros ao não obter os dados de conversão das instalações. |
Assinatura do método |
|
onDeepLinking
Descrição |
Envie usuários móveis com e sem o seu aplicativo instalado para uma atividade in-app específica assim que o aplicativo for aberto. Saiba mais |
Assinatura do método |
|
onRequestFailure
Descrição |
Método callback para AppsFlyerTrackingRequestListener. Chamado quando o SDK deixa de relatar inicializações do aplicativo. |
Assinatura do método |
|
Exemplo de uso |
Consulte Configurando um listener de solicitação. |
onRequestSuccess
Descrição |
Método callback para AppsFlyerTrackingRequestListener. Chamado quando o SDK relata com êxito a inicialização do aplicativo. |
Assinatura do método |
|
Exemplo de uso |
Consulte Configurando um listener de solicitação. |
performOnAppAttribution
Descrição |
Essa função permite que os desenvolvedores disparem novamente OnAppOpenAttribution manualmente com um link específico (URI ou URL), sem gravar um reengajamento. Esse método pode ser necessário se o aplicativo precisar redirecionar usuários com base no link fornecido ou resolver a URL curta da AppsFlyer enquanto permanece em primeiro plano/aberto. Isso pode ser necessário porque o retorno de chamada onAppOpenAttribution regular só é chamado se o aplicativo foi aberto com o deep link. |
Assinatura do método |
|
Exemplo de uso |
|
logSession
Descrição |
Relatar sessões se seu aplicativo for um aplicativo utilitário executado em segundo plano. |
Assinatura do método |
|
Exemplo de uso |
|
SendDeeplinkData (descontinuado desde a V5.3.0)
Descrição |
Esse método não é mais usado para garantir que você obtenha dados de atribuição mesmo que o usuário tenha links diretos para uma atividade específica. Em vez disso, certifique-se de que start() tenha sido chamado. Para obter mais informações, consulte aqui. |
Assinatura do método |
|
Exemplo de uso |
|
sendPushNotificationData
Descrição |
Medir e obter dados de campanhas de notificação push. Para obter mais informações, consulte a medição de notificação push. |
Assinatura do método |
|
Exemplo de uso |
|
setAdditionalData
Descrição |
Adicionar dados adicionais a serem enviados para plataformas de parceiros externos. |
Assinatura do método |
|
Exemplo de uso |
Consulte a configuração de dados adicionais. |
setAndroidIdData
Descrição |
Enviar o ID do Android para a AppsFlyer. Veja o ID do OAID, IMEI e Android. |
Assinatura do método |
|
Exemplo de uso |
|
setAppInviteOneLink
Descrição |
Definir o ID de modelo do OneLink usado para criar links de atribuição personalizados para convites do usuário. |
Assinatura do método |
|
Exemplo de uso |
Consulte a configuração do OneLink para atribuição de convite de usuário. |
setCollectAndroidID
Descrição |
Indicar se o ID do Android deve ser enviado à AppsFlyer. |
Assinatura do método |
|
Exemplo de uso |
Veja o ID do OAID, IMEI e Android. |
setCollectIMEI
Descrição |
Indicar se o IMEI deve ser enviado à AppsFlyer. |
Assinatura do método |
|
Exemplo de uso |
Veja o ID do OAID, IMEI e Android. |
setCustomerIdAndLogSession
Descrição |
Inicia o SDK assim que um ID de usuário cliente estiver disponível. Para obter mais informações, consulte o atraso da init do SDK para o ID de usuário cliente. |
Assinatura do método |
|
Exemplo de uso |
|
Definir ID de usuário cliente
Descrição |
Definir o ID de usuário cliente. Para obter mais informações, consulte a configuração do ID de usuário cliente. |
Assinatura do método |
|
Exemplo de uso |
|
setDebugLog
Descrição |
Ativar logs de depuração. Consulte a depuração para Android. |
Assinatura do método |
|
Exemplo de uso |
|
anonymizeUser
Descrição |
Anonimizar as instalações, os eventos e as sessões de um usuário. Para obter mais informações, consulte a anonimização de dados do usuário. |
Assinatura do método |
|
Exemplo de uso |
|
setLogLevel
Descrição |
Definir o nível de log do SDK da AppsFlyer. |
Assinatura do método |
|
Exemplo de uso |
|
setMinTimeBetweenSessions
Descrição |
Definir o tempo mínimo entre as sessões. Para obter mais informações, consulte tempo personalizado entre as sessões. |
Assinatura do método |
|
Exemplo de uso |
|
setOaidData
Descrição |
Envie o OAID para a AppsFlyer. Veja o ID do OAID, IMEI e Android. |
Assinatura do método |
|
Exemplo de uso |
|
setOutOfStore
Descrição |
Especificar a loja de aplicativos alternativa da qual o aplicativo foi baixado. |
Assinatura do método |
|
Exemplo de uso |
|
setPartnerData
Descrição |
Parceiros e anunciantes podem adicionar mais dados a eventos do SDK. |
Assinatura do método |
|
Exemplo de uso |
|
setPreinstallAttribution
Descrição |
Definir o SDK para relatar a pré-instalação quando um aplicativo pré-instalado é iniciado. |
Assinatura do método |
|
Exemplo de uso |
Consulte as campanhas de pré-instalação para Android. |
setResolveDeepLinkURLs
Descrição |
Resolver o OneLink de domínios de clique. Para obter mais informações, consulte a resolução de URLs de links diretos agrupados. |
Assinatura do método |
|
Exemplo de uso |
|
setSharingFilter
Descrição |
Usado por anunciantes para definir algumas (uma ou mais) redes/parceiros integrados para excluir da obtenção de dados. Saiba mais |
Assinatura do método |
|
Exemplo de uso |
|
setSharingFilterForAllPartners
Descrição |
Usado por anunciantes para excluir todas as redes/parceiros integrados da obtenção de dados. Saiba mais |
Assinatura do método |
|
Exemplo de uso |
|
iniciar
Descrição |
Iniciar o SDK na inicialização do aplicativo. Para obter mais informações, consulte a inicialização do SDK. |
Assinatura do método |
|
Exemplo de uso |
|
stop
Descrição |
Encerrar todas as funcionalidades do SDK. Para obter mais informações, consulte privacidade do usuário — optar por não participar. |
Assinatura do método |
|
Exemplo de uso |
|
TrackApplLaunch (descontinuado desde a V5.2.0)
Descrição |
Este método foi descontinuado. Use start no lugar dele. Tem duas funções:
|
Assinatura do método |
|
Exemplo de uso |
|
logEvent
Descrição |
Enviar eventos in-app para a AppsFlyer. Para obter mais informações, consulte o registro de eventos in-app. |
Assinatura do método |
|
Exemplo de uso |
|
updateServerUninstallToken
Descrição |
Para desenvolvedores que usam o Firebase para outros fins que não sejam a métrica de desinstalação. Para obter mais informações, consulte a métrica de desinstalação. |
Assinatura do método |
|
Exemplo de uso |
|
waitForCustomerUserId
Descrição |
Adiar a inicialização do SDK até que o ID de usuário cliente seja definido. |
Assinatura do método |
|
Exemplo de uso |
|
appendParametersToDeepLinkingURL
Descrição |
Permite que os proprietários de aplicativos que usam links de aplicativos para links diretos (sem OneLink) atribuam sessões iniciadas por meio de um domínio associado ao aplicativo. Chame este método antes de chamar start.
|
Assinatura do método |
|
Exemplo de uso |
|
addPushNotificationDeepLinkPath
Descrição |
Configure como o SDK extrai valores de deep link dos payloads de notificação push. |
Assinatura do método |
|
Exemplo de uso |
Esta chamada corresponde à seguinte estrutura de payload:
|
APIs descontinuadas
Uma API descontinuada significa que o método será substituído. Este é um bom momento para os desenvolvedores fazerem um upgrade do código.
A data de término é quando o método deixa de funcionar ou continua a trabalhar com capacidades limitadas.
API/nome da interface | Descontinuado desde a versão | Data da descontinuação (EN: Sunset date) | Mudou para |
---|---|---|---|
trackAppLaunch |
5.2.0 |
2020-10-14 |
|
sendDeepLinkData |
5.3.0 |
2020-10-14 |
|
stopTracking |
6.0.0 |
|
stop |
setCustomerIdAndTrack |
6.0.0 |
|
setCustomerIdAndLogSession |
startTracking |
6.0.0 |
|
iniciar |
trackLocation |
6.0.0 |
|
logLocation |
reportTrackSession |
6.0.0 |
|
logSession |
trackEvent |
6.0.0 |
|
logEvent |
setDeviceTrackingDisabled |
6.0.0 |
|
anonymizeUser |
validateAndTrackInAppPurchase |
6.0.0 |
|
validateAndLogInAppPurchase |
isStopTracking |
6.0.0 |
|
isStopped |
trackAndOpenStore |
6.0.0 |
|
logAndOpenStore |
trackCrossPromoteImpression |
6.0.0 |
|
logCrossPromoteImpression |
trackInvite |
6.0.0 |
|
logInvite |
AppsFlyerTrackingRequestListener |
6.0.0 |
|
AppsFlyerRequestListener |
Comentários
Por favor, entrar para comentar.