Deferred deep linking estendido do Android
Visão Geral
O deferred deep linking permite deep links para novos usuários em determinados cenários:
- Quando o UDL retornar
NOT_FOUND
even though a relevant install occurred.
Main example for such a scenario:- O tempo entre o clique e a instalação excede a janela de lookback do UDL (15 minutos).
- Quando o UDL retornar
FOUND
mas os dados de deep linking não têm parâmetros, que não sãodeep_link_value
anddeep_link_sub1-10
.
Exemplos principais para tais cenários:- Clicar em um link em uma rede de autorrelato (SRN), como anúncios do Meta ou Twitter.
- Clicar em um link que não contém
deep_link_value
ordeep_link_sub1-10
usado para deep linking, por exemplo, links antigos criados antes dedeep_link_value
que ainda estão em uso.
Para permitir deferred deep linking quando o UDL retornar NOT_FOUND
, onConversionDataSuccess
deve verificar se deve lidar com o deferred deep linking.
onConversionDataSuccess
faz parte da API Get Conversion Data (GCD). Seu principal objetivo é coletar dados de conversão dentro do dispositivo.
No caso de uso descrito aqui onConversionDataSuccess
aproveita o fato de que todos os parâmetros de deferred deep linking serem passados para o callback, além dos dados de conversão.
Pré-requisitos
- Implemente Unified Deep Linking para manipular com deferred deep linking e deep links.
- Implemente
onConversionDataSuccess
para lidar com deferred deep linking usando a API GCD.
Implementação
onConversionDataSuccess
deve detectar casos em que devem ocorrer deferred deep linking que o UDL não manipulou.onConversionDataSuccess
deve encaminhar o usuário para o destino de deferred deep linking com base nos parâmetros de deep linking passados para o callback.
Exemplo de código
Code dissect
- Implementar o ouvinte da API Get Conversion Data
AppsFlyerConversionListener
.Todos os métodos do ouvinte devem ser implementados, mesmo que
onAppOpenAttribution
andonAttributionFailure
são mutuamente exclusivos com UDL e não serão chamados. - Detecte cenários de deferred deep linking filtrando a carga de dados de conversão com:
af_status == Non-organic
is_first_launch == true
- Quando deferred deep linking forem detectados, filtre os casos que já foram tratados pelo UDL.
No exemplo a seguir, todos os links contêmdeep_link_value
.
Recomenda-se que o UDL sinalize com um sinalizador que o deferred deep linking já foi tratado eonConversionDataSuccess
deve ser pulado. onConversionDataSuccess
deve verificar se os dados de conversão contêm parâmetros usados para rotear usuários dentro do aplicativo. Por exemplofruit_name
no exemplo a seguir.- Encaminhe o usuário para o destino do deferred deep linking.
Code snippet
AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
@Override
public void onConversionDataSuccess(Map<String, Object> conversionDataMap) {
String status = Objects.requireNonNull(conversionDataMap.get("af_status")).toString();
if(status.equals("Non-organic")){
if( Objects.requireNonNull(conversionDataMap.get("is_first_launch")).toString().equals("true")){
Log.d(LOG_TAG,"Conversion: First Launch");
//Deferred deep link in case of a legacy link
if(conversionDataMap.containsKey("fruit_name")){
if (conversionDataMap.containsKey("deep_link_value")) { //Not legacy link
Log.d(LOG_TAG,"onConversionDataSuccess: Link contains deep_link_value, deep linking with UDL");
}
else{ //Legacy link
conversionDataMap.put("deep_link_value", conversionDataMap.get("fruit_name"));
String fruitNameStr = (String) conversionDataMap.get("fruit_name");
DeepLink deepLinkData = mapToDeepLinkObject(conversionDataMap);
goToFruit(fruitNameStr, deepLinkData);
}
}
} else {
Log.d(LOG_TAG,"Conversion: Not First Launch");
}
} else {
Log.d(LOG_TAG, "Conversion: This is an organic install.");
}
}
@Override
public void onConversionDataFail(String errorMessage) {
Log.d(LOG_TAG, "error getting conversion data: " + errorMessage);
}
@Override
public void onAppOpenAttribution(Map<String, String> attributionData) {
Log.d(LOG_TAG, "onAppOpenAttribution: This is fake call.");
}
@Override
public void onAttributionFailure(String errorMessage) {
Log.d(LOG_TAG, "error onAttributionFailure : " + errorMessage);
}
};
⇲ Links do Github: Java
Testes
Importante
O cenário de teste a seguir demonstra o tratamento de deferred deep linking de links que contêm parâmetros personalizados, mas não parâmetros
deep_link_value
anddeep_link_sub1-10
.
Este cenário de teste também é relevante para todos os deferred deep linking estendidos descritos anteriormente.
Before you begin
- Conclua a implementação descrita anteriormente.
- Registre seu dispositivo de teste.
- Ative o modo de depuração no aplicativo.
- Verifique se o aplicativo não está instalado no seu dispositivo.
Test link
Você pode usar um link do OneLink existente ou pedir ao seu profissional de marketing para criar um novo para teste. Podem ser usadas URLs curtas e longas do OneLink.
Adicionando parâmetros ad hoc ao link
- Use apenas o domínio e template do OneLink do seu link, por exemplo:
https://onelink-basic-app.onelink.me/H5hv
. - Adicionar parâmetros personalizados do OneLink diferentes de
deep_link_value
anddeep_link_sub1-10
, conforme esperado pelo seu aplicativo. - Os parâmetros devem ser adicionados como parâmetros de consulta .
- Exemplo:
https://onelink-basic-app.onelink.me/H5hv?deep_link_value=apples&deep_link_sub1=23
- Exemplo:
Perform the test
- Clique no link no seu dispositivo.
- O OneLink redireciona você de acordo com a configuração do link para o Google Play ou um site.
- Instale o aplicativo.
Importante
- Se o aplicativo ainda estiver em desenvolvimento e ainda não tiver sido carregado na loja, a seguinte imagem será exibida:
- Instale o aplicativo do Android Studio ou qualquer outro IDE que você usa.
- Se o aplicativo ainda estiver em desenvolvimento e ainda não tiver sido carregado na loja, a seguinte imagem será exibida:
- O UDL detecta o deferred deep linking, corresponde a instalação ao clique e recupera os parâmetros do OneLink para o callback
onDeepLinking
. UDL não encontrará nenhum parâmetro para rotear e sair. onConversionDataSuccess
callback é chamado com os dados de conversão, que contém parâmetros personalizados e dados de atribuição.onConversionDataSuccess
define os parâmetros personalizados para rotear o usuário dentro do aplicativo.
Expected logs results
Os logs a seguir estão disponíveis apenas quando o modo de depuração está ativado.
-
SDK inicializado:
D/AppsFlyer_6.9.0: Initializing AppsFlyer SDK: (v6.9.0.126)
-
O registro a seguir refere-se a deep links diretos e pode ser ignorado em um cenário de deferred deep linking:
D/AppsFlyer_6.9.0: No deep link detected
-
A API UDL começa:
D/AppsFlyer_6.9.0: [DDL] start
-
O UDL envia uma consulta à AppsFlyer para consultar uma correspondência com esta instalação:
D/AppsFlyer_6.9.0: [DDL] Preparing request 1 ... I/AppsFlyer_6.9.0: call = https://dlsdk.appsflyer.com/v1.0/android/com.appsflyer.onelink.appsflyeronelinkbasicapp?af_sig=<>&sdk_version=6.9; size = 239 bytes; body = { ... TRUNCATED ... }
-
UDL obteve uma resposta e chama o callback
onDeepLinking
comstatus=FOUND
e dados de link do OneLink:D/AppsFlyer_6.9.0: [DDL] Calling onDeepLinking with: {"deepLink":"{\"campaign_id\":\"\",\"af_sub3\":\"\",\"match_type\":\"probabilistic\",\"af_sub1\":\"\",\"deep_link_value\":\"\",\"campaign\":\"\",\"af_sub4\":\"\",\"timestamp\":\"2022-12-07T09:32:52.256\",\"click_http_referrer\":\"\",\"af_sub5\":\"\",\"media_source\":\"\",\"af_sub2\":\"\",\"is_deferred\":true}","status":"FOUND"}
-
O GCD está buscando os dados de conversão:
GET:https://gcdsdk.appsflyer.com/install_data/v4.0/com.appsflyer.onelink.appsflyeronelinkbasicapp?devkey=XXXXXXXXX&device_id=1670405582645-822555416155480367
onConversionDataSuccess
é chamado com dados de conversão como entrada:
D/AppsFlyer_6.9.0: [GCD-A02] Calling onConversionDataSuccess with:
{
...
is_first_launch=true,
...
fruit_amount=56,
fruit_name=apples,
...
af_status=Non-organic,
...
}
Atualizado 9 meses atrás