iOS 확장 디퍼드 딥링킹

개요

확장된 디퍼드 딥링킹을 사용하면 다음과 같은 특정 시나리오에서 새 사용자를 위한 딥링킹이 가능합니다.

  • 관련 인스톨이 발생하는 경우에도 UDL이 NOT_FOUND even though a relevant install occurred.
    Main example for such a scenario:
    • 클릭과 인스톨 사이의 시간이 UDL 전환 확인 기간(15분)을 초과.
  • 관련 인스톨이 발생하는 경우에도 UDL이 FOUND 을 반환하지만 딥 링크가 다음이 아닌 파라미터를 누락하는 경우. deep_link_value and deep_link_sub1-10.
    이러한 시나리오의 주요 예시:
    • 메타 광고나 트위터와 같은 SRN(셀프 리포팅 네트워크)에서 링크를 클릭.
    • 딥링킹에 사용되는 deep_link_value or deep_link_sub1-10 가 없는 링크를 클릭. 예를 들어, deep_link_value 가 존재하기 전에 작성된 오래된 링크는 아직 사용 중입니다.
    • 클릭과 인스톨 사이의 시간이 UDL 전환 확인 기간(15분)을 초과.

UDL이 NOT_FOUND를 반환할 때 디퍼드 딥링킹을 허용하려면 NOT_FOUND, onConversionDataSuccess 콜백이 디퍼드 딥링킹을 처리해야 하는지 여부를 확인해야 합니다.
onConversionDataSuccess 는 전환 데이터 가져오기(GCD) API의 일부입니다. 기본 목적은 디바이스 내부에서 변환 데이터를 수집하는 것입니다.
여기에 설명한 사용 사례에서 onConversionDataSuccess 는 모든 디퍼드 딥링킹 파라미터가 변환 데이터 위에 있는 콜백으로 전달된다는 사실을 활용합니다.

선행 조건

구현하기

  1. onConversionDataSuccess 는 UDL이 처리하지 않은 디퍼드 딥링킹이 발생해야 하는 경우를 감지해야 합니다.

    자세한 코드 해부 참조

  2. onConversionDataSuccess 는 콜백에 전달된 딥링킹 파라미터를 기반으로 디퍼드 딥링킹 대상으로 사용자를 라우팅하게 됩니다.

코드 예시

Code dissect

  1. 다음 전환 데이터 가져오기 API 대리자 구현: AppsFlyerLibDelegate.

    다음 메서드만 구현: onConversionDataSuccess and onConversionDataFail.
    메서드 onAppOpenAttribution and onAttributionFailure 는 UDL과 상호 배타적이며 호출되지 않습니다.

  2. 디퍼드 딥링킹 시나리오를 감지하려면 다음과 같이 변환 데이터 페이로드를 필터링합니다.
    • af_status == Non-organic
    • is_first_launch == true
  3. 디퍼드 딥링킹이 감지되면 UDL에서 이미 처리된 케이스를 필터링합니다.
    다음 예제에서 모든 링크에는 다음이 포함됩니다: deep_link_value.
    UDL은 디퍼드 딥링킹이 이미 처리되고 있음을 플래그로 알리는 것이 좋으며 onConversionDataSuccess 는 건너뜁니다.
  4. onConversionDataSuccess 는 애플리케이션 내에서 사용자를 라우팅하는 데 사용되는 변환 데이터를 보유한 파라미터를 확인해야 합니다. 예시: fruit_name 다음 예시에서.
  5. 디퍼드 딥링크 대상으로 사용자를 라우팅합니다.

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)")
    }
}

⇲ Github 링크: Swift

테스트

📘

중요 정보

다음 테스트 시나리오는 커스텀 파라미터를 포함하지만 deep_link_value and deep_link_sub1-10 파라미터는 포함하지 않는 링크에서 디퍼드 딥링킹을 처리하는 방법을 보여줍니다.
이 테스트 시나리오는 앞에서 설명한 모든 확장 디퍼드 딥링킹과도 관련이 있습니다.

Before you begin

The test link

기존 OneLink 링크를 사용하거나 마케터에게 테스트할 새 링크를 만들도록 요청할 수 있습니다. 짧은 원링크 URL과 긴 원링크 URL을 모두 사용할 수 있습니다.

링크에 애드혹 파라미터 추가

  • 다음 예와 같이 링크의 도메인과 원링크 템플릿만 사용합니다. https://onelink-basic-app.onelink.me/H5hv.
  • 애플리케이션에서 예상한 대로 deep_link_value and deep_link_sub1-10이외의 원링크 커스텀 파라미터를 추가합니다.
  • 파라미터는 쿼리 파라미터로 추가해야 합니다.
    • 예: https://onelink-basic-app.onelink.me/H5hv?deep_link_value=apples&deep_link_sub1=23

Perform the test

  • 기기에서 링크를 클릭합니다.
  • 원링크는 링크 설정에 따라 사용자를 앱 스토어 또는 웹사이트로 리디렉션합니다.
  • 애플리케이션을 인스톨합니다.

    중요 정보

    • 애플리케이션이 개발 중이고 아직 스토어에 업로드되지 않은 경우 다음 이미지가 표시됩니다.
      drawing
    • Xcode 또는 사용하는 다른 IDE에서 애플리케이션을 설치합니다.
  • UDL은 디퍼드 딥링킹을 검색하고 인스톨을 클릭과 일치시키며 원링크 파라미터를 didResolveDeepLink 콜백으로 검색합니다. UDL은 라우팅 및 종료할 파라미터를 찾지 못합니다.
  • onConversionDataSuccess 콜백은 커스텀 파라미터와 어트리뷰션 데이터를 모두 포함하는 변환 데이터를 사용하여 호출됩니다.
  • onConversionDataSuccess 는 사용자를 애플리케이션 내부로 라우팅하기 위한 커스텀 파라미터를 설정합니다.

Expected logs results

📘

다음 로그는 [디버그 모드가 활성화된 경우]에만 사용할 수 있습니다. (https://dev.appsflyer.com/hc/docs/integrate-ios-sdk#enabling-debug-mode)

  • SDK가 초기화되었습니다.

    [AppsFlyerSDK] [com.apple.main-thread] AppsFlyer SDK version 6.6.0 started build 
    
  • UDL API가 시작됩니다.

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] Start DDL
    
  • UDL은 앱스플라이어 에 서비스쿼리를 보내 이 인스톨과 매치되는 항목을 쿼리합니다.

    [AppsFlyerSDK] [com.appsflyer.serial] [DDL] URL: https://dlsdk.appsflyer.com/v1.0/ios/id1512793879?sdk_version=6.6&af_sig=c9a1d5b34d68e584d0db2a20f4049fb7cd2e785c3383bXXXXXXXXXXXXXXXXXXXXXXXX
    
  • UDL이 응답을 받고 호출 didResolveDeepLink 콜백 status=FOUND 및 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는 전환 데이터를 가져옵니다.

[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 는 변환 데이터를 입력하여 호출됩니다.
[AppsFlyerSDK] [com.appsflyer.serial] [GCD-A02] -[basic_app.AppDelegate onConversionDataSuccess:]:
    {
        ...
        is_first_launch=true, 
        ...
        fruit_amount=56,
        fruit_name=apples, 
        ...
        af_status=Non-organic,
        ...
    }