안드로이드 확장 디퍼드 딥링킹

개요

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

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

선행 조건

구현하기

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

    자세한 코드 해부 참조

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

코드 예시

Code dissect

  1. 다음 전환 데이터 가져오기 API 리스너 구현: AppsFlyerConversionListener.

    리스터의 모든 방법을 구현해야 합니다. 지어 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

    AppsFlyerConversionListener conversionListener =  new AppsFlyerConversionListener() {
        @Override
        public void onConversionDataSuccess(Map<String, Object> conversionDataMap) {
            String status = Objects.requireNonNull(conversionDataMap.get("af_status")).toString();
            if(status.equals("Non-organic")){
                if( Objects.requireNonNull(conversionDataMap.get("is_first_launch")).toString().equals("true")){
                    Log.d(LOG_TAG,"Conversion: First Launch");
                    //Deferred deep link in case of a legacy link
                    if(conversionDataMap.containsKey("fruit_name")){
                        if (conversionDataMap.containsKey("deep_link_value")) { //Not legacy link
                            Log.d(LOG_TAG,"onConversionDataSuccess: Link contains deep_link_value, deep linking with UDL");
                        }
                        else{ //Legacy link
                            conversionDataMap.put("deep_link_value", conversionDataMap.get("fruit_name"));
                            String fruitNameStr = (String) conversionDataMap.get("fruit_name");
                            DeepLink deepLinkData = mapToDeepLinkObject(conversionDataMap);
                            goToFruit(fruitNameStr, deepLinkData);
                        }
                    }
                } else {
                    Log.d(LOG_TAG,"Conversion: Not First Launch");
                }
            } else {
                Log.d(LOG_TAG, "Conversion: This is an organic install.");
            }
        }

        @Override
        public void onConversionDataFail(String errorMessage) {
            Log.d(LOG_TAG, "error getting conversion data: " + errorMessage);
        }

        @Override
        public void onAppOpenAttribution(Map<String, String> attributionData) {
            Log.d(LOG_TAG, "onAppOpenAttribution: This is fake call.");
        }

        @Override
        public void onAttributionFailure(String errorMessage) {
            Log.d(LOG_TAG, "error onAttributionFailure : " + errorMessage);
        }
    };

⇲ Github 링크: Java

테스트

📘

중요 정보

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

Before you begin

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

  1. 기기에서 링크를 클릭합니다.
  2. 원링크는 링크 설정에 따라 Google Play 또는 웹사이트로 리디렉션합니다.
  3. 애플리케이션을 인스톨합니다.

    중요 정보

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

Expected logs results

📘

다음 로그는 오직 디버그 모드가 활성화된 경우에만 사용할 수 있습니다.

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

    D/AppsFlyer_6.9.0: Initializing AppsFlyer SDK: (v6.9.0.126)
    
  • 다음 로그는 디렉트 딥링킹을 나타내며 디퍼드 딥링킹 시나리오에서는 무시할 수 있습니다.

    D/AppsFlyer_6.9.0: No deep link detected
    
  • UDL API가 시작됩니다.

    D/AppsFlyer_6.9.0: [DDL] start
    
  • UDL은 앱스플라이어에 쿼리를 보내 이 인스톨과 매치되는 항목을 쿼리합니다.

    D/AppsFlyer_6.9.0: [DDL] Preparing request 1
    ...
    I/AppsFlyer_6.9.0: call = https://dlsdk.appsflyer.com/v1.0/android/com.appsflyer.onelink.appsflyeronelinkbasicapp?af_sig=<>&sdk_version=6.9; size = 239 bytes; body = {
          ...
          TRUNCATED
          ...
    }
    
  • UDL이 응답을 받고 호출 onDeepLinking 콜백 status=FOUND 및 OneLink 링크 데이터:

    D/AppsFlyer_6.9.0: [DDL] Calling onDeepLinking with:
      {"deepLink":"{\"campaign_id\":\"\",\"af_sub3\":\"\",\"match_type\":\"probabilistic\",\"af_sub1\":\"\",\"deep_link_value\":\"\",\"campaign\":\"\",\"af_sub4\":\"\",\"timestamp\":\"2022-12-07T09:32:52.256\",\"click_http_referrer\":\"\",\"af_sub5\":\"\",\"media_source\":\"\",\"af_sub2\":\"\",\"is_deferred\":true}","status":"FOUND"}
    
  • GCD는 전환 데이터를 가져옵니다.

GET:https://gcdsdk.appsflyer.com/install_data/v4.0/com.appsflyer.onelink.appsflyeronelinkbasicapp?devkey=XXXXXXXXX&device_id=1670405582645-822555416155480367
  • onConversionDataSuccess 는 변환 데이터를 입력하여 호출됩니다.
 D/AppsFlyer_6.9.0: [GCD-A02] Calling onConversionDataSuccess with:
    {
        ...
        is_first_launch=true, 
        ...
        fruit_amount=56,
        fruit_name=apples, 
        ...
        af_status=Non-organic,
        ...
    }