Устаревшие API для Android
Прямой диплинкинг
Overview
Прямой диплинкинг направляет пользователей мобильного приложения на конкретное действие или контент внутри приложения, когда приложение уже установлено.
Такая внутренняя маршрутизация на конкретное действие в приложении возможна благодаря параметрам, которые передаются в приложение, когда его открывает ОС и вызывается метод 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.
Процесс прямого диплинкинга выглядит следующим образом:
- Пользователь нажимает короткую ссылку OneLink.
- Android запускает приложение на основе соответствующей активности в файле AndroidManifest.xml.
- В приложении запускается SDK AppsFlyer.
- SDK AppsFlyer извлекает данные OneLink.
- Если ссылка короткая, данные извлекаются из API сопоставителя URL-адресов на серверах AppsFlyer.
- Если ссылка длинная, данные извлекаются непосредственно из длинного URL-адреса.
- AppsFlyer SDK triggers
onAppOpenAttribution()
with the retrieved parameters and cached attribution parameters (e.g.install_time
). - Asynchronously,
onConversionDataSuccess()
is called, holding the full cached attribution data. (You can exit this function by checking ifis_first_launch
istrue
.) onAppOpenAttribution()
использует карту attributionData для обработки других активностей в приложении и передачи соответствующих данных.- Это позволяет создать персонализированный опыт для пользователя, что и является основной целью OneLink.
Procedures
To implement the onAppOpenAttribution
метод и настроить поведение параметров, требуется пройти следующий чек-лист.
Чек-лист
- Выбор поведения приложения и
deep_link_value
(and other parameter names and values) - with the marketer - Планирование входных данных метода, т.е.
deep_link_value
(and other parameter names and values) - with the marketer - Реализация логики
onAppOpenAttribution()
logic - Реализация логики
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
в основной активности. Параметры OneLink во входных данных метода используются для реализации конкретного интерфейса при открытии приложения пользователем.
Пример кода:
@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
или другому значению, которое передается в приложение, когда его открывает ОС.
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.
Задача разработчика — убедиться, что эти параметры корректно обрабатываются в приложении, как с точки зрения внутренней маршрутизации, так и с точки зрения персонализации данных в ссылке.
Процесс отложенного диплинкинга выглядит следующим образом:
- Пользователь нажимает ссылку OneLink на устройстве, на котором приложение не установлено.
- AppsFlyer регистрирует клик и перенаправляет пользователя в нужный магазин приложений или на лэндинг.
- Пользователь устанавливает приложение и запускает его.
- Инициализируется SDK AppsFlyer, и на серверах AppsFlyer атрибутируется установка.
- The SDK triggers the
onConversionDataSuccess
method. The function receives input that includes both thedeep_link_value
, and the attribution data/parameters defined in the OneLink data. - Параметр
is_first_launch
has the valuetrue
, что сигнализирует о применении отложенного диплинкинга.
Разработчик использует данные, полученные вonConversionDataSuccess
функции, для создания персонализированного опыта для пользователя при первом запуске приложения.
Procedures
To implement the onConversionDataSuccess
method and set up the parameter behaviors, the following action checklist of procedures need to be completed.
- Выбор поведения приложения при первом запуске и
deep_link_value
(and other parameter names and values) - with the marketer - Планирование входных данных метода, т.е.
deep_link_value
(and other parameter names and values) - with the marketer - Реализация логики
onConversionDataSuccess()
logic - Реализация логики
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 <String, Object>.
Карта содержит два типа данных:
- Данные атрибуции
- Data defined by the marketer in the link (
deep_link_value
and other parameters and values)
Other parameters can be either:- Официальные параметры AppsFlyer.
- Настраиваемые параметры и значения, выбранные маркетологом и разработчиком.
- Структура входных данных описана здесь.
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:
- Расскажите маркетологу, какие параметры и значения нужны, чтобы реализовать желаемое поведение приложения.
- Decide on naming conventions for the
deep_link_value
and other parameters and values.
Note:- Настраиваемые параметры не отображаются в сырых данных, собираемых AppsFlyer.
- Данные о конверсиях не возвращают настраиваемый параметр с именем "name" с буквой "n" в нижнем регистре.
Реализация логики 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.
Чтобы реализовать логику:
- Внедрите логику на основе выбранных параметров и значений. Смотрите следующий пример кода.
- Завершив настройку, отправьте маркетологу подтверждение, что приложение работает надлежащим образом.
Пример кода
@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
Примеры полезной нагрузки для Android
Ознакомьтесь с примерами полезной нагрузки для ссылок App Link, схем URI и отложенных диплинков. Примеры содержат полную полезную нагрузку, характерную для случаев, когда все параметры на странице настройки настраиваемой ссылки Onelink содержат данные.
Примечание. Полезная нагрузка возвращается как карта. Однако для ясности примеры полезной нагрузки приведены в формате 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
}
Изменения сохранены 12 месяцев назад