Расширенный отложенный диплинкинг для Android
Обзор
Расширенный отложенный диплинкинг позволяет использовать диплинкинг для новых пользователей в определенных сценариях:
- Когда UDL возвращает
NOT_FOUND
even though a relevant install occurred.
Main example for such a scenario:- Время между кликом и установкой превышает окно атрибуции UDL (15 минут).
- Когда UDL возвращает
FOUND
, но в данные диплинкинга представляют собой отсутствующие параметры, которые не являютсяdeep_link_value
anddeep_link_sub1-10
.
Основные примеры таких сценариев:- Переход по ссылке в сети с самостоятельной атрибуцией (SRN), например Meta Ads или Twitter.
- Клик по ссылке, которая не содержит
deep_link_value
ordeep_link_sub1-10
, используемые для диплинкинга, например старые ссылки, созданные до имеющегося значенияdeep_link_value
, которые все еще используются.
Чтобы разрешить отложенный диплинкинг, когда UDL возвращает значение NOT_FOUND
, onConversionDataSuccess
должен проверить необходимость обработки отложенного диплинкинга.
onConversionDataSuccess
является частью API для получения данных о конверсиях (GCD). Основным назначением является сбор данных о конверсиях внутри устройства.
В приведенном здесь примере использования onConversionDataSuccess
использует преимущество того, что все параметры отложенного диплинкинга передаются в обратный вызов, поверх данных о конверсиях.
Необходимые условия
- Реализуйте унифицированный диплинкинг для обработки как отложенного, так и прямого диплинкинга.
- внедрите
onConversionDataSuccess
для обработки отложенного диплинкинга посредством API для GCD.
Реализация
onConversionDataSuccess
должен выявлять случаи, когда должен происходить отложенный диплинкинг, не обработанный UDL.См. подробный анализ кода
onConversionDataSuccess
должен направлять пользователя по назначению отложенного диплинкинга на основании параметров диплинкинга, переданных в обратный вызов.
Пример кода
Code dissect
- Реализуйте слушатель API для получения данных о конверсиях
AppsFlyerConversionListener
.Необходимо реализовать все методы слушателя, даже если
onAppOpenAttribution
andonAttributionFailure
являются взаимоисключающими с UDL и не будут вызваны. - Определите сценарии отложенного диплинкинга, отфильтровав полезные данные о конверсиях посредством:
af_status == Non-organic
is_first_launch == true
- При обнаружении отложенного диплинкинга отфильтруйте кейсы, уже обработанные UDL.
В примере ниже все ссылки содержатdeep_link_value
.
Рекомендуется установить для UDL флажок для сигнализации о том, что отложенный диплинкинг уже обрабатывается, аonConversionDataSuccess
нужно пропустить. onConversionDataSuccess
должен убедиться в том, что данные о конверсиях содержат параметры, используемые для направления пользователей внутри приложения. Например:fruit_name
в примере ниже.- Направьте пользователя по назначению отложенного диплинкинга.
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
anddeep_link_sub1-10
.
Этот сценарий тестирования также подходит для всех случаев расширенного отложенного диплинкинга, описанных ранее.
Before you begin
- Завершите реализацию, описанную выше.
- Зарегистрировать свое тестовое устройство.
- Включите отладочный режим в приложении .
- Убедитесь, что приложение не установлено на ваше устройство.
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?deep_link_value=apples&deep_link_sub1=23
- Пример:
Perform the test
- Перейдите по ссылке на вашем устройстве.
- OneLink в соответствии с настройкой ссылки направляет вас либо в Google Play, либо на сайт.
- Установите приложение.
Важно
- Если приложение находится в разработке и еще не загружено в магазин, появляется следующее изображение:
- Установите приложение из Android Studio или любого другого интерфейса IDE, который вы используете.
- Если приложение находится в разработке и еще не загружено в магазин, появляется следующее изображение:
- UDL распознает отложенный диплинкинг, сопоставляет установку с кликом и получает параметры OneLink в обратный вызов
onDeepLinking
. UDL не найдет параметров для перенаправления и выйдет. onConversionDataSuccess
осуществляется как обратный вызов с данными о конверсии, которые содержат как индивидуально настраиваемые параметры, так и данные атрибуции.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
-
Запускается 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\":\"\",\"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,
...
}
Изменения сохранены 9 месяцев назад