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 son deep_link_value and deep_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 or deep_link_sub1-10 utilizados para enlaces profundos, por ejemplo, enlaces antiguos creados antes de que deep_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

Implementación

  1. onConversionDataSuccess debe detectar los casos en los que debería ocurrir un enlace profundo diferido que UDL no manejó.

    Ver análisis detallado del código

  2. 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

  1. Implementa el oyente de la API Get Conversion Data AppsFlyerConversionListener.

    Todos los métodos del oyente deben ser implementados, aunque onAppOpenAttribution and onAttributionFailure son mutuamente excluyentes con UDL, y no serán llamados.

  2. 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
  3. Cuando se detectan enlaces profundos diferidos, filtra los casos que ya fueron manejados por UDL.
    En el ejemplo que sigue, todos los enlaces contienen deep_link_value.
    Se recomienda que UDL señale con un indicador que el enlace profundo diferido ya se ha manejado, y onConversionDataSuccess debe omitirse.
  4. 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.
  5. 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 and deep_link_sub1-10 .
Este escenario de prueba también es relevante para todos los enlaces profundos diferidos extendidos descritos anteriormente.

Before you begin

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 and deep_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

Perform the test

  1. Haz clic en el enlace en tu dispositivo.
  2. OneLink te redirige de acuerdo con la configuración del enlace a Google Play o a un sitio web.
  3. 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:
      drawing
    • Instala la aplicación desde Android Studio o cualquier otro IDE que utilices.
  4. 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.
  5. 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.
  6. 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 con status=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,
        ...
    }