API heredadas de Android
Enlaces profundos directos
Overview
Los enlaces profundos directos dirigen a los usuarios móviles a una actividad o contenido específico dentro de una aplicación, si la aplicación ya está instalada.
Este enrutamiento in-app a una actividad específica en la aplicación es posible gracias a los parámetros que se transmiten a la aplicación cuando el sistema operativo abre la aplicación y se llama al método onAppOpenAttribution
method is called. AppsFlyer's OneLink ensures that the correct value is passed along with the user's click, thus personalizing the user’s app experience.
Only the deep_link_value
is required for deep linking. However, other parameters and values (such as custom attribution parameters) can also be added to the link and returned by the SDK as deep linking data.
El flujo de enlace profundo directo funciona de la siguiente manera:
- El usuario hace clic en la URL corta de OneLink.
- Android inicia la aplicación según la actividad relevante en AndroidManifest.xml.
- El SDK de AppsFlyer se activa en la aplicación.
- El SDK de AppsFlyer recupera los datos de OneLink.
- En una URL corta, los datos se recuperan de la API de resolución de URL corta en los servidores de AppsFlyer.
- En una URL larga, los datos se recuperan directamente de la URL larga.
- AppsFlyer SDK triggers
onAppOpenAttribution()
with the retrieved parameters and cached attribution parameters (e.g.install_time
). - Asynchronously,
onConversionDataSuccess()
is called, holding the full cached attribution data. (You can exit this function by checking ifis_first_launch
istrue
.) onAppOpenAttribution()
utiliza el mapa de attributionData para enviar otras actividades en la aplicación y transmitir los datos relevantes.- Esto crea la experiencia personalizada para el usuario, que es el objetivo principal de OneLink.
Procedures
To implement the onAppOpenAttribution
y configurar los comportamientos de los parámetros, se debe completar la siguiente lista de verificación de acciones de los procedimientos.
Lista de verificación de procedimientos
- Decidir el comportamiento de las aplicaciones y el
deep_link_value
(and other parameter names and values) - with the marketer - Planificar el método de entrada, p. ej.
deep_link_value
(and other parameter names and values) - with the marketer - Implementar la lógica
onAppOpenAttribution()
logic - Implementar la lógica
onAttributionFailure()
logic
Decidir el comportamiento de la aplicación
Para decidir cuál es el comportamiento de la aplicación cuando se hace clic en el enlace:
Obtener del marketer: el comportamiento esperado del enlace cuando se hace clic en él.
Planificar la entrada del método
When a OneLink is clicked and the user has the app installed on their device, the onAppOpenAttribution
method is called by the AppsFlyer SDK. This is referred to as a retargeting re-engagement.
The onAppOpenAttribution
obtiene las variables en una entrada como esta: Map <String, String>
.
La estructura de los datos de entrada se describe aquí.
Implementación de la lógica onAppOpenAttribution()
The deep link opens the onAppOpenAttribution
en la actividad principal. Los parámetros de OneLink en la entrada del método se utilizan para implementar la experiencia de usuario específica cuando se abre la aplicación.
Ejemplo de código:
@Override
public void onAppOpenAttribution(Map<String, String> attributionData) {
if (!attributionData.containsKey("is_first_launch"))
Log.d(LOG_TAG, "onAppOpenAttribution: This is NOT deferred deep linking");
for (String attrName : attributionData.keySet()) {
String deepLinkAttrStr = attrName + " = " + attributionData.get(attrName);
Log.d(LOG_TAG, "Deeplink attribute: " + deepLinkAttrStr);
}
Log.d(LOG_TAG, "onAppOpenAttribution: Deep linking into " + attributionData.get("deep_link_value"));
goToFruit(attributionData.get("deep_link_value"), attributionData);
}
@Override
public void onAttributionFailure(String errorMessage) {
Log.d(LOG_TAG, "error onAttributionFailure : " + errorMessage);
}
private void goToFruit(String fruitName, Map<String, String> dlData) {
String fruitClassName = fruitName.concat("Activity");
try {
Class fruitClass = Class.forName(this.getPackageName().concat(".").concat(fruitClassName));
Log.d(LOG_TAG, "Looking for class " + fruitClass);
Intent intent = new Intent(getApplicationContext(), fruitClass);
if (dlData != null) {
// Map is casted HashMap since it is easier to pass serializable data to an intent
HashMap<String, String> copy = new HashMap<String, String>(dlData);
intent.putExtra(DL_ATTRS, copy);
}
startActivity(intent);
} catch (ClassNotFoundException e) {
Log.d(LOG_TAG, "Deep linking failed looking for " + fruitName);
e.printStackTrace();
}
}
⇲ Enlaces de Github: Java
Nota
onAppOpenAttribution
no se llama cuando la aplicación se está ejecutando en segundo plano y el ApplicationLaunchMode
no es estándar.
Para corregir esto, llama al métodosetIntent(intent)
para establecer el valor intent dentro del método anuladoonNewIntent
si la aplicación está utilizando un método no estándarLaunchMode
.import android.content.Intent; ... ... ... @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); }
Implementar la lógica onAttributionFailure()
The onAttributionFailure
method is called whenever the call to onAppOpenAttribution
fails. The function should report the error and create an expected experience for the user.
@Override
public void onAttributionFailure(String errorMessage) {
Log.d(LOG_TAG, "error onAttributionFailure : " + errorMessage);
}
⇲ Enlaces de Github: Java
Enlaces profundos diferidos
Overview
El Deferred Deep Linking dirige a los nuevos usuarios primero a la tienda de aplicaciones correcta para instalar la aplicación y luego, después de la primera apertura, a una experiencia específica de la aplicación (por ejemplo, una página específica en la aplicación).
When the user first launches the app, the onConversionDataSuccess
callback function receives both the conversion data of the new user, and OneLink data. The OneLink data makes in-app routing possible due to the deep_link_value
u otro que se transmite a la aplicación cuando el sistema operativo abre la aplicación.
Only the deep_link_value
is required for deep linking. However, other parameters and values (such as custom attribution parameters) can also be added to the link and returned by the SDK as deep linking data. The AppsFlyer OneLink ensures that the correct parameters are passed along with the user's click, thus personalizing the user’s app experience.
The marketer and developer must coordinate regarding desired app behavior and deep_link_value
. The marketer uses the parameters to create deep links, and the developer customizes the behavior of the app based on the value received.
Es responsabilidad del desarrollador asegurarse de que los parámetros se manejen correctamente en la aplicación, tanto para el enrutamiento dentro de la aplicación como para personalizar los datos en el enlace.
El flujo de enlace profundo diferido funciona de la siguiente manera:
- El usuario hace clic en el OneLink en un dispositivo en el que la aplicación no está instalada.
- AppsFlyer registra el clic y redirige el usuario a la tienda de aplicaciones o la página de aterrizaje correctas.
- El usuario instala la aplicación y la inicia.
- El SDK de AppsFlyer se inicializa y la instalación se atribuye en los servidores de AppsFlyer.
- The SDK triggers the
onConversionDataSuccess
method. The function receives input that includes both thedeep_link_value
, and the attribution data/parameters defined in the OneLink data. - El parámetro
is_first_launch
has the valuetrue
, que indica el flujo de Deferred Deep Linking.
El desarrollador utiliza los datos recibidos en elonConversionDataSuccess
para crear una experiencia personalizada para el usuario en la primera apertura de la aplicación.
Procedures
To implement the onConversionDataSuccess
method and set up the parameter behaviors, the following action checklist of procedures need to be completed.
- Decidir el comportamiento de la aplicación en el primer inicio, y el
deep_link_value
(and other parameter names and values) - with the marketer - Planificar el método de entrada, p. ej.
deep_link_value
(and other parameter names and values) - with the marketer - Implementar la lógica
onConversionDataSuccess()
logic - Implementar la lógica
onConversionDataFail()
logic
Decidir el comportamiento de la aplicación en el primer inicio
Para decidir el comportamiento de la aplicación en el primer inicio:
Obtener del marketer: el comportamiento esperado del enlace cuando se hace clic y la aplicación se abre por primera vez.
Planificar la entrada del método
For deferred deep linking, the onConversionDataSuccess
method input must be planned and the input decided in the previous section (for deep linking) is made relevant for the first time the app is launched.
The onConversionDataSuccess
method gets the deep_link_value
y otras variables como una entrada como esta: Map <String, Object>.
El mapa contiene dos tipos de datos:
- Datos de atribución
- Data defined by the marketer in the link (
deep_link_value
and other parameters and values)
Other parameters can be either:- Parámetros oficiales de AppsFlyer.
- Parámetros y valores personalizados elegidos por el marketer y el desarrollador.
- La estructura de los datos de entrada se describe aquí.
The marketer and developers need to plan the deep_link_value
(and other possible parameters and values) together based on the desired app behavior when the link is clicked.
To plan the deep_link_value
, and other parameter names and values based on the expected link behavior:
- Dile al marketer qué parámetros y valores se necesitan para implementar el comportamiento deseado de la aplicación.
- Decide on naming conventions for the
deep_link_value
and other parameters and values.
Note:- Los parámetros personalizados no aparecerán en el raw data recopilado en AppsFlyer.
- Los datos de conversión no devolverán un parámetro personalizado llamado "name, " con una "n" minúscula.
Implementación de la lógica onConversionDataSuccess()
When the app is opened for the first time, the onConversionDataSuccess
method is triggered in the main activity. The deep_link_value
and other parameters in the method input are used to implement the specific user experience when the app is first launched.
Para implementar la lógica:
- Implementa la lógica basada en los parámetros y valores elegidos. Consulta el siguiente ejemplo de código.
- Una vez completado, envía la confirmación al marketer de que la aplicación se comporta en consecuencia.
Código de muestra
@Override
public void onConversionDataSuccess(Map<String, Object> conversionData) {
for (String attrName : conversionData.keySet())
Log.d(LOG_TAG, "Conversion attribute: " + attrName + " = " + conversionData.get(attrName));
String status = Objects.requireNonNull(conversionData.get("af_status")).toString();
if(status.equals("Non-organic")){
if( Objects.requireNonNull(conversionData.get("is_first_launch")).toString().equals("true")){
Log.d(LOG_TAG,"Conversion: First Launch");
if (conversionData.containsKey("deep_link_value")){
Log.d(LOG_TAG,"Conversion: This is deferred deep linking.");
// TODO SDK in future versions - match the input types
Map<String,String> newMap = new HashMap<>();
for (Map.Entry<String, Object> entry : conversionData.entrySet()) {
newMap.put(entry.getKey(), String.valueOf(entry.getValue()));
}
onAppOpenAttribution(newMap);
}
} else {
Log.d(LOG_TAG,"Conversion: Not First Launch");
}
} else {
Log.d(LOG_TAG,"Conversion: This is an organic install.");
}
}
⇲ Enlaces de Github: Java
Implementación de la lógica onConversionDataFailure()
The onConversionDataFailure
method is called whenever the call to onConversionDataSuccess
fails. The function should report the error and create an expected experience for the user.
To implement the onConversionDataFailure
método:
@Override
public void onConversionDataFail(String errorMessage) {
Log.d(LOG_TAG, "error getting conversion data: " + errorMessage);
}
⇲ Enlaces de Github: Java
Cargas útiles de muestra de Android
Consulta las siguientes cargas útiles de muestra para enlaces de aplicaciones, esquemas URI y Deferred Deep Linking. Las muestras contienen una carga útil completa, relevante para cuando todos los parámetros de la página de configuración de enlaces personalizados de Onelink contienen datos.
Nota: Las cargas útiles se devuelven como un mapa. Sin embargo, para mayor claridad, las cargas útiles de muestra que siguen se muestran en formato JSON.
Android App Links
Entrada en onAppOpenAttribution(Map<String, String> attributionData)
{
"af_dp": "afbasicapp://mainactivity",
"af_ios_url": "https://isitchristmas.com/",
"fruit_name": "apples",
"c": "fruit_of_the_month",
"media_source": "Email",
"link": "https://onelink-basic-app.onelink.me/H5hv/6d66214a",
"pid": "Email",
"af_cost_currency": "USD",
"af_sub1": "my_sub1",
"af_click_lookback": "20d",
"af_adset": "my_adset",
"af_android_url": "https://isitchristmas.com/",
"af_sub2": "my_sub2",
"fruit_amount": 26,
"af_cost_value": 6,
"campaign": "fruit_of_the_month",
"af_channel": "my_channel",
"af_ad": "my_adname",
"is_retargeting": "true"
}
{
"af_dp": "afbasicapp://mainactivity",
"install_time": "2020-08-06 06:56:02",
"fruit_name": "apples",
"af_ios_url": "https://my_ios_lp.com",
"media_source": "Email",
"scheme": "https",
"link": "https://onelink-basic-app.onelink.me/H5hv?pid=Email&c=fruit_of_the_month&af_channel=my_channel&af_adset=my_adset&af_ad=my_adname&af_sub1=my_sub1&af_sub2=my_sub2&fruit_name=apples&fruit_amount=16&af_cost_currency=USD&af_cost_value=6&af_click_lookback=20d&af_dp=afbasicapp%3A%2F%2Fmainactivity&af_ios_url=https%3A%2F%2Fmy_ios_lp.com&af_android_url=https%3A%2F%2Fmy_android_lp.com",
"af_cost_currency": "USD",
"af_sub1": "my_sub1",
"af_click_lookback": "20d",
"path": "/H5hv",
"af_adset": "my_adset",
"af_android_url": "https://my_android_lp.com",
"af_sub2": "my_sub2",
"fruit_amount": 16,
"af_cost_value": 6,
"host": "onelink-basic-app.onelink.me",
"campaign": "fruit_of_the_month",
"af_channel": "my_channel",
"af_ad": "my_adname"
}
URI schemes
Entrada en onAppOpenAttribution(Map<String, String> attributionData)
{
"scheme": "afbasicapp",
"link": "afbasicapp://mainactivity?af_ad=my_adname&af_adset=my_adset&af_android_url=https%3A%2F%2Fmy_android_lp.com&af_channel=my_channel&af_click_lookback=25d&af_cost_currency=NZD&af_cost_value=5&af_deeplink=true&af_dp=afbasicapp%3A%2F%2Fmainactivity&af_force_deeplink=true&af_ios_url=https%3A%2F%2Fmy_ios_lp.com&af_sub1=my_sub1&af_sub2=my_sub2&af_web_id=367f81fb-59a4-446a-ac6c-a68d2ee9447c-p&campaign=my_campaign&fruit_amount=15&fruit_name=apples&is_retargeting=true&media_source=Email&shortlink=9270d092",
"af_cost_currency": "NZD",
"af_click_lookback": "25d",
"af_deeplink": true,
"path": "",
"af_android_url": "https://my_android_lp.com",
"af_force_deeplink": true,
"fruit_amount": 15,
"host": "mainactivity",
"af_channel": "my_channel",
"shortlink": "9270d092",
"af_dp": "afbasicapp://mainactivity",
"install_time": "2020-08-06 06:56:02",
"af_ios_url": "https://my_ios_lp.com",
"fruit_name": "apples",
"af_web_id": "367f81fb-59a4-446a-ac6c-a68d2ee9447c-p",
"media_source": "Email",
"af_status": "Non-organic",
"af_sub1": "my_sub1",
"af_adset": "my_adset",
"af_sub2": "my_sub2",
"af_cost_value": 5,
"campaign": "my_campaign",
"af_ad": "my_adname",
"is_retargeting": true
}
{
"af_dp": "afbasicapp://mainactivity",
"install_time": "2020-08-06 06:56:02",
"af_ios_url": "https://my_ios_lp.com",
"fruit_name": "apples",
"af_web_id": "367f81fb-59a4-446a-ac6c-a68d2ee9447c-p",
"scheme": "afbasicapp",
"media_source": "Email",
"link": "afbasicapp://mainactivity?af_ad=my_adname&af_adset=my_adset&af_android_url=https%3A%2F%2Fmy_android_lp.com&af_channel=my_channel&af_click_lookback=25d&af_cost_currency=NZD&af_cost_value=5&af_deeplink=true&af_dp=afbasicapp%3A%2F%2Fmainactivity&af_ios_url=https%3A%2F%2Fmy_ios_lp.com&af_sub1=my_sub1&af_sub2=my_sub2&af_web_id=367f81fb-59a4-446a-ac6c-a68d2ee9447c-p&campaign=my_campaign&fruit_amount=15&fruit_name=apples&is_retargeting=true&media_source=Email",
"af_cost_currency": "NZD",
"af_status": "Non-organic",
"af_click_lookback": "25d",
"af_sub1": "my_sub1",
"af_deeplink": true,
"path": "",
"af_android_url": "https://my_android_lp.com",
"af_adset": "my_adset",
"fruit_amount": 15,
"af_sub2": "my_sub2",
"host": "mainactivity",
"af_cost_value": 5,
"campaign": "my_campaign",
"af_channel": "my_channel",
"af_ad": "my_adname",
"is_retargeting": true
}
Deferred deep linking
Entrada en onConversionDataSuccess(Map<String, Object> conversionData)
{
"redirect_response_data": null,
"adgroup_id": null,
"engmnt_source": null,
"retargeting_conversion_type": "none",
"orig_cost": 6.0,
"af_cost_currency": "USD",
"is_first_launch": true,
"af_click_lookback": "20d",
"af_cpi": null,
"iscache": true,
"click_time": "2020-08-12 16:04:50.605",
"af_android_url": "https://isitchristmas.com/",
"fruit_amount": 26,
"is_branded_link": null,
"match_type": "probabilistic",
"adset": null,
"af_channel": "my_channel",
"campaign_id": null,
"shortlink": "6d66214a",
"af_dp": "afbasicapp://mainactivity",
"install_time": "2020-08-12 16:05:33.750",
"af_ios_url": "https://isitchristmas.com/",
"fruit_name": "apples",
"media_source": "Email",
"agency": null,
"af_siteid": null,
"af_status": "Non-organic",
"af_sub1": "my_sub1",
"cost_cents_USD": 600,
"af_sub5": null,
"af_adset": "my_adset",
"af_sub4": null,
"af_sub3": null,
"af_sub2": "my_sub2",
"adset_id": null,
"esp_name": null,
"af_cost_value": 6,
"campaign": "fruit_of_the_month",
"http_referrer": "android-app://com.slack/",
"af_ad": "my_adname",
"is_universal_link": null,
"is_retargeting": true,
"adgroup": null
}
Actualizado hace aproximadamente 1 año