- SDK Version: 6.1.1 (Release Notes)
- Versões do SDK descontinuadas
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.
1. Visão geral
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) |
Medir eventos e receita no aplicativo, ativar links diretos 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 loja para aplicativos Android, como Amazon e Baidu
As seções a seguir descrevem como implementar e inicializar o SDK da AppsFlyer. Depois de concluir esta seção, você verá duas instalações no painel da AppsFlyer: orgânica e não orgânica.
2. Adicione o SDK ao seu aplicativo
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
Google deprecated the BroadcastReceiver in March 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" /> <!-- Optional : --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
2.4 Defina BroadcastReceiver para obter dados do Google Play
Nota
Google deprecated the BroadcastReceiver in March 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
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.3 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.
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 links diretos, adicione a API
start()
a qualquer outra Atividade à qual você possa vincular links diretos 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.
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:
https://app.appsflyer.com/<app_id>?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 Overview (Visão geral) do painel 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.
Essa aba explica como gravar eventos in-app e receita, e como configurar links diretos.
A gravação de eventos in-app e receitas permite avaliar a qualidade de seus usuários. Os links diretos permitem fornecer aos usuários a melhor experiência.
Essa aba contém instruções para desenvolvedores, mas a contribuição do profissional de marketing é essencial porque:
- O profissional de marketing deve decidir quais eventos in-app precisam ser gravados para avaliar a qualidade do usuário.
- O profissional de marketing tem acesso ao painel da AppsFlyer, que é necessário para configurar o Onelink para os links diretos.
5. Gravação de eventos in-app
Os eventos in-app fornecem insight do que está acontecendo em seu aplicativo. Recomendamos reservar um tempo e definir os eventos que você deseja gravar. A gravação de eventos in-app ajuda a medir KPIs, como ROI (retorno sobre o investimento) e LTV (valor de vida útil).
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, comércio eletrônico, etc., 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 obter 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 $1234,56 em receita associada a ele, aparecendo 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 vier posteriormente até a próxima resposta 200 é 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 o 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
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.
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 três domínios de clique que redirecionam para o OneLink, que é https://mysubdomain.onelink.me/abCD. Use esta 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 destes domínios de clique e, depois, é possível usar os dados deste Onelink para aplicar links diretos 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ção cruzada
A AppsFlyer permite que você atribua e registre instalações originadas de uma promoção cruzada de um de seus aplicativos de dentro do aplicativo atual do usuário. 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)
}
}
To learn more about delaying the SDK initialization until the Customer User ID is available, go here.
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
Disabled by default. Can be collected ONLY for apps that do NOT contain Google Play Services.
Note: Starting with Android 10 (API level 29), released in late 2019, access to the IMEI parameter is restricted.
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 isStopped. Depois que essa API é chamada, o SDK para de funcionar e não se comunica mais com os servidores da AppsFlyer.
AppsFlyerLib.getInstance().isStopped(true, context);
There are several different scenarios for user opt-out. We highly recommend following the exact instructions for the scenario, that is relevant for your app.
Em qualquer evento, o SDK pode ser reativado chamando a mesma API passando o valor "false".
Importante
Não chame start
se isStopped
estiver definido como true
Para começar a registrar assim que IsStopped
estiver definido como false
, use a seguinte API do SDK:
AppsFlyerLib.getInstance().start(getApplicationContext(), AF_DEV_KEY);
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 prejudica 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.
getAppsFlyerUID
Descrição |
Obtenha o ID da AppsFlyer. Veja aqui para mais informações. |
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. Nota: Iniciando o SDK V5, o nome do método para obter dados de conversão é |
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 link direto. |
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 |
|
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 |
|
parar
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 a métrica de desinstalação. Para obter mais informações, consulte 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 |
|
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 |
14/10/2020 |
|
sendDeepLinkData |
5.3.0 |
14/10/2020 |
|
stopTracking |
6.0.0 |
|
parar |
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.