안드로이드 Legacy API

직접 딥링킹

Overview

다이렉트 딥링킹은 앱이 이미 설치된 경우 모바일 사용자를 앱의 특정 활동이나 콘텐츠로 안내합니다.

앱 내 특정 액티비티에 대한 이러한 인앱 라우팅은 OS가 앱을 열고 onAppOpenAttribution method is called. AppsFlyer's OneLink ensures that the correct value is passed along with the user's click, thus personalizing the user’s app experience.

Only the deep_link_value is required for deep linking. However, other parameters and values (such as custom attribution parameters) can also be added to the link and returned by the SDK as deep linking data.

다이렉트 딥링킹 흐름은 다음과 같이 작동합니다.

Direct Deep Linking flow

  1. 사용자가 원링크의 짧은 URL을 클릭합니다.
  2. 안드로이드는 AndroidManifest.xml에 있는 관련 액티비티를 기반으로 앱을 실행합니다.
  3. 앱스플라이어 SDK가 앱 내에서 트리거됩니다.
  4. 앱스플라이어 SDK가 원링크 데이터를 검색합니다.
    • 짧은 URL에서, 데이터는 앱스플라이어 서버의 짧은 URL 리졸버 API에서 가져옵니다.
    • 긴 URL에서 데이터는 긴 URL에서 바로 가져옵니다.
  5. AppsFlyer SDK triggers onAppOpenAttribution() with the retrieved parameters and cached attribution parameters (e.g. install_time).
  6. Asynchronously, onConversionDataSuccess() is called, holding the full cached attribution data. (You can exit this function by checking if is_first_launch is true.)
  7. onAppOpenAttribution() attributionData 맵을 사용하여 앱에서 다른 액티비티를 발송하고 관련 데이터를 전달합니다.
    • 이렇게 하면 사용자에게 맞춤 경험을 생성하며, 이는 원링크의 주요 목적입니다.

Procedures

To implement the onAppOpenAttribution 메서드를 구현하고 파라미터 동작을 설정하려면, 다음 절차 체크리스트의 동작을 완료해야 합니다.

절차 체크리스트

  1. 앱 동작 결정 및 deep_link_value (and other parameter names and values) - with the marketer
  2. 메서드 입력 계획하기, 즉 deep_link_value (and other parameter names and values) - with the marketer
  3. 다음 노직 구현: onAppOpenAttribution() logic
  4. 다음 노직 구현: onAttributionFailure() logic

앱 작동 결정하기

링크를 누를 때 앱 동작을 결정하는 방법:

마케터로부터 링크를 클릭할 때 예상하는 동작을 얻습니다.

메서드 입력 계획

When a OneLink is clicked and the user has the app installed on their device, the onAppOpenAttribution method is called by the AppsFlyer SDK. This is referred to as a retargeting re-engagement.

The onAppOpenAttribution 메서드는 다음과 같은 입력 변수를 가져옵니다: Map <String, String>.
입력 데이터 구조는 여기에 설명되어 있습니다.

onAppOpenAttribution() 로직 구현하기

The deep link opens the onAppOpenAttribution 메서드를 엽니다. 메소드 입력에서 원링크 파라미터는 애플리케이션을 열 때 특정 사용자 경험을 구현하는 데 사용됩니다.

코드 예시:

@Override
  public void onAppOpenAttribution(Map<String, String> attributionData) {
  if (!attributionData.containsKey("is_first_launch"))
    Log.d(LOG_TAG, "onAppOpenAttribution: This is NOT deferred deep linking");
  for (String attrName : attributionData.keySet()) {
    String deepLinkAttrStr = attrName + " = " + attributionData.get(attrName);
    Log.d(LOG_TAG, "Deeplink attribute: " + deepLinkAttrStr);
  }
  Log.d(LOG_TAG, "onAppOpenAttribution: Deep linking into " + attributionData.get("deep_link_value"));
  goToFruit(attributionData.get("deep_link_value"), attributionData);
}

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

private void goToFruit(String fruitName, Map<String, String> dlData) {
    String fruitClassName = fruitName.concat("Activity");
    try {
        Class fruitClass = Class.forName(this.getPackageName().concat(".").concat(fruitClassName));
        Log.d(LOG_TAG, "Looking for class " + fruitClass);
        Intent intent = new Intent(getApplicationContext(), fruitClass);
        if (dlData != null) {
            // Map is casted HashMap since it is easier to pass serializable data to an intent
            HashMap<String, String> copy = new HashMap<String, String>(dlData);
            intent.putExtra(DL_ATTRS, copy);
        }
        startActivity(intent);
    } catch (ClassNotFoundException e) {
        Log.d(LOG_TAG, "Deep linking failed looking for " + fruitName);
        e.printStackTrace();
    }
}

⇲ Github 링크: Java

ℹ️

참고

onAppOpenAttribution 는 앱이 백그라운드에서 실행되고 애플리케이션 LaunchMode 가 표준이 아닌 경우 호출되지 않습니다.
이를 수정하려면 setIntent(intent) 메서드를 호출하여 재정의된 메서드 onNewIntent 내에서 의도 값을 애플리케이션이 다음 비표준을 사용하는 경우 설정하십시오. LaunchMode.

import android.content.Intent;
 ...
 ...
 ...
 @Override
 protected void onNewIntent(Intent intent) 
 { 
   super.onNewIntent(intent);     
   setIntent(intent);
 }

onAttributionFailure() 로직 구현하기

The onAttributionFailure method is called whenever the call to onAppOpenAttribution fails. The function should report the error and create an expected experience for the user.

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

⇲ Github 링크: Java

디퍼드 딥링킹

Overview

디퍼드 딥링킹은 새로운 사용자를 먼저 올바른 앱스토어로 이동시켜 앱을 설치하도록 하고, 처음 앱을 연 후에는 특정 애플리케이션 환경(예: 앱 내의 특정 페이지)으로 이동시킵니다.

When the user first launches the app, the onConversionDataSuccess callback function receives both the conversion data of the new user, and OneLink data. The OneLink data makes in-app routing possible due to the deep_link_value 또는 OS가 앱을 열 때 앱으로 전달되는 기타 항목.

Only the deep_link_value is required for deep linking. However, other parameters and values (such as custom attribution parameters) can also be added to the link and returned by the SDK as deep linking data. The AppsFlyer OneLink ensures that the correct parameters are passed along with the user's click, thus personalizing the user’s app experience.

The marketer and developer must coordinate regarding desired app behavior and deep_link_value. The marketer uses the parameters to create deep links, and the developer customizes the behavior of the app based on the value received.

앱에서 파라미터를 올바르게 처리하고 인앱 라우팅 및 링크에서 데이터를 맞춤 설정하는 것은 개발자의 책임입니다.

디퍼드 딥링킹 흐름은 다음과 같이 작동합니다:
Deferred Deep Linking flow!

  1. 사용자가 앱을 설치하지 않은 기기에서 원링크를 클릭합니다.
  2. 앱스플라이어가 클릭을 등록하고 사용자를 올바른 앱스토어나 랜딩 페이지로 리디렉션합니다.
  3. 사용자가 애플리케이션을 설치하고 이를 실행합니다.
  4. 앱스플라이어 SDK가 초기화되고, 설치는 앱스플라이어 서버에서 어트리뷰트됩니다.
  5. The SDK triggers the onConversionDataSuccess method. The function receives input that includes both the deep_link_value, and the attribution data/parameters defined in the OneLink data.
  6. 파라미터는 is_first_launch has the value true, 이는 디퍼드 딥링크 흐름을 나타냅니다.
    개발자는 함수에 수신된 데이터를 사용하여 onConversionDataSuccess 애플리케이션의 첫 번째 실행을 위해 사용자를 위한 개인화된 환경을 만듭니다.

Procedures

To implement the onConversionDataSuccess method and set up the parameter behaviors, the following action checklist of procedures need to be completed.

  1. 처음 실행 시 앱 작동 결정하기, 및 deep_link_value (and other parameter names and values) - with the marketer
  2. 메서드 입력 계획하기, 즉 deep_link_value (and other parameter names and values) - with the marketer
  3. 다음 노직 구현: onConversionDataSuccess() logic
  4. 다음 노직 구현: onConversionDataFail() logic

처음 실행 시 앱 작동 결정하기

처음 실행 시 앱 작동을 결정하는 방법:

마케터로부터 링크를 클릭하고 처음으로 앱을 실행할 때 링크의 예상 동작을 얻습니다.

메서드 입력 계획

For deferred deep linking, the onConversionDataSuccess method input must be planned and the input decided in the previous section (for deep linking) is made relevant for the first time the app is launched.

The onConversionDataSuccess method gets the deep_link_value Map <Strong, Object>와 같은 다른 변수들을 입력합니다.

맵에는 다음과 같은 두 가지 유형의 데이터가 있습니다.

  • 어트리뷰션 데이터
  • Data defined by the marketer in the link (deep_link_value and other parameters and values)
    Other parameters can be either:
    • 앱스플라이어 공식 파라미터.
    • 마케터와 개발자가 함께 정한 파라미터와 값.
    • 입력 데이터 구조는 여기에 설명되어 있습니다.

The marketer and developers need to plan the deep_link_value (and other possible parameters and values) together based on the desired app behavior when the link is clicked.

To plan the deep_link_value, and other parameter names and values based on the expected link behavior:

  1. 원하는 앱 동작을 구현하려면 필요한 파라미터와 값을 마케터에게 알립니다.
  2. Decide on naming conventions for the deep_link_value and other parameters and values.
    Note:
    • 사용자정의 파라미터는 앱스플라이어에서 수집된 로데이터에 표시되지 않습니다.
    • 전환 데이터는 소문자 "n"을 포함해 "name"으로 명명된 사용자정의 파라미터를 반환하지 않습니다.

onConversionDataSuccess() 로직 구현하기

When the app is opened for the first time, the onConversionDataSuccess method is triggered in the main activity. The deep_link_value and other parameters in the method input are used to implement the specific user experience when the app is first launched.

로직을 구현하는 방법:

  1. 선택한 파라미터와 값을 기반으로 로직을 구현합니다. 아래 코드 예시를 참고하십시오.
  2. 완료되면 앱이 적절하게 동작하는지 마케터에게 알립니다.

샘플 코드

@Override
 public void onConversionDataSuccess(Map<String, Object> conversionData) {
     for (String attrName : conversionData.keySet())
         Log.d(LOG_TAG, "Conversion attribute: " + attrName + " = " + conversionData.get(attrName));
     String status = Objects.requireNonNull(conversionData.get("af_status")).toString();
     if(status.equals("Non-organic")){
         if( Objects.requireNonNull(conversionData.get("is_first_launch")).toString().equals("true")){
             Log.d(LOG_TAG,"Conversion: First Launch");
             if (conversionData.containsKey("deep_link_value")){
                 Log.d(LOG_TAG,"Conversion: This is deferred deep linking.");
                 //  TODO SDK in future versions - match the input types
                 Map<String,String> newMap = new HashMap<>();
                 for (Map.Entry<String, Object> entry : conversionData.entrySet()) {
                         newMap.put(entry.getKey(), String.valueOf(entry.getValue()));
                 }
                 onAppOpenAttribution(newMap);
             }
         } else {
             Log.d(LOG_TAG,"Conversion: Not First Launch");
         }
     } else {
         Log.d(LOG_TAG,"Conversion: This is an organic install.");
     }
 }

⇲ Github 링크: Java

onConversionDataFailure() 로직 구현하기

The onConversionDataFailure method is called whenever the call to onConversionDataSuccess fails. The function should report the error and create an expected experience for the user.

To implement the onConversionDataFailure 메서드:

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

⇲ Github 링크: Java

안드로이드 샘플 페이로드

앱 링크, URI 스킴 및 디퍼드 딥링킹에 대한 다음 샘플 페이로드를 참조하세요. 샘플에는 원링크 사용자정의 링크 설정 페이지의 모든 파라미터에 데이터가 포함되어 있는 경우, 이와 관련된 전체 페이로드가 포함되어 있습니다.

일러두기: 페이로드가 맵으로 반환됩니다. 그러나 명확성을 위해 다음과 같은 샘플 페이로드가 JSON 양식으로 표시됩니다.

Android App Links

다음에 입력합니다. onAppOpenAttribution(Map<String, String> attributionData)

{
    "af_dp": "afbasicapp://mainactivity",
    "af_ios_url": "https://isitchristmas.com/",
    "fruit_name": "apples",
    "c": "fruit_of_the_month",
    "media_source": "Email",
    "link": "https://onelink-basic-app.onelink.me/H5hv/6d66214a",
    "pid": "Email",
    "af_cost_currency": "USD",
    "af_sub1": "my_sub1",
    "af_click_lookback": "20d",
    "af_adset": "my_adset",
    "af_android_url": "https://isitchristmas.com/",
    "af_sub2": "my_sub2",
    "fruit_amount": 26,
    "af_cost_value": 6,
    "campaign": "fruit_of_the_month",
    "af_channel": "my_channel",
    "af_ad": "my_adname",
    "is_retargeting": "true"
}
{
    "af_dp": "afbasicapp://mainactivity",
    "install_time": "2020-08-06 06:56:02",
    "fruit_name": "apples",
    "af_ios_url": "https://my_ios_lp.com",
    "media_source": "Email",
    "scheme": "https",
    "link": "https://onelink-basic-app.onelink.me/H5hv?pid=Email&c=fruit_of_the_month&af_channel=my_channel&af_adset=my_adset&af_ad=my_adname&af_sub1=my_sub1&af_sub2=my_sub2&fruit_name=apples&fruit_amount=16&af_cost_currency=USD&af_cost_value=6&af_click_lookback=20d&af_dp=afbasicapp%3A%2F%2Fmainactivity&af_ios_url=https%3A%2F%2Fmy_ios_lp.com&af_android_url=https%3A%2F%2Fmy_android_lp.com",
    "af_cost_currency": "USD",
    "af_sub1": "my_sub1",
    "af_click_lookback": "20d",
    "path": "/H5hv",
    "af_adset": "my_adset",
    "af_android_url": "https://my_android_lp.com",
    "af_sub2": "my_sub2",
    "fruit_amount": 16,
    "af_cost_value": 6,
    "host": "onelink-basic-app.onelink.me",
    "campaign": "fruit_of_the_month",
    "af_channel": "my_channel",
    "af_ad": "my_adname"
}

URI schemes

다음에 입력합니다. onAppOpenAttribution(Map<String, String> attributionData)

{
    "scheme": "afbasicapp",
    "link": "afbasicapp://mainactivity?af_ad=my_adname&af_adset=my_adset&af_android_url=https%3A%2F%2Fmy_android_lp.com&af_channel=my_channel&af_click_lookback=25d&af_cost_currency=NZD&af_cost_value=5&af_deeplink=true&af_dp=afbasicapp%3A%2F%2Fmainactivity&af_force_deeplink=true&af_ios_url=https%3A%2F%2Fmy_ios_lp.com&af_sub1=my_sub1&af_sub2=my_sub2&af_web_id=367f81fb-59a4-446a-ac6c-a68d2ee9447c-p&campaign=my_campaign&fruit_amount=15&fruit_name=apples&is_retargeting=true&media_source=Email&shortlink=9270d092",
    "af_cost_currency": "NZD",
    "af_click_lookback": "25d",
    "af_deeplink": true,
    "path": "",
    "af_android_url": "https://my_android_lp.com",
    "af_force_deeplink": true,
    "fruit_amount": 15,
    "host": "mainactivity",
    "af_channel": "my_channel",
    "shortlink": "9270d092",
    "af_dp": "afbasicapp://mainactivity",
    "install_time": "2020-08-06 06:56:02",
    "af_ios_url": "https://my_ios_lp.com",
    "fruit_name": "apples",
    "af_web_id": "367f81fb-59a4-446a-ac6c-a68d2ee9447c-p",
    "media_source": "Email",
    "af_status": "Non-organic",
    "af_sub1": "my_sub1",
    "af_adset": "my_adset",
    "af_sub2": "my_sub2",
    "af_cost_value": 5,
    "campaign": "my_campaign",
    "af_ad": "my_adname",
    "is_retargeting": true
}
{
    "af_dp": "afbasicapp://mainactivity",
    "install_time": "2020-08-06 06:56:02",
    "af_ios_url": "https://my_ios_lp.com",
    "fruit_name": "apples",
    "af_web_id": "367f81fb-59a4-446a-ac6c-a68d2ee9447c-p",
    "scheme": "afbasicapp",
    "media_source": "Email",
    "link": "afbasicapp://mainactivity?af_ad=my_adname&af_adset=my_adset&af_android_url=https%3A%2F%2Fmy_android_lp.com&af_channel=my_channel&af_click_lookback=25d&af_cost_currency=NZD&af_cost_value=5&af_deeplink=true&af_dp=afbasicapp%3A%2F%2Fmainactivity&af_ios_url=https%3A%2F%2Fmy_ios_lp.com&af_sub1=my_sub1&af_sub2=my_sub2&af_web_id=367f81fb-59a4-446a-ac6c-a68d2ee9447c-p&campaign=my_campaign&fruit_amount=15&fruit_name=apples&is_retargeting=true&media_source=Email",
    "af_cost_currency": "NZD",
    "af_status": "Non-organic",
    "af_click_lookback": "25d",
    "af_sub1": "my_sub1",
    "af_deeplink": true,
    "path": "",
    "af_android_url": "https://my_android_lp.com",
    "af_adset": "my_adset",
    "fruit_amount": 15,
    "af_sub2": "my_sub2",
    "host": "mainactivity",
    "af_cost_value": 5,
    "campaign": "my_campaign",
    "af_channel": "my_channel",
    "af_ad": "my_adname",
    "is_retargeting": true
}

Deferred deep linking

다음에 입력합니다. onConversionDataSuccess(Map<String, Object> conversionData)

{
    "redirect_response_data": null,
    "adgroup_id": null,
    "engmnt_source": null,
    "retargeting_conversion_type": "none",
    "orig_cost": 6.0,
    "af_cost_currency": "USD",
    "is_first_launch": true,
    "af_click_lookback": "20d",
    "af_cpi": null,
    "iscache": true,
    "click_time": "2020-08-12 16:04:50.605",
    "af_android_url": "https://isitchristmas.com/",
    "fruit_amount": 26,
    "is_branded_link": null,
    "match_type": "probabilistic",
    "adset": null,
    "af_channel": "my_channel",
    "campaign_id": null,
    "shortlink": "6d66214a",
    "af_dp": "afbasicapp://mainactivity",
    "install_time": "2020-08-12 16:05:33.750",
    "af_ios_url": "https://isitchristmas.com/",
    "fruit_name": "apples",
    "media_source": "Email",
    "agency": null,
    "af_siteid": null,
    "af_status": "Non-organic",
    "af_sub1": "my_sub1",
    "cost_cents_USD": 600,
    "af_sub5": null,
    "af_adset": "my_adset",
    "af_sub4": null,
    "af_sub3": null,
    "af_sub2": "my_sub2",
    "adset_id": null,
    "esp_name": null,
    "af_cost_value": 6,
    "campaign": "fruit_of_the_month",
    "http_referrer": "android-app://com.slack/",
    "af_ad": "my_adname",
    "is_universal_link": null,
    "is_retargeting": true,
    "adgroup": null
}