Enlaces profundos unificados de iOS

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

iOS 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 universales 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 didResolveDeepLink() in the DeepLinkDelegate.
  6. The didResolveDeepLink() 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 parameters that the developer uses to route the user to a specific in-app activity, which is the main goal of OneLink.

Planificación

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

Al configurar OneLink, 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 dentro de la aplicación 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. Assign the AppDelegate using self to AppsFlyerLib.shared().deepLinkDelegate.
  2. Implementar la función de la aplicación para permitir:
    • Compatibilidad con enlaces universales con continue.
    • Compatibilidad de esquema URI con handleOpen.
  3. Create DeepLinkDelegate as an extension of AppDelegate.
  4. Add application functions to support Universal Links and URI schemes.
  5. In DeepLinkDelegate, make sure you override the callback function, didResolveDeepLink().
    didResolveDeepLink() accepts a DeepLinkResult object as an argument.
  6. Use DeepLinkResult.status to query whether the deep linking match is found.
  7. For when the status is an error, call DeepLinkResult.error and run your error flow.
  8. For when the status is found, use DeepLinkResult.deepLink to retrieve the DeepLink object.
    The DeepLink object contains the deep linking information arranged in public variables to retrieve the values from well-known OneLink keys, for example, DeepLink.deeplinkValue for deep_link_value.
  9. Use deepLinkObj.clickEvent["deep_link_sub1"] to retrieve deep_link_sub1. Do the same for deep_link_sub2-10 parameters, changing the string value as required.
  10. 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.

Supporting legacy OneLink links

Los enlaces de OneLink heredados son enlaces que no contienen los parámetros recomendados para enlaces profundos unificados: deep_link_value and deep_link_sub1-10.
Por lo general, se trata de enlaces que ya existen en el campo 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. Se recomienda agregar soporte en la devolución de llamada de UDL didResolveDeepLink para parámetros heredados.
Ejemplo de código Swift

Code example

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  // Replace 'appleAppID' and 'appsFlyerDevKey' with your Apple App ID (eg 69999999, without id prefix) and DevKey
  // The App ID and the DevKey must be set prior to the calling of the deepLinkDelegate
  AppsFlyerLib.shared().appleAppID = appleAppID  
  AppsFlyerLib.shared().appsFlyerDevKey = appsFlyerDevKey
  ...
  AppsFlyerLib.shared().deepLinkDelegate = self
  ...
}

// For Swift version < 4.2 replace function signature with the commented out code
// func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { // this line for Swift < 4.2
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
  AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)
  return true
}

// Open URI-scheme for iOS 9 and above
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
  AppsFlyerLib.shared().handleOpen(url, options: options)
  return true
}

extension AppDelegate: DeepLinkDelegate {
    func didResolveDeepLink(_ result: DeepLinkResult) {
        var fruitNameStr: String?
        switch result.status {
        case .notFound:
            NSLog("[AFSDK] Deep link not found")
            return
        case .failure:
            print("Error %@", result.error!)
            return
        case .found:
            NSLog("[AFSDK] Deep link found")
        }
        
        guard let deepLinkObj:DeepLink = result.deepLink else {
            NSLog("[AFSDK] Could not extract deep link object")
            return
        }
        
        if deepLinkObj.clickEvent.keys.contains("deep_link_sub2") {
            let ReferrerId:String = deepLinkObj.clickEvent["deep_link_sub2"] as! String
            NSLog("[AFSDK] AppsFlyer: Referrer ID: \(ReferrerId)")
        } else {
            NSLog("[AFSDK] Could not extract referrerId")
        }        
        
        let deepLinkStr:String = deepLinkObj.toString()
        NSLog("[AFSDK] DeepLink data is: \(deepLinkStr)")
            
        if( deepLinkObj.isDeferred == true) {
            NSLog("[AFSDK] This is a deferred deep link")
        }
        else {
            NSLog("[AFSDK] This is a direct deep link")
        }
        
        fruitNameStr = deepLinkObj.deeplinkValue
        walkToSceneWithParams(fruitName: fruitNameStr!, deepLinkData: deepLinkObj.clickEvent)
    }
}
// User logic
fileprivate func walkToSceneWithParams(deepLinkObj: DeepLink) {
    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true, completion: nil)
    guard let fruitNameStr = deepLinkObj.clickEvent["deep_link_value"] as? String else {
         print("Could not extract query params from link")
         return
    }
    let destVC = fruitNameStr + "_vc"
    if let newVC = storyBoard.instantiateVC(withIdentifier: destVC) {
       print("AppsFlyer routing to section: \(destVC)")
       newVC.deepLinkData = deepLinkObj
       UIApplication.shared.windows.first?.rootViewController?.present(newVC, animated: true, completion: nil)
    } else {
        print("AppsFlyer: could not find section: \(destVC)")
    }
}

⇲ Enlaces de Github: Swift

Deferred Deep Linking after network consent

In some cases the application might require consent from the user in order to connect to the network, in a dialog similar to this one:

In order to support deferred deep linking once the network consent is given we recommend:

  • Implement eDDL to allow UDL to handle the deferred deep linking

Probar los enlaces profundos diferidos

Prerequisites

  • Completa la integración de UDL.
  • Registrar 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 al App Store 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 Xcode.
  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 didResolveDeepLink .

Expected logs results

📘

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

  • SDK inicializado:
    [AppsFlyerSDK] [com.apple.main-thread] AppsFlyer SDK version 6.6.0 started build
    
  • 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:
    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] URL: https://dlsdk.appsflyer.com/v1.0/ios/id1512793879?sdk_version=6.6&af_sig=efcecc2bc95a0862ceaa7b62fa8e98ae1e3e022XXXXXXXXXXXXXXXX
    
  • 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":"peaches","campaign":"","match_type":"probabilistic","af_sub5":"","campaign_id":"","media_source":"","deep_link_sub1":"23","af_sub2":""},"af_sub3":"","deep_link_value":"peaches","campaign":"","match_type":"probabilistic","af_sub5":"","media_source":"","campaign_id":"","af_sub2":""}
    

Probar los enlaces profundos (enlaces universales)

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 universal y recupera los parámetros de OneLink para la devolución de llamada didResolveDeepLink .

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):
    [AppsFlyerSDK] [com.apple.main-thread] NSUserActivity `webpageURL`: https://onelink-basic-app.onelink.me/H5hv/apples
    [AppsFlyerSDK] [com.appsflyer.serial] UniversalLink/Deeplink found:
    https://onelink-basic-app.onelink.me/H5hv/apples
    [AppsFlyerSDK] [com.appsflyer.serial] Shortlink found. Executing: https://onelink.appsflyer.com/shortlink-sdk/v2/H5hv?id=apples
    ...
    [AppsFlyerSDK] [com.appsflyer.serial]                        
    [Shortlink] OneLink:{
      c = test1;
      campaign = test1;
      "deep_link_sub1" = 23;
      "deep_link_value" = peaches;
      "is_retargeting" = true;
      "media_source" = SMS;
      pid = SMS;
    } 
    
  • UDL llama a la devolución de llamada didResolveDeepLink con status=FOUND y datos del enlace de OneLink:
    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] Calling didResolveDeepLink with: {"af_sub4":null,"click_http_referrer":null,"af_sub1":null,"click_event":{"campaign":"test1","deep_link_sub1":"23","deep_link_value":"peaches","media_source":"SMS"},"af_sub3":null,"deep_link_value":"peaches","campaign":"test1","match_type":null,"af_sub5":null,"media_source":"SMS","campaign_id":null,"af_sub2":null}