Enlaces profundos diferidos extendidos de Android
Resumen General
Los enlaces profundos diferidos extendidos permiten los enlaces profundos para nuevos usuarios en ciertos escenarios:
- Cuando UDL devuelve
NOT_FOUND
even though a relevant install occurred.
Main example for such a scenario:- El tiempo entre el clic y la instalación excede la ventana retrospectiva UDL (15 minutos).
- Cuando UDL devuelve
FOUND
pero a los datos de enlaces profundos les faltan parámetros, que no sondeep_link_value
anddeep_link_sub1-10
.
Principales ejemplos para tales escenarios:- Al hacer clic en un enlace en una red de autorreporte (SRN), como Anuncios de Meta o Twitter.
- Al hacer clic en un enlace que no contiene
deep_link_value
ordeep_link_sub1-10
utilizados para enlaces profundos, por ejemplo, enlaces antiguos creados antes de quedeep_link_value
existiera que todavía están en uso.
Para permitir los enlaces profundos diferidos cuando UDL devuelve la devolución de llamada NOT_FOUND
, onConversionDataSuccess
, debes verificar si debe manejar los enlaces profundos diferidos.
onConversionDataSuccess
forma parte de la API Get Conversion Data (GCD). Su propósito principal es recopilar datos de conversión dentro del dispositivo.
En el caso de uso que se describe aquí, onConversionDataSuccess
aprovecha el hecho de que todos los parámetros de enlaces profundos diferidos se transmiten a la devolución de llamada, además de los datos de conversión.
Requisitos previos
- Implementar enlaces profundos unificados para manejar tanto los enlaces profundos diferidos como los enlaces profundos directos.
- Implementar
onConversionDataSuccess
para manejar los enlaces profundos diferidos usando la API de GCD.
Implementación
onConversionDataSuccess
debe detectar los casos en los que debería ocurrir un enlace profundo diferido que UDL no manejó.onConversionDataSuccess
debe enrutar al usuario al destino de enlace profundo diferido en función de los parámetros de enlace profundo transmitidos a la devolución de llamada.
Ejemplo de código
Code dissect
- Implementa el oyente de la API Get Conversion Data
AppsFlyerConversionListener
.Todos los métodos del oyente deben ser implementados, aunque
onAppOpenAttribution
andonAttributionFailure
son mutuamente excluyentes con UDL, y no serán llamados. - Detecta escenarios de enlaces profundos diferidos filtrando la carga útil de los datos de conversión con:
af_status == Non-organic
is_first_launch == true
- Cuando se detectan enlaces profundos diferidos, filtra los casos que ya fueron manejados por UDL.
En el ejemplo que sigue, todos los enlaces contienendeep_link_value
.
Se recomienda que UDL señale con un indicador que el enlace profundo diferido ya se ha manejado, yonConversionDataSuccess
debe omitirse. onConversionDataSuccess
debe verificar que los datos de conversión contienen los parámetros que se utilizan para enrutar a los usuarios dentro de la aplicación. Por ejemplo:fruit_name
en el ejemplo que sigue.- Enruta al usuario al destino de enlace profundo diferido.
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);
}
};
⇲ Enlaces de Github: Java
Pruebas
Importante
El siguiente escenario de prueba demuestra el manejo de enlaces profundos diferidos desde enlaces que contienen parámetros personalizados pero no los parámetros
deep_link_value
anddeep_link_sub1-10
.
Este escenario de prueba también es relevante para todos los enlaces profundos diferidos extendidos descritos anteriormente.
Before you begin
- Completa la implementación descrita anteriormente.
- Registrar tu dispositivo de prueba.
- Activa el modo de depuración en la aplicación.
- Asegúrate de que la aplicación no esté instalada en tu dispositivo.
Test link
Puedes usar un enlace de OneLink existente o pedirle a tu marketer que cree uno nuevo para probar. Se pueden usar URL de OneLink tanto cortas como largas.
Agregar parámetros ad-hoc al enlace
- Utiliza solo el dominio y la plantilla de OneLink de tu enlace, por ejemplo:
https://onelink-basic-app.onelink.me/H5hv
. - Agrega parámetros personalizados de OneLink que no sean
deep_link_value
anddeep_link_sub1-10
, según lo esperado por tu aplicación. - Los parámetros deben agregarse como parámetros de la consulta.
- Ejemplo:
https://onelink-basic-app.onelink.me/H5hv?deep_link_value=apples&deep_link_sub1=23
- Ejemplo:
Perform the test
- Haz clic en el enlace en tu dispositivo.
- OneLink te redirige de acuerdo con la configuración del enlace a Google Play o a un sitio web.
- Instala la aplicación.
Importante
- Si la aplicación aún está en desarrollo y aún no se ha subido a la tienda, se muestra esta imagen:
- Instala la aplicación desde Android Studio o cualquier otro IDE que utilices.
- Si la aplicación aún está en desarrollo y aún no se ha subido a la tienda, se muestra esta imagen:
- UDL detecta los enlaces profundos diferidos, empareja la instalación con el clic y recupera los parámetros de OneLink para la devolución de llamada de
onDeepLinking
. UDL no encontrará ningún parámetro para enrutar y salir. onConversionDataSuccess
es la devolución de llamada que se llama con los datos de conversión, que contienen tanto parámetros personalizados como datos de atribución.onConversionDataSuccess
establece los parámetros personalizados para enrutar al usuario dentro de la aplicación.
Expected logs results
Los siguientes registros solo están disponibles cuando el modo de depuración está habilitado.
-
SDK inicializado:
D/AppsFlyer_6.9.0: Initializing AppsFlyer SDK: (v6.9.0.126)
-
El siguiente registro hace referencia a los enlaces profundos directos y se puede ignorar en un escenario de enlaces profundos diferidos:
D/AppsFlyer_6.9.0: No deep link detected
-
La API UDL se inicia:
D/AppsFlyer_6.9.0: [DDL] start
-
UDL envía una consulta a AppsFlyer para consultar una coincidencia con esta instalación:
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 obtuvo una respuesta y llama a la devolución de llamada de
onDeepLinking
constatus=FOUND
y datos del enlace de 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"}
-
GCD está recopilando los datos de conversión:
GET:https://gcdsdk.appsflyer.com/install_data/v4.0/com.appsflyer.onelink.appsflyeronelinkbasicapp?devkey=XXXXXXXXX&device_id=1670405582645-822555416155480367
onConversionDataSuccess
se llama con los datos de conversión 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,
...
}
Actualizado hace 11 meses