Расширенный отложенный диплинкинг для iOS
Обзор
Расширенный отложенный диплинкинг позволяет использовать диплинкинг для новых пользователей в определенных сценариях:
- Когда 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 (15 минут).
Чтобы разрешить отложенный диплинкинг, когда UDL возвращает значение NOT_FOUND
, onConversionDataSuccess
должен проверить необходимость обработки отложенного диплинкинга.
onConversionDataSuccess
является частью API для получения данных о конверсиях (GCD). Основным назначением является сбор данных о конверсиях внутри устройства.
В приведенном здесь примере использования onConversionDataSuccess
использует преимущество того, что все параметры отложенного диплинкинга передаются в обратный вызов, поверх данных о конверсиях.
Необходимые условия
- Реализуйте унифицированный диплинкинг для обработки как отложенного, так и прямого диплинкинга.
- внедрите
onConversionDataSuccess
для обработки отложенного диплинкинга посредством API для GCD.
Реализация
onConversionDataSuccess
должен выявлять случаи, когда должен происходить отложенный диплинкинг, не обработанный UDL.См. подробный анализ кода
onConversionDataSuccess
должен направлять пользователя по назначению отложенного диплинкинга на основании параметров диплинкинга, переданных в обратный вызов.
Пример кода
Code dissect
- Реализуйте делегат API для получения данных о конверсиях
AppsFlyerLibDelegate
.Реализуйте только
onConversionDataSuccess
andonConversionDataFail
.
МетодыonAppOpenAttribution
andonAttributionFailure
являются взаимоисключающими с UDL и не будут вызваны. - Определите сценарии отложенного диплинкинга, отфильтровав полезные данные о конверсиях посредством:
af_status == Non-organic
is_first_launch == true
- При обнаружении отложенного диплинкинга отфильтруйте кейсы, уже обработанные UDL.
В примере ниже все ссылки содержатdeep_link_value
.
Рекомендуется установить для UDL флажок для сигнализации о том, что отложенный диплинкинг уже обрабатывается, аonConversionDataSuccess
нужно пропустить. onConversionDataSuccess
должен убедиться в том, что данные о конверсиях содержат параметры, используемые для направления пользователей внутри приложения. Например:fruit_name
в примере ниже.- Направьте пользователя по назначению отложенного диплинкинга.
Code snippet
extension AppDelegate: AppsFlyerLibDelegate {
// Handle Organic/Non-organic installation
func onConversionDataSuccess(_ data: [AnyHashable: Any]) {
ConversionData = data
print("onConversionDataSuccess data:")
for (key, value) in data {
print(key, ":", value)
}
if let conversionData = data as NSDictionary? as! [String:Any]? {
if let status = conversionData["af_status"] as? String {
if (status == "Non-organic") {
if let sourceID = conversionData["media_source"],
let campaign = conversionData["campaign"] {
NSLog("[AFSDK] This is a Non-Organic install. Media source: \(sourceID) Campaign: \(campaign)")
}
} else {
NSLog("[AFSDK] This is an organic install.")
}
if let is_first_launch = conversionData["is_first_launch"] as? Bool,
is_first_launch {
NSLog("[AFSDK] First Launch")
if !conversionData.keys.contains("deep_link_value") && conversionData.keys.contains("fruit_name"){
switch conversionData["fruit_name"] {
case let fruitNameStr as String:
NSLog("This is a deferred deep link opened using conversion data")
walkToSceneWithParams(fruitName: fruitNameStr, deepLinkData: conversionData)
default:
NSLog("Could not extract deep_link_value or fruit_name from deep link object using conversion data")
return
}
}
} else {
NSLog("[AFSDK] Not First Launch")
}
}
}
}
func onConversionDataFail(_ error: Error) {
NSLog("[AFSDK] \(error)")
}
}
⇲ Ссылки на Github: Swift
Тестирование
Важно
Следующий сценарий тестирования демонстрирует обработку отложенного диплинкинга из ссылок, содержащих пользовательские параметры, но не параметры
deep_link_value
anddeep_link_sub1-10
.
Этот сценарий тестирования также подходит для всех случаев расширенного отложенного диплинкинга, описанных ранее.
Before you begin
- Завершите реализацию, описанную выше.
- Зарегистрировать свое тестовое устройство.
- Включите отладочный режим в приложении.
- Убедитесь, что приложение не установлено на ваше устройство.
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?deep_link_value=apples&deep_link_sub1=23
- Пример:
Perform the test
- Перейдите по ссылке на вашем устройстве.
- OneLink в соответствии с настройкой ссылки направляет вас либо в App Store, либо на сайт.
- Установите приложение.
Важно
- Если приложение находится в разработке и еще не загружено в магазин, появляется следующее изображение:
- Установите приложение из Xcode или любого другого интерфейса IDE, который вы используете.
- Если приложение находится в разработке и еще не загружено в магазин, появляется следующее изображение:
- UDL распознает отложенный диплинкинг, сопоставляет установку с кликом и получает параметры OneLink в обратный вызов
didResolveDeepLink
. UDL не найдет параметров для перенаправления и выйдет. onConversionDataSuccess
осуществляется как обратный вызов с данными о конверсии, которые содержат как индивидуально настраиваемые параметры, так и данные атрибуции.onConversionDataSuccess
устанавливает индивидуально настраиваемые параметры для маршрутизации пользователя внутри приложения.
Expected logs results
Следующие журналы доступны, только если [включен отладочный режим].(https://dev.appsflyer.com/hc/docs/integrate-ios-sdk#enabling-debug-mode)
-
SDK инициализирован:
[AppsFlyerSDK] [com.apple.main-thread] AppsFlyer SDK version 6.6.0 started build
-
Запускается API UDL:
[AppsFlyerSDK] [com.appsflyer.serial] [DDL] Start DDL
-
UDL отправляет запрос сопоставления с данной установкой в службу AppsFlyer:
[AppsFlyerSDK] [com.appsflyer.serial] [DDL] URL: https://dlsdk.appsflyer.com/v1.0/ios/id1512793879?sdk_version=6.6&af_sig=c9a1d5b34d68e584d0db2a20f4049fb7cd2e785c3383bXXXXXXXXXXXXXXXXXXXXXXXX
-
UDL получает ответ и вызывает обратный вызов
didResolveDeepLink
соstatus=FOUND
и данными ссылки OneLink:[AppsFlyerSDK] [com.appsflyer.serial] [DDL] Calling didResolveDeepLink with: {"af_sub4":"","click_http_referrer":"","af_sub1":"","click_event":{"af_sub4":"","click_http_referrer":"","af_sub1":"","af_sub3":"","deep_link_value":"","campaign":"","match_type":"probabilistic","af_sub5":"","campaign_id":"","media_source":"","af_sub2":""},"af_sub3":"","deep_link_value":"","campaign":"","match_type":"probabilistic","af_sub5":"","media_source":"","campaign_id":"","af_sub2":""}
-
GCD получает данные о конверсиях:
[AppsFlyerSDK] [com.appsflyer.serial] [GCD-B01] GCD 4.0 URL: https://gcdsdk.appsflyer.com/install_data/v4.0/id1512793879?devkey=s*****4&device_id=1672050642148-9221195
onConversionDataSuccess
вызывается с данными о конверсиях в качестве входных данных:
[AppsFlyerSDK] [com.appsflyer.serial] [GCD-A02] -[basic_app.AppDelegate onConversionDataSuccess:]:
{
...
is_first_launch=true,
...
fruit_amount=56,
fruit_name=apples,
...
af_status=Non-organic,
...
}
Изменения сохранены 11 месяцев назад