안드로이드 통합 딥링킹

요약: 통합 딥링킹(UDL: Unified Deep Linking)을 사용하면 앱을 열자마자 앱의 특정 인앱 액티비티(예: 앱의 특정 페이지)에 새 사용자 및 기존 사용자를 보낼 수 있습니다.

📘

UDL 프라이버시 보호

For new users, the UDL method only returns parameters relevant to deferred deep linking: deep_link_value and deep_link_sub1-10. If you try to get any other parameters (media_source, campaign, af_sub1-5, 등), null 값을 반환합니다.

순서

Android UDL flow!

순서는 다음과 같이 작동합니다.

  1. 사용자가 원링크 링크를 클릭합니다.
    • 사용자가 앱을 설치한 경우, 안드로이드 앱 링크나 URI 스킴이 앱을 엽니다.
    • 사용자가 앱을 설치하지 않은 경우, 앱 스토어로 리디렉션되고, 다운로드 후에는 사용자가 앱을 엽니다.
  2. 열린 앱이 앱스플라이어 SDK를 트리거합니다.
  3. AppsFlyer SDK는 UDL API를 실행합니다.
  4. UDL API는 AppsFlyer 서버에서 원링크 데이터를 가져옵니다.
  5. The UDL API calls back the onDeepLinking() 개발자가 DeepLinkingListener class.
  6. The onDeepLinking() method gets a DeepLinkResult object.
  7. The DeepLinkResult object includes:
    • 상태(찾음/찾을 수 없음/오류)
    • A DeepLink object that carries the deep_link_value and deep_link_sub1-10 원링의 주요 목표인 특정 앱 내 활동으로 사용자를 라우트하는 데 사용하는 파라미터의 메서드입니다.

계획

  • UDL에는 AppsFlyer 안드로이드 SDK V6.1 이상이 필요합니다.

원링크를 설정할 때, 마케터는 파라미터를 사용하여 링크를 생성하고, 개발자는 수신된 값을 기반으로 앱의 작동을 맞춤 설정합니다. 앱에서 파라미터를 올바르게 처리하고 인앱 라우팅 및 링크에서 데이터를 맞춤 설정하는 것은 개발자의 책임입니다.

원링크를 계획하는 방법:

  1. URL을 클릭할 때 사용자에게 바람직한 동작과 개인적 경험을 마케터로부터 얻습니다.
  2. Based on the desired behavior, plan the deep_link_value and other parameters that are needed to give the user the desired personal experience.
    • The deep_link_value is set by the marketer in the URL and used by the developer to redirect the user to a specific place inside the app. For example, if you have a fruit store and want to direct users to apples, the value of deep_link_value can be apples.
    • The deep_link_sub1-10 parameters can also be added to the URL to help personalize the user experience. For example, to give a 10% discount, the value of deep_link_sub1 can be 10.

구현하기

Let's save you some time >>

Set Deep Linking with our SDK integration wizard

선택한 파라미터 및 값을 기반으로 UDL API 로직을 구현합니다.

  1. 메서드(from)를 subscribeForDeepLink() 사용하여 AppsFlyerLib), before calling start, to register the DeepLinkListener 등록합니다.
  2. 객체에 딥링크 정보와 도우미 함수가 onDeepLinking().
    onDeepLinking() 포함된 인수로 허용하는 DeepLinkResult object.
  3. Use getStatus() to query whether the deep linking match is found.
  4. For when the status is an error, call getError() and run your error flow.
  5. For when the status is found, use getDeepLink() to retrieve the DeepLink object.
    The DeepLink 콜백 함수를 재정의하여 잘 알려진 원링크 키(예: nginx)에서 값을 쉽게 검색할 수 있도록 getDeepLinkValue().
  6. Use getDeepLinkValue() to retrieve the deep_link_value.
  7. Use getStringValue("deep_link_sub1") to retrieve deep_link_sub1. Do the same for deep_link_sub2-10 parameters, changing the string value as required.
  8. Once deep_link_value and deep_link_sub1-10 are retrieved, pass them to an in-app router and use them to personalize the user experience.

📘

참고

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

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

Supporting legacy OneLink links

레거시 원링크는 UDL에 권장되는 파라미터를 포함하지 않는 링크입니다. deep_link_value and deep_link_sub1-10.
일반적으로 이러한 링크는 이미 존재하는 링크이며 레거시 메서드에서 UDL로 마이그레이션할 때 사용되고 있습니다.
레거시 링크를 사용하는 신규 사용자는 onConversionDataSuccess 확장된 디퍼드 딥링킹의 맥락에서.
UDL은 기존 사용자에 대한 딥링킹을 처리합니다. 이 경우 레거시 파라미터에 대한 UDL 콜백에 지원을 onDeepLinking 추가하는 것이 좋습니다.
자바 코드 예시

Code example

appsflyer.subscribForDeepLink(new DeepLinkListen
    @Override
    public void onDeepLinking(@NonNull DeepLinkResult deepLinkResult) {
        DeepLinkResult.Status dlStatus = deepLinkResult.getStatus();
        if (dlStatus == DeepLinkResult.Status.FOUND) {
            Log.d(LOG_TAG, "Deep link found");
        } else if (dlStatus == DeepLinkResult.Status.NOT_FOUND) {
            Log.d(LOG_TAG, "Deep link not found");
            return;
        } else {
            // dlStatus == DeepLinkResult.Status.ERROR
            DeepLinkResult.Error dlError = deepLinkResult.getError();
            Log.d(LOG_TAG, "There was an error getting Deep Link data: " + dlError.toString());
            return;
        }
        DeepLink deepLinkObj = deepLinkResult.getDeepLink();
        try {
            Log.d(LOG_TAG, "The DeepLink data is: " + deepLinkObj.toString());
        } catch (Exception e) {
            Log.d(LOG_TAG, "DeepLink data came back null");
            return;
        }
        // An example for using is_deferred
        if (deepLinkObj.isDeferred()) {
            Log.d(LOG_TAG, "This is a deferred deep link");
        } else {
            Log.d(LOG_TAG, "This is a direct deep link");
        }
        
        // ** Next if statement is optional **
        // Our sample app's user-invite carries the referrerID in deep_link_sub2
        // See the user-invite section in FruitActivity.java
        if (dlData.has("deep_link_sub2")){
            referrerId = deepLinkObj.getStringValue("deep_link_sub2");
            Log.d(LOG_TAG, "The referrerID is: " + referrerId);
        } else {
            Log.d(LOG_TAG, "deep_link_sub2/Referrer ID not found");
        }
        // An example for using a generic getter
        String fruitName = "";
        try {
            fruitName = deepLinkObj.getDeepLinkValue();
            Log.d(LOG_TAG, "The DeepLink will route to: " + fruitName);
        } catch (Exception e) {
            Log.d(LOG_TAG, "Custom param fruit_name was not found in DeepLink data");
            return;
        }
        goToFruit(fruitName, deepLinkObj);
    }
});
AppsFlyerLib.getInstance().subscribeForDeepLink(object : DeepLinkListener{
    override fun onDeepLinking(deepLinkResult: DeepLinkResult) {
        when (deepLinkResult.status) {
            DeepLinkResult.Status.FOUND -> {
                Log.d(
                    LOG_TAG,"Deep link found"
                )
            }
            DeepLinkResult.Status.NOT_FOUND -> {
                Log.d(
                    LOG_TAG,"Deep link not found"
                )
                return
            }
            else -> {
                // dlStatus == DeepLinkResult.Status.ERROR
                val dlError = deepLinkResult.error
                Log.d(
                    LOG_TAG,"There was an error getting Deep Link data: $dlError"
                )
                return
            }
        }
        var deepLinkObj: DeepLink = deepLinkResult.deepLink
        try {
            Log.d(
                LOG_TAG,"The DeepLink data is: $deepLinkObj"
            )
        } catch (e: Exception) {
            Log.d(
                LOG_TAG,"DeepLink data came back null"
            )
            return
        }

        // An example for using is_deferred
        if (deepLinkObj.isDeferred == true) {
            Log.d(LOG_TAG, "This is a deferred deep link");
        } else {
            Log.d(LOG_TAG, "This is a direct deep link");
        }

        try {
            val fruitName = deepLinkObj.deepLinkValue
            Log.d(LOG_TAG, "The DeepLink will route to: $fruitName")
        } catch (e:Exception) {
            Log.d(LOG_TAG, "There's been an error: $e");
            return;
        }
    }
})

⇲ Github 링크: Java

디퍼드 딥링킹 테스트

Prerequisites

  • 완전한 UDL 연동
  • 테스트 기기 등록
  • 앱에서 디버그 모드 활성화
  • 앱이 기기에 설치되어 있지 않은지 확인
  • 마케터에게 원링크 템플릿 요청
    • 다음과 유사할 것입니다. https://onelink-basic-app.onelink.me/H5hv.
    • 이 예시에서는 원링크 하위 도메인과 onelink-basic-app.onelink.me 원링크 템플릿 ID를 사용합니다 H5hv

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

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

    중요 정보

    • 이 애플리케이션아직 개발 중이고 아직 스토어에 업로드되지 않은 경우 다음 이미지가 표시됩니다.
      drawing
    • Android Studio 또는 사용하는 다른 IDE로 애플리케이션을 설치합니다.
  4. UDL은 디퍼드 딥링킹을 감지하고, 인스톨을 클릭과 일치시키고, OneLink 파라미터를 콜백으로 onDeepLinking 검색합니다.

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\":\"apples\",\"campaign\":\"\",\"af_sub4\":\"\",\"timestamp\":\"2022-12-06T11:47:40.037\",\"click_http_referrer\":\"\",\"af_sub5\":\"\",\"media_source\":\"\",\"af_sub2\":\"\",\"deep_link_sub1\":\"23\",\"is_deferred\":true}","status":"FOUND"}
    
    

딥링킹 테스트(안드로이드 앱 링크)

Prerequisites

Create the test link

디퍼드 딥링킹과 동일한 방법을 사용합니다.

Perform the test

  1. 기기에서 링크를 클릭합니다.
  2. UDL은 안드로이드 앱 링크를 감지하고 원링크 파라미터를 검색합니다 onDeepLinking 검색합니다.

Expected logs results

📘

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

  • 링크가 원링크 단축링크인 경우(예: https://onelink-basic-app.onelink.me/H5hv/apples)
    D/AppsFlyer_6.9.0: HTTP: [258990367] GET:https://onelink.appsflyer.com/shortlink-sdk/v2/H5hv?id=apples 
    
  • UDL는 다음을 호출 onDeepLinking 콜백 status=FOUND 및 OneLink 링크 데이터
    D/AppsFlyer_6.9.0: [DDL] Calling onDeepLinking with:
        {"deepLink":"{\"path\":\"\\\/H5hv\",\"scheme\":\"https\",\"link\":\"https:\\\/\\\/onelink-basic-app.onelink.me\\\/H5hv?deep_link_value=apples&deep_link_sub1=23\",\"host\":\"onelink-basic-app.onelink.me\",\"deep_link_sub1\":\"23\",\"deep_link_value\":\"apples\",\"is_deferred\":false}","status":"FOUND"}
    

📘

안드로이드 앱 링크를 클릭할 때 OS는 Disambiguation 대화 상자를 표시하거나 Google Play 또는 웹사이트로 리디렉션하여 SHA256 서명이 올바른지 확인합니다.

  1. Use adb 기기에서 앱 서명을 가져오려면:
adb shell pm get-app-links <PACKAGE_NAME>

-2. 하위 도메인이 다음과 같은 지 확인하십시오 verified.
adb verified!

  1. 하위 도메인이 확인되지 않은 경우 다음이 표시됩니다 1024.
    adb verified!