iOS 개인 릴레이를 통한 디퍼드 딥링킹

iOS 15의 출시로 Apple은 iCloud와 함께 사용자에게 개인 릴레이라고 하는 기능을 제공합니다. 이 기능은 사용자들에게 웹 브라우징 트래픽을 암호화하고 정확한 위치와 IP 주소 및 브라우징 트래픽 콘텐츠를 숨기는 옵션을 제공합니다. 사용자가 개인 릴레이에 가입하는 경우, 어트리뷰션과 딥링킹에 간섭할 수 있습니다. 즉, 앱이 없는 새 사용자가 앱 스토어로 이동해 앱을 설치하고 실행하면 개인 릴레이가 앱의 특정 페이지로 전송되지 못하게 할 수 있습니다.

딥링킹(DDL)이 예상대로 계속 작동하도록 하려면 다음 앱스플라이어 솔루션 중 하나를 구현해야 합니다.

  • [권장] 앱 클립 기반 솔루션: 사용자 어트리뷰션 데이터를 제공하는 앱 클립을 작성하고, 사용자에게 DDL이 달성하고자 하는 것과 유사한 사용자정의 앱 클립 환경을 안내합니다. 앱 클립에는 앱 클립에서 전체 앱으로 사용자를 안내하는 흐름도 포함될 수 있습니다.
  • 클립보드 기반 솔루션: URL에서 디퍼드 딥링킹 데이터를 복사하고 사용자를 앱으로 올바르게 리디렉트하는 웹 랜딩 페이지를 작성합니다. 참고: 이 솔루션은 어트리뷰션에 도움이 되지 않습니다.

앱 클립 기반 솔루션

전제 조건: 앱스플라이어 SDK V6.4.0 이상

앱 클립 기반 DDL 솔루션을 설정하는 방법:

  1. Apple 지침에 따라 원하는 사용자 여정을 제공하는 앱 클립(App Clip)을 개발합니다.
  2. 앱 클립-투-전체 앱 어트리뷰션을 포함하여 앱 클립에 앱스플라이어를 통합합니다.
  3. In the App Clip sceneDelegate:
    • Replace scene continue userActivity with the following function:
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, add the following method:
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

  • At the end of the application didFinishLaunchingWithOptions launchOptions method, call deepLinkFromAppClip:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  // ...

  deepLinkFromAppClip()

  return true
}

⇲ Github 링크: Swift

클립보드 기반 솔루션

클립보드 기반 솔루션을 설정하는 방법:

  1. Enter the following code in 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의 일부가 아닙니다.