Enlaces profundos diferidos extendidos de iOS

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.
    • El tiempo entre el clic y la instalación excede la ventana retrospectiva UDL (15 minutos).

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 delegado de la API Get Conversion Data AppsFlyerLibDelegate.

    Implementa solo onConversionDataSuccess and onConversionDataFail.
    Los métodos 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

extension AppDelegate: AppsFlyerLibDelegate {
     
    // Handle Organic/Non-organic installation
    func onConversionDataSuccess(_ data: [AnyHashable: Any]) {
        ConversionData = data
        print("onConversionDataSuccess data:")
        for (key, value) in data {
            print(key, ":", value)
        }
        if let conversionData = data as NSDictionary? as! [String:Any]? {
        
            if let status = conversionData["af_status"] as? String {
                if (status == "Non-organic") {
                    if let sourceID = conversionData["media_source"],
                        let campaign = conversionData["campaign"] {
                        NSLog("[AFSDK] This is a Non-Organic install. Media source: \(sourceID)  Campaign: \(campaign)")
                    }
                } else {
                    NSLog("[AFSDK] This is an organic install.")
                }
                
                if let is_first_launch = conversionData["is_first_launch"] as? Bool,
                    is_first_launch {
                    NSLog("[AFSDK] First Launch")
                    if !conversionData.keys.contains("deep_link_value") && conversionData.keys.contains("fruit_name"){
                        switch conversionData["fruit_name"] {
                            case let fruitNameStr as String:
                            NSLog("This is a deferred deep link opened using conversion data")
                            walkToSceneWithParams(fruitName: fruitNameStr, deepLinkData: conversionData)
                            default:
                                NSLog("Could not extract deep_link_value or fruit_name from deep link object using conversion data")
                                return
                        }
                    }
                } else {
                    NSLog("[AFSDK] Not First Launch")
                }
            }
        }
    }
    
    func onConversionDataFail(_ error: Error) {
        NSLog("[AFSDK] \(error)")
    }
}

⇲ Enlaces de Github: Swift

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

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

  • Haz clic en el enlace en tu dispositivo.
  • OneLink te redirige de acuerdo con la configuración del enlace, ya sea al App Store o a un sitio web.
  • 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 Xcode o cualquier otro IDE que utilices.
  • 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 didResolveDeepLink . UDL no encontrará ningún parámetro para enrutar y salir.
  • 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.
  • 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].(https://dev.appsflyer.com/hc/docs/integrate-ios-sdk#enabling-debug-mode)

  • SDK inicializado:

    [AppsFlyerSDK] [com.apple.main-thread] AppsFlyer SDK version 6.6.0 started build 
    
  • La API UDL se inicia:

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] Start DDL
    
  • UDL envía una consulta al servicio de AppsFlyer para consultar una coincidencia con esta instalación:

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] URL: https://dlsdk.appsflyer.com/v1.0/ios/id1512793879?sdk_version=6.6&af_sig=c9a1d5b34d68e584d0db2a20f4049fb7cd2e785c3383bXXXXXXXXXXXXXXXXXXXXXXXX
    
  • UDL obtuvo una respuesta y llama a la devolución de llamada de didResolveDeepLink con status=FOUND y datos del enlace de OneLink:

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] Calling didResolveDeepLink with: {"af_sub4":"","click_http_referrer":"","af_sub1":"","click_event":{"af_sub4":"","click_http_referrer":"","af_sub1":"","af_sub3":"","deep_link_value":"","campaign":"","match_type":"probabilistic","af_sub5":"","campaign_id":"","media_source":"","af_sub2":""},"af_sub3":"","deep_link_value":"","campaign":"","match_type":"probabilistic","af_sub5":"","media_source":"","campaign_id":"","af_sub2":""}
    
  • GCD está recopilando los datos de conversión:

[AppsFlyerSDK] [com.appsflyer.serial] [GCD-B01] GCD 4.0 URL: https://gcdsdk.appsflyer.com/install_data/v4.0/id1512793879?devkey=s*****4&device_id=1672050642148-9221195
  • onConversionDataSuccess se llama con los datos de conversión como entrada:
[AppsFlyerSDK] [com.appsflyer.serial] [GCD-A02] -[basic_app.AppDelegate onConversionDataSuccess:]:
    {
        ...
        is_first_launch=true, 
        ...
        fruit_amount=56,
        fruit_name=apples, 
        ...
        af_status=Non-organic,
        ...
    }