Enlaces profundos unificados de Android

De un vistazo: Los enlaces profundos unificados (UDL) te permiten enviar usuarios nuevos y existentes a una actividad in-app específica (por ejemplo, una página específica de la aplicación) tan pronto como se abre la aplicación.

📘

Protección de privacidad de UDL

For new users, the UDL method only returns parameters relevant to deferred deep linking: deep_link_value and deep_link_sub1-10. If you try to get any other parameters (media_source, campaign, af_sub1-5, etc.), devuelven un valor nulo.

Flujo

Android UDL flow!

El flujo es el siguiente:

  1. El usuario hace clic en un enlace de OneLink.
    • Si el usuario tiene la aplicación instalada, los enlaces de aplicaciones de Android o el esquema URI abren la aplicación.
    • Si el usuario no tiene la aplicación instalada, se lo redirige a la tienda de aplicaciones y, después de descargarla, el usuario abre la aplicación.
  2. La apertura de la aplicación activa el SDK de AppsFlyer.
  3. El SDK de AppsFlyer ejecuta la API de UDL.
  4. La API de UDL recupera datos de OneLink de los servidores de AppsFlyer.
  5. The UDL API calls back the onDeepLinking() , método en la DeepLinkingListener class.
  6. The onDeepLinking() method gets a DeepLinkResult object.
  7. The DeepLinkResult object includes:
    • Estado (encontrado/no encontrado/error)
    • A DeepLink object that carries the deep_link_value and deep_link_sub1-10 , parámetros que el desarrollador utiliza para dirigir al usuario a una actividad específica in-app, que es el objetivo principal de OneLink.

Planificación

  • UDL requiere el SDK de AppsFlyer para Android V6.1+.

Al configurar OneLinks, el marketer usa parámetros para crear los enlaces y el desarrollador personaliza el comportamiento de la aplicación en función de los valores recibidos. Es responsabilidad del desarrollador asegurarse de que los parámetros se manejen correctamente en la aplicación, tanto para el enrutamiento in-app como para personalizar los datos en el enlace.

Para planificar OneLink:

  1. El marketer debe informarte cuál es el comportamiento deseado y la experiencia personal que obtiene un usuario cuando hace clic en la URL.
  2. Based on the desired behavior, plan the deep_link_value and other parameters that are needed to give the user the desired personal experience.
    • The deep_link_value is set by the marketer in the URL and used by the developer to redirect the user to a specific place inside the app. For example, if you have a fruit store and want to direct users to apples, the value of deep_link_value can be apples.
    • The deep_link_sub1-10 parameters can also be added to the URL to help personalize the user experience. For example, to give a 10% discount, the value of deep_link_sub1 can be 10.

Implementación

Let's save you some time >>

Set Deep Linking with our SDK integration wizard

Implementa la lógica de API de UDL en función de los parámetros y valores elegidos.

  1. Utiliza el método subscribeForDeepLink() (desde AppsFlyerLib), before calling start, to register the DeepLinkListener .
  2. Asegúrate de anular la función de devolución de llamada onDeepLinking().
    onDeepLinking() acepta como argumento un objeto DeepLinkResult object.
  3. Use getStatus() to query whether the deep linking match is found.
  4. For when the status is an error, call getError() and run your error flow.
  5. For when the status is found, use getDeepLink() to retrieve the DeepLink object.
    The DeepLink contiene la información de enlaces profundos y las funciones de ayuda para recuperar fácilmente los valores de las claves conocidas de OneLink, por ejemplo, getDeepLinkValue().
  6. Use getDeepLinkValue() to retrieve the deep_link_value.
  7. Use getStringValue("deep_link_sub1") to retrieve deep_link_sub1. Do the same for deep_link_sub2-10 parameters, changing the string value as required.
  8. Once deep_link_value and deep_link_sub1-10 are retrieved, pass them to an in-app router and use them to personalize the user experience.

📘

Nota

onDeepLinking 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 LaunchMode no estándar.

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

Supporting legacy OneLink links

OneLink heredado son enlaces que no contienen los parámetros recomendados para UDL: deep_link_value and deep_link_sub1-10.
Por lo general, se trata de enlaces que ya existen y están en uso al migrar de métodos heredados a UDL.
Los usuarios nuevos que utilizan enlaces heredados son manejados por onConversionDataSuccess en el contexto de los enlaces profundos diferidos extendidos.
UDL maneja los enlaces profundos de usuarios existentes. En este caso, se recomienda agregar soporte en la devolución de llamada de UDL onDeepLinking para parámetros heredados.
Ejemplo de código Java

Code example

appsflyer.subscribForDeepLink(new DeepLinkListen
    @Override
    public void onDeepLinking(@NonNull DeepLinkResult deepLinkResult) {
        DeepLinkResult.Status dlStatus = deepLinkResult.getStatus();
        if (dlStatus == DeepLinkResult.Status.FOUND) {
            Log.d(LOG_TAG, "Deep link found");
        } else if (dlStatus == DeepLinkResult.Status.NOT_FOUND) {
            Log.d(LOG_TAG, "Deep link not found");
            return;
        } else {
            // dlStatus == DeepLinkResult.Status.ERROR
            DeepLinkResult.Error dlError = deepLinkResult.getError();
            Log.d(LOG_TAG, "There was an error getting Deep Link data: " + dlError.toString());
            return;
        }
        DeepLink deepLinkObj = deepLinkResult.getDeepLink();
        try {
            Log.d(LOG_TAG, "The DeepLink data is: " + deepLinkObj.toString());
        } catch (Exception e) {
            Log.d(LOG_TAG, "DeepLink data came back null");
            return;
        }
        // An example for using is_deferred
        if (deepLinkObj.isDeferred()) {
            Log.d(LOG_TAG, "This is a deferred deep link");
        } else {
            Log.d(LOG_TAG, "This is a direct deep link");
        }
        
        // ** Next if statement is optional **
        // Our sample app's user-invite carries the referrerID in deep_link_sub2
        // See the user-invite section in FruitActivity.java
        if (dlData.has("deep_link_sub2")){
            referrerId = deepLinkObj.getStringValue("deep_link_sub2");
            Log.d(LOG_TAG, "The referrerID is: " + referrerId);
        } else {
            Log.d(LOG_TAG, "deep_link_sub2/Referrer ID not found");
        }
        // An example for using a generic getter
        String fruitName = "";
        try {
            fruitName = deepLinkObj.getDeepLinkValue();
            Log.d(LOG_TAG, "The DeepLink will route to: " + fruitName);
        } catch (Exception e) {
            Log.d(LOG_TAG, "Custom param fruit_name was not found in DeepLink data");
            return;
        }
        goToFruit(fruitName, deepLinkObj);
    }
});
AppsFlyerLib.getInstance().subscribeForDeepLink(object : DeepLinkListener{
    override fun onDeepLinking(deepLinkResult: DeepLinkResult) {
        when (deepLinkResult.status) {
            DeepLinkResult.Status.FOUND -> {
                Log.d(
                    LOG_TAG,"Deep link found"
                )
            }
            DeepLinkResult.Status.NOT_FOUND -> {
                Log.d(
                    LOG_TAG,"Deep link not found"
                )
                return
            }
            else -> {
                // dlStatus == DeepLinkResult.Status.ERROR
                val dlError = deepLinkResult.error
                Log.d(
                    LOG_TAG,"There was an error getting Deep Link data: $dlError"
                )
                return
            }
        }
        var deepLinkObj: DeepLink = deepLinkResult.deepLink
        try {
            Log.d(
                LOG_TAG,"The DeepLink data is: $deepLinkObj"
            )
        } catch (e: Exception) {
            Log.d(
                LOG_TAG,"DeepLink data came back null"
            )
            return
        }

        // An example for using is_deferred
        if (deepLinkObj.isDeferred == true) {
            Log.d(LOG_TAG, "This is a deferred deep link");
        } else {
            Log.d(LOG_TAG, "This is a direct deep link");
        }

        try {
            val fruitName = deepLinkObj.deepLinkValue
            Log.d(LOG_TAG, "The DeepLink will route to: $fruitName")
        } catch (e:Exception) {
            Log.d(LOG_TAG, "There's been an error: $e");
            return;
        }
    }
})

⇲ Enlaces de Github: Java

Probar los enlaces profundos diferidos

Prerequisites

  • Completa la integración de UDL.
  • Registra 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.
  • Pídele a tu marketer una plantilla de OneLink.
    • Se parecerá a esto: https://onelink-basic-app.onelink.me/H5hv.
    • En este ejemplo se utiliza el subdominio de OneLink onelink-basic-app.onelink.me y el ID de la plantilla de OneLink H5hv

The 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 a un enlace existente

  • Utiliza solo el dominio y la plantilla de OneLink de tu enlace, por ejemplo: https://onelink-basic-app.onelink.me/H5hv.
  • Agrega los parámetros de OneLink 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 consulta.
    • Ejemplo: https://onelink-basic-app.onelink.me/H5hv?pid=my_media_source&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, ya sea 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, verás 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 .

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\":\"apples\",\"campaign\":\"\",\"af_sub4\":\"\",\"timestamp\":\"2022-12-06T11:47:40.037\",\"click_http_referrer\":\"\",\"af_sub5\":\"\",\"media_source\":\"\",\"af_sub2\":\"\",\"deep_link_sub1\":\"23\",\"is_deferred\":true}","status":"FOUND"}
    
    

Probar los enlaces profundos (enlaces de aplicaciones Android)

Prerequisites

Create the test link

Utiliza el mismo método que en los enlaces profundos diferidos.

Perform the test

  1. Haz clic en el enlace en tu dispositivo.
  2. UDL detecta el enlace de la aplicación Android y recupera los parámetros de OneLink para la devolución de llamada onDeepLinking .

Expected logs results

📘

Los siguientes registros solo están disponibles cuando el modo de depuración está habilitado.

  • Si el enlace es un enlace corto de OneLink (p. ej. https://onelink-basic-app.onelink.me/H5hv/apples)
    D/AppsFlyer_6.9.0: HTTP: [258990367] GET:https://onelink.appsflyer.com/shortlink-sdk/v2/H5hv?id=apples 
    
  • UDL llama a la devolución de llamada onDeepLinking con status=FOUND y datos del enlace de OneLink
    D/AppsFlyer_6.9.0: [DDL] Calling onDeepLinking with:
        {"deepLink":"{\"path\":\"\\\/H5hv\",\"scheme\":\"https\",\"link\":\"https:\\\/\\\/onelink-basic-app.onelink.me\\\/H5hv?deep_link_value=apples&deep_link_sub1=23\",\"host\":\"onelink-basic-app.onelink.me\",\"deep_link_sub1\":\"23\",\"deep_link_value\":\"apples\",\"is_deferred\":false}","status":"FOUND"}
    

📘

Consejo

Si al hacer clic en un enlace de aplicación de Android, el sistema operativo muestra un diálogo de desambiguación o redirige a Google Play o a un sitio web, verifica si la firma SHA256 es correcta.

  1. Use adb para obtener la firma de la aplicación en el dispositivo:
adb shell pm get-app-links <PACKAGE_NAME>

2. Asegúrate de que el subdominio es verified.
adb verified!

  1. Si el subdominio no está verificado, se muestra 1024.
    adb verified!