Отложенный диплинкинг на устройствах iOS с функцией «Частный узел» (Private Relay)

Начиная с iOS 15, Apple предоставляет пользователям iCloud+ функцию «Частный узел» (Private Relay). Она дает возможность шифровать веб-трафик и скрывать точное местоположение, IP-адрес и контент просматриваемого трафика. Применение пользователями Private Relay может мешать работе атрибуции и отложенного диплинкинга. Когда новый пользователь без приложения переходит в App Store, устанавливает и запускает приложение, Private Relay может препятствовать его переходу на определенную страницу в приложении.

Чтобы отложенный диплинкинг (DDL) работал должным образом, необходимо реализовать одно из следующих решений AppsFlyer.

  • [Рекомендуется] Решение на основе App Clips («блиц-приложений»): создайте мини-приложение, которое предоставит вам данные атрибуции и будет направлять пользователей на указанный интерфейс, аналогично отложенному диплинкингу. Мини-приложение также может содержать сценарий для перенаправления пользователей в полную версию вашего приложения.
  • Решение на основе буфера обмена: создайте лендинг, который копирует данные для отложенного диплинкинга из URL-адреса и корректно перенаправляет пользователя в приложение. Примечание. Это решение не помогает с атрибуцией.

Решение на основе App Clips

Необходимые условия: SDK AppsFlyer V6.4.0+

Для настройки отложенного диплинкинга на основе App Clips:

  1. Следуя инструкциям Apple, разработайте мини-приложение, обеспечивающее желаемый путь пользователя.
  2. Интегрируйте SDK AppsFlyer для App Clips с поддержкой атрибуции перехода из мини-приложения в полную версию приложения.
  3. В мини-приложении sceneDelegate:
    • Замените scene continue userActivity следующей функцией:
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)        
}

⇲ Ссылки на Github: Swift

  • Добавьте следующий метод:
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")
}

⇲ Ссылки на Github: Swift

  1. В полной версии приложения:
    • In appDelegateдобавьте следующий метод:
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")
}

⇲ Ссылки на Github: Swift

  • В конце метода application didFinishLaunchingWithOptions launchOptions вызовите deepLinkFromAppClip:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  // ...

  deepLinkFromAppClip()

  return true
}

⇲ Ссылки на Github: Swift

Решение на основе буфера обмена

Для настройки решения на основе буфера обмена:

  1. Введите следующий код в 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. Реализовать код, который вставляет данные для отложенного диплинкинга в URL-адрес из буфера обмена. Это не входит в функционал SDK AppsFlyer.