안드로이드 통합 딥링킹
요약: 통합 딥링킹(UDL: Unified Deep Linking)을 사용하면 앱을 열자마자 앱의 특정 인앱 액티비티(예: 앱의 특정 페이지)에 새 사용자 및 기존 사용자를 보낼 수 있습니다.
UDL 프라이버시 보호
For new users, the UDL method only returns parameters relevant to deferred deep linking:
deep_link_value
anddeep_link_sub1-10
. If you try to get any other parameters (media_source
,campaign
,af_sub1-5
, 등), null 값을 반환합니다.
순서
순서는 다음과 같이 작동합니다.
- 사용자가 원링크 링크를 클릭합니다.
- 사용자가 앱을 설치한 경우, 안드로이드 앱 링크나 URI 스킴이 앱을 엽니다.
- 사용자가 앱을 설치하지 않은 경우, 앱 스토어로 리디렉션되고, 다운로드 후에는 사용자가 앱을 엽니다.
- 열린 앱이 앱스플라이어 SDK를 트리거합니다.
- AppsFlyer SDK는 UDL API를 실행합니다.
- UDL API는 AppsFlyer 서버에서 원링크 데이터를 가져옵니다.
- The UDL API calls back the
onDeepLinking()
개발자가DeepLinkingListener
class. - The
onDeepLinking()
method gets aDeepLinkResult
object. - The
DeepLinkResult
object includes:- 상태(찾음/찾을 수 없음/오류)
- A
DeepLink
object that carries thedeep_link_value
anddeep_link_sub1-10
원링의 주요 목표인 특정 앱 내 활동으로 사용자를 라우트하는 데 사용하는 파라미터의 메서드입니다.
계획
- UDL에는 AppsFlyer 안드로이드 SDK V6.1 이상이 필요합니다.
원링크를 설정할 때, 마케터는 파라미터를 사용하여 링크를 생성하고, 개발자는 수신된 값을 기반으로 앱의 작동을 맞춤 설정합니다. 앱에서 파라미터를 올바르게 처리하고 인앱 라우팅 및 링크에서 데이터를 맞춤 설정하는 것은 개발자의 책임입니다.
원링크를 계획하는 방법:
- URL을 클릭할 때 사용자에게 바람직한 동작과 개인적 경험을 마케터로부터 얻습니다.
- 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 ofdeep_link_value
can beapples
. - 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 ofdeep_link_sub1
can be10
.
- The
구현하기
Let's save you some time >>
Set Deep Linking with our SDK integration wizard
선택한 파라미터 및 값을 기반으로 UDL API 로직을 구현합니다.
- 메서드(from)를
subscribeForDeepLink()
사용하여AppsFlyerLib
), before calling start, to register theDeepLinkListener
등록합니다. - 객체에 딥링크 정보와 도우미 함수가
onDeepLinking()
.
onDeepLinking()
포함된 인수로 허용하는DeepLinkResult
object. - Use
getStatus()
to query whether the deep linking match is found. - For when the status is an error, call
getError()
and run your error flow. - For when the status is found, use
getDeepLink()
to retrieve theDeepLink
object.
TheDeepLink
콜백 함수를 재정의하여 잘 알려진 원링크 키(예: nginx)에서 값을 쉽게 검색할 수 있도록getDeepLinkValue()
. - Use
getDeepLinkValue()
to retrieve thedeep_link_value
. - Use
getStringValue("deep_link_sub1")
to retrievedeep_link_sub1
. Do the same fordeep_link_sub2-10
parameters, changing the string value as required. - Once
deep_link_value
anddeep_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
anddeep_link_sub1-10
를 추가합니다. 파라미터는 쿼리 파라미터로 추가해야 합니다.- 예:
https://onelink-basic-app.onelink.me/H5hv?pid=my_media_source&deep_link_value=apples&deep_link_sub1=23
- 예:
Perform the test
- 기기에서 링크를 클릭합니다.
- 원링크는 링크 설정에 따라 Google Play 또는 웹사이트로 리디렉션합니다.
- 애플리케이션을 인스톨합니다.
중요 정보
- 이 애플리케이션아직 개발 중이고 아직 스토어에 업로드되지 않은 경우 다음 이미지가 표시됩니다.
- Android Studio 또는 사용하는 다른 IDE로 애플리케이션을 설치합니다.
- 이 애플리케이션아직 개발 중이고 아직 스토어에 업로드되지 않은 경우 다음 이미지가 표시됩니다.
- 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
- 완전한 UDL 연동
- 테스트 기기 등록
- 앱에서 디버그 모드 활성화
- 앱이 기기에 이미 설치되어 있는지 확인하십시오.
- 마케터에게 원링크 템플릿 요청
- 다음과 유사할 것입니다.
https://onelink-basic-app.onelink.me/H5hv
. - 이 예시에서는 원링크 하위 도메인과
onelink-basic-app.onelink.me
원링크 템플릿 ID를 사용합니다H5hv
.
- 다음과 유사할 것입니다.
- 안드로이드 앱 링크를 구성합니다.
Create the test link
디퍼드 딥링킹과 동일한 방법을 사용합니다.
Perform the test
- 기기에서 링크를 클릭합니다.
- 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 서명이 올바른지 확인합니다.
- Use
adb
기기에서 앱 서명을 가져오려면:adb shell pm get-app-links <PACKAGE_NAME>
-2. 하위 도메인이 다음과 같은 지 확인하십시오
verified
.
- 하위 도메인이 확인되지 않은 경우 다음이 표시됩니다
1024
.
최신 데이터 약 1개월 전