Enlaces profundos diferidos de iOS con iOS Private Relay

Con el lanzamiento de iOS 15, Apple ofrece a los usuarios de iCloud+ una función llamada Private Relay, que les da la opción de cifrar su tráfico de navegación por la web y ocultar su ubicación exacta, dirección IP y el contenido de su tráfico de navegación. Si los usuarios optan por usar Private Relay, esto podría interferir con la atribución y el deferred deep linking. Es decir, una vez que un nuevo usuario sin la aplicación va a la App Store e instala e inicia la aplicación, Private Relay podría evitar que se le envíe a una página específica de la aplicación.

Para asegurarte de que el Deferred Deep Linking (DDL) siga funcionando como se esperaba, debes implementar una de las siguientes soluciones de AppsFlyer:

  • [Recomendado] Solución basada en App Clip: crea un App Clip que te brinde datos de atribución de los usuarios, y dirige a los usuarios a una experiencia de App Clip personalizada similar a la que deseas que logre el DDL. El clip de aplicación también puede incluir un flujo para dirigir a los usuarios desde tu App Clip a tu aplicación completa.
  • Solución basada en el portapapeles: crea una página de aterrizaje que copie los datos de Deferred Deep Linking de la URL y redirija correctamente al usuario a la aplicación. Nota: Esta solución no ayuda con la atribución.

Solución basada en App Clip

Requisitos previos: AppsFlyer SDK V6.4.0+

Para configurar la solución DDL basada en App Clip:

  1. Sigue las instrucciones de Apple y desarrolla un App Clip que proporcione la trayectoria del usuario deseada.
  2. Integra el SDK de AppsFlyer para App Clips, incluida la atribución de App Clip a aplicación completa.
  3. En el App Clip sceneDelegate:
    • Reemplaza scene continue userActivity con la siguiente función:
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
  // Must for AppsFlyer attrib
  AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)

  //Get the invocation URL from the userActivity in order to add it to the shared user default
  guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
  let invocationURL = userActivity.webpageURL else {
    return
  }
  addDlUrlToSharedUserDefaults(invocationURL)        
}

⇲ Enlaces de Github: Swift

  • Agrega el siguiente método:
func addDlUrlToSharedUserDefaults(_ url: URL){
  guard let sharedUserDefaults = UserDefaults(suiteName: "group.<your_app>.appClipToFullApp") else {
    return
  }
  //Add invocation URL to the app group
  sharedUserDefaults.set(url, forKey: "dl_url")
  //Enable sending events
  sharedUserDefaults.set(true, forKey: "AppsFlyerReadyToSendEvents")
}

⇲ Enlaces de Github: Swift

  1. En la aplicación completa:
    • In appDelegate, agrega el siguiente método:
func deepLinkFromAppClip() {
  guard let sharedUserDefaults = UserDefaults(suiteName: "group.<your_app>.appClipToFullApp"),
  let dlUrl = sharedUserDefaults.url(forKey: "dl_url")
  else {
    NSLog("Could not find the App Group or the deep link URL from the app clip")
    return
  }
  AppsFlyerLib.shared().performOnAppAttribution(with: dlUrl)
  sharedUserDefaults.removeObject(forKey: "dl_url")
}

⇲ Enlaces de Github: Swift

  • Al final del método application didFinishLaunchingWithOptions launchOptions , llama a deepLinkFromAppClip:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  // ...

  deepLinkFromAppClip()

  return true
}

⇲ Enlaces de Github: Swift

Solución basada en el portapapeles

Para configurar la solución basada en portapapeles:

  1. Introduce el siguiente código en appDelegate.
NSString *pasteboardUrl = [[UIPasteboard generalPasteboard] string];
NSString *checkParameter = @"cp_url=true";

if ([pasteboardUrl containsString:checkParameter]) {
  [[AppsFlyerLib shared] performOnAppAttributionWithURL:[NSURL URLWithString:pasteboardUrl]];
}
var pasteboardUrl = UIPasteboard.general.string ?? ""
let checkParameter = "cp_url=true"

if pasteboardUrl.contains(checkParameter) {
    AppsFlyerLib.shared().performOnAppAttribution(with: URL(string: pasteboardUrl))
}
  1. Implemente un código que pegue los datos del enlace profundo diferido en la URL del portapapeles. Esto no forma parte del SDK de AppsFlyer.