Унифицированный диплинкинг для Android
Краткий обзор. Унифицированный диплинкинг (Unified Deep Linking, UDL) позволяет при открытии приложения направлять новых и существующих пользователей на определенную активность в приложении (например, на конкретную страницу).
Обеспечение конфиденциальности 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.
Схема работы
Схема работы:
- Пользователь нажимает ссылку OneLink.
- Если у пользователя уже установлено приложение, оно будет открыто с помощью Android App Links или схемы URI.
- Если у пользователя нет приложения, он перенаправляется в магазин приложений, скачивает и открывает приложение.
- При открытии приложения запускается SDK AppsFlyer.
- SDK AppsFlyer запускает API UDL.
- API UDL получает данные OneLink с серверов 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
используемый разработчиком для перенаправления пользователя на определенную активность в приложении, что является основной целью OneLink.
Планирование
- Для UDL нужен SDK AppsFlyer для Android версии 6.1+.
При настройке ссылок OneLink маркетолог использует параметры для создания ссылок, а разработчик настраивает поведение приложения на основе полученных значений. Задача разработчика — убедиться, что эти параметры корректно обрабатываются в приложении, как с точки зрения внутренней маршрутизации, так и с точки зрения персонализации данных в ссылке.
Для планирования ссылок OneLink:
- Выясните у маркетолога, какими должны быть поведение и персонализация пользовательского интерфейса при клике.
- 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
Внедрите логику API UDL на основе выбранных параметров и значений.
- Используйте
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
Объект содержит информацию о диплинкинге и вспомогательные функции, позволяющие извлекать значения из хорошо известных ключей OneLink, например,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
не вызывается, когда приложение работает в фоновом режиме, и режим запуска приложения Application LaunchMode не является стандартным.
Чтобы исправить это, вызовите методsetIntent(intent)
, чтобы установить значение намерения внутри переопределенного методаonNewIntent
, если предложение использует нестандартный режим запуска LaunchMode.import android.content.Intent; ... ... ... @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); }
Supporting legacy OneLink links
Устаревшие ссылки OneLink — это ссылки, которые не содержат рекомендованные для UDL параметры: deep_link_value
and deep_link_sub1-10
.
Обычно это ссылки, которые уже существуют и используются при переходе от устаревших методов к UDL.
Новые пользователи, использующие устаревшие ссылки, обрабатываются посредством onConversionDataSuccess
в контексте расширенного отложенного диплинкинга.
UDL обрабатывает диплинкинг для имеющихся пользователей. В этом случае рекомендуется добавить поддержку в обратный вызов UDL onDeepLinking
для устаревших параметров.
Пример кода Java
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
- Зарегистрируйте тестовое устройство
- Включите отладочный режим в приложении
- Убедитесь, что приложение не установлено на ваше устройство.
- Попросите шаблон OneLink у своего маркетолога.
- Он будет выглядеть примерно так:
https://onelink-basic-app.onelink.me/H5hv
. - В этом примере используется поддомен OneLink
onelink-basic-app.onelink.me
и идентификатор шаблона OneLinkH5hv
- Он будет выглядеть примерно так:
The test link
Вы можете использовать имеющуюся ссылку OneLink или попросить своего маркетолога создать новую для тестирования. Можно использовать как короткие, так и длинные URL-адреса OneLink.
Добавление специальных параметров к имеющейся ссылке
- Используйте только домен и шаблон OneLink вашей ссылки, например:
https://onelink-basic-app.onelink.me/H5hv
. - Добавьте параметры OneLink
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
- Перейдите по ссылке на вашем устройстве.
- OneLink в соответствии с настройкой ссылки направляет вас либо на 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
-
Запускается API UDL:
D/AppsFlyer_6.9.0: [DDL] start
-
UDL отправляет запрос сопоставления с данной установкой в AppsFlyer:
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"}
Тестирование диплинкинга (Android App Links)
Prerequisites
- Выполните интеграцию UDL
- Зарегистрируйте тестовое устройство
- Включите отладочный режим в приложении
- Убедитесь, что приложение установлено на ваше устройство
- Попросите шаблон OneLink у своего маркетолога.
- Он будет выглядеть примерно так
https://onelink-basic-app.onelink.me/H5hv
. - В этом примере используется поддомен OneLink
onelink-basic-app.onelink.me
и идентификатор шаблона OneLinkH5hv
.
- Он будет выглядеть примерно так
- Настройте конфигурацию ссылок Android App-Links.
Create the test link
Используйте тот же метод, что и в отложенном диплинкинге.
Perform the test
- Перейдите по ссылке на вашем устройстве.
- UDL распознает Android App Link и получает параметры OneLink в обратный вызов
onDeepLinking
.
Expected logs results
Следующие журналы доступны, только если включен отладочный режим.
- Если ссылка представляет собой короткую ссылку OneLink (например, 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
и данными ссылки OneLinkD/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"}
Совет
Если при переходе по Android App Link ОС показывает диалоговое окно устранения неоднозначности или перенаправляет на Google Play или сайт, проверьте правильность подписи SHA256.
- Use
adb
, чтобы получить подпись приложения на устройство:adb shell pm get-app-links <PACKAGE_NAME>
-2. Убедитесь, что поддомен имеет значение
verified
.
- Если поддомен не проверен, он показывает
1024
.
Изменения сохранены 12 дней назад