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:

Direct Deep Linking flow

  1. El usuario hace clic en la URL corta de OneLink.
  2. Android inicia la aplicación según la actividad relevante en AndroidManifest.xml.
  3. El SDK de AppsFlyer se activa en la aplicación.
  4. 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.
  5. AppsFlyer SDK triggers onAppOpenAttribution() with the retrieved parameters and cached attribution parameters (e.g. install_time).
  6. Asynchronously, onConversionDataSuccess() is called, holding the full cached attribution data. (You can exit this function by checking if is_first_launch is true.)
  7. 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

  1. Decidir el comportamiento de las aplicaciones y el deep_link_value (and other parameter names and values) - with the marketer
  2. Planificar el método de entrada, p. ej. deep_link_value (and other parameter names and values) - with the marketer
  3. Implementar la lógica onAppOpenAttribution() logic
  4. 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 Application LaunchMode no es estándar.
Para corregir esto, llama al método setIntent(intent) para establecer el valor intent dentro del método anulado onNewIntent si la aplicación está utilizando un método no estándar LaunchMode.

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:
Deferred Deep Linking flow!

  1. El usuario hace clic en el OneLink en un dispositivo en el que la aplicación no está instalada.
  2. AppsFlyer registra el clic y redirige el usuario a la tienda de aplicaciones o la página de aterrizaje correctas.
  3. El usuario instala la aplicación y la inicia.
  4. El SDK de AppsFlyer se inicializa y la instalación se atribuye en los servidores de AppsFlyer.
  5. The SDK triggers the onConversionDataSuccess method. The function receives input that includes both the deep_link_value, and the attribution data/parameters defined in the OneLink data.
  6. El parámetro is_first_launch has the value true, que indica el flujo de Deferred Deep Linking.
    El desarrollador utiliza los datos recibidos en el onConversionDataSuccess 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.

  1. 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
  2. Planificar el método de entrada, p. ej. deep_link_value (and other parameter names and values) - with the marketer
  3. Implementar la lógica onConversionDataSuccess() logic
  4. 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:

  1. Dile al marketer qué parámetros y valores se necesitan para implementar el comportamiento deseado de la aplicación.
  2. 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:

  1. Implementa la lógica basada en los parámetros y valores elegidos. Consulta el siguiente ejemplo de código.
  2. 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
}