API héritées Android

Deep linking direct

Overview

Le deep linking direct dirige les utilisateurs mobile vers une activité ou un contenu spécifique de l'app, lorsque celle-ci est déjà installée.

Ce routage in-app vers une activité précise se fait grâce aux paramètres transmis à l'app lorsque le système d'exploitation ouvre l'app et que la méthode 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.

Le flux de deep linking direct fonctionne comme suit :

Direct Deep Linking flow

  1. L'utilisateur clique sur l'URL courte OneLink.
  2. Android lance l'app en fonction de l'activité dans le fichier AndroidManifest.xml.
  3. Le SDK AppsFlyer est déclenché dans l'app.
  4. Le SDK AppsFlyer récupère les données OneLink.
    • Dans une URL courte, les données sont extraites de l'API de gestion des URL courtes dans les serveurs d'AppsFlyer.
    • Dans une URL longue, les données sont extraites directement depuis l'URL longue.
  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() utilise la carte attributionData pour distribuer d'autres activités au sein de l'app, et transmettre les données ad hoc.
    • Une expérience personnalisée est ainsi proposée à l'utilisateur, ce qui est l'objectif premier de OneLink.

Procedures

To implement the onAppOpenAttribution méthode et configurer les comportements des paramètres, vous devez suivre les étapes de mise en œuvre suivantes.

Étapes de la procédure

  1. Décider du comportement de l'app deep_link_value (and other parameter names and values) - with the marketer
  2. Planifier la méthode d'entrée, c’est-à-dire deep_link_value (and other parameter names and values) - with the marketer
  3. Implémenter la logique onAppOpenAttribution() logic
  4. Implémenter la logique onAttributionFailure() logic

Décider du comportement de l'app

Pour décider du comportement de l'app une fois le lien cliqué :

À fournir par le marketeur : le comportement attendu du lien lorsqu'il est cliqué.

Définir l'entrée de la méthode

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 reçoit des variables en entrée comme ceci : Map <String, String>.
La structure des données entrantes est détaillée ici.

Implémenter la logique onAppOpenAttribution()

The deep link opens the onAppOpenAttribution dans l'activité principale. Les paramètres OneLink de la méthode d'entrée sont utilisés pour définir l'activité précise que l'utilisateur aura à réaliser en ouvrant l'app.

Exemple de code :

@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();
    }
}

⇲ Liens Github : Java

ℹ️

Remarque

onAppOpenAttribution n'est pas appelé lorsque l'app fonctionne en arrière-plan et que son LaunchMode n'est pas standard.
Pour corriger cela, appelez la méthode setIntent(intent) pour définir la valeur intent à l'intérieur de la méthode surchargée onNewIntent si l'app utilise un système non standard LaunchMode.

import android.content.Intent;
 ...
 ...
 ...
 @Override
 protected void onNewIntent(Intent intent) 
 { 
   super.onNewIntent(intent);     
   setIntent(intent);
 }

Implémenter la logique 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);
}

⇲ Liens Github : Java

Deferred Deeplinking

Overview

Le deep linking différé dirige d'abord les nouveaux utilisateurs vers l'app store qui leur permettra d'installer l'app, puis, lorsque l'app est ouverte pour la première fois, l'utilisateur est envoyé vers un usage précis au sein de l'app (comme une page spécifique de l'app).

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 ou autre qui est transmis à l'app lorsque le système d'exploitation ouvre l'app.

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.

Il incombe au développeur de vérifier que les paramètres sont traités correctement dans l'app, tant pour le routage in-app que pour la personnalisation des données dans le lien.

Le flux de deep linking différé fonctionne comme suit ::
Deferred Deep Linking flow!

  1. L'utilisateur clique sur le OneLink depuis un appareil sur lequel l'app n'est pas installée.
  2. AppsFlyer enregistre le clic et redirige l'utilisateur vers l'app store ou la page d'accueil qui convient.
  3. L'utilisateur installe l'app puis la lance.
  4. Le SDK AppsFlyer est initialisé et l'installation est attribuée dans les serveurs 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. Le paramètre is_first_launch has the value true, qui signale le flux de deep linking différé.
    Le développeur utilise les données provenant de la fonction onConversionDataSuccess pour créer une expérience personnalisée lorsque l'app est lancée pour la première fois.

Procedures

To implement the onConversionDataSuccess method and set up the parameter behaviors, the following action checklist of procedures need to be completed.

  1. Décider du comportement de l'app lors du premier lancement et deep_link_value (and other parameter names and values) - with the marketer
  2. Planifier la méthode d'entrée, c’est-à-dire deep_link_value (and other parameter names and values) - with the marketer
  3. Implémenter la logique onConversionDataSuccess() logic
  4. Implémenter la logique onConversionDataFail() logic

Décider du comportement de l'app lors du premier lancement

Pour décider du comportement de l'app lors du premier lancement :

À fournir par le marketeur : le comportement attendu du lien lorsqu'il est cliqué et que l'app est lancée pour la première fois.

Définir l'entrée de la méthode

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 ainsi que d'autres variables en entrée comme ceci : Map <String, Object>.

La carte (map) contient deux types de données :

  • Données d'attribution
  • Data defined by the marketer in the link (deep_link_value and other parameters and values)
    Other parameters can be either:
    • Les paramètres officiels AppsFlyer.
    • Les paramètres personnalisés et valeurs choisis par le marketeur et le développeur.
    • La structure des données entrantes est détaillée ici.

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. Transmettez au marketeur les paramètres et valeurs qui permettront de déclencher le comportement attendu de l'application.
  2. Decide on naming conventions for the deep_link_value and other parameters and values.
    Note:
    • Les paramètres personnalisés n'apparaîtront pas dans les données brutes collectées dans AppsFlyer.
    • Les données de conversion ne retourneront pas un paramètre personnalisé nommé « name, » avec un « n » minuscule.

Implémenter la logique 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.

Pour implémenter la logique :

  1. Mettez en œuvre la logique en fonction des paramètres et valeurs choisis. Consultez l'exemple de code ci-dessous.
  2. Une fois terminé, prévenez le marketeur que l'application se comporte bien comme prévu.

Exemple de code

@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.");
     }
 }

⇲ Liens Github : Java

Implémenter la logique 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  :

@Override
public void onConversionDataFail(String errorMessage) {
    Log.d(LOG_TAG, "error getting conversion data: " + errorMessage);
}

⇲ Liens Github : Java

Exemples de charges utiles Android

Consultez les exemples de charges utiles suivants pour les App Links, les schémas d'URI et le deep linking différé. Chaque exemple illustre une charge utile complète, qui existe lorsque tous les paramètres de la page de configuration du lien personnalisé Onelink contiennent des données.

Remarque: les charges utiles reviennent sous forme de map. Dans un souci de clarté, les exemples de charges utiles suivants s'affichent au format JSON.

Android App Links

En Entrée vers 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

En Entrée vers 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

En Entrée vers 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
}