Диплинки и атрибуция
Как передавать в SDK входящие ссылки (universal links и собственные схемы), обрабатывать отложенные диплинки и читать данные атрибуции установки.
Обработка входящих ссылок
Заголовок раздела «Обработка входящих ссылок»Каждую входящую ссылку передавайте в Tracehub.processDeeplink(_:) — это нужно для атрибуции переходов и реатрибуции. Если ссылка была короткой ссылкой Tracehub (https://links.tracehub.ru/ol/…), переход засчитывается ей в разделе «Диплинки» кабинета; открытие по собственной схеме приложения передаётся в SDK, но кликом по ссылке не считается — такой URI не связан ни с одной ссылкой Tracehub. В SwiftUI — через модификатор .onOpenURL:
@mainstruct MyApp: App { var body: some Scene { WindowGroup { ContentView() .onOpenURL { url in Tracehub.processDeeplink(url) navigate(to: url) } } }}В UIKit — в AppDelegate, отдельно для universal links и собственных URL-схем:
// Universal Linksfunc application( _ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { if let url = userActivity.webpageURL { Tracehub.processDeeplink(url) } return true}
// Собственные URL-схемыfunc application( _ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { Tracehub.processDeeplink(url) return true}Разрешение сокращённой ссылки
Заголовок раздела «Разрешение сокращённой ссылки»Если по ссылке нельзя понять, куда вести пользователя (например, это сокращённый URL), используйте processAndResolveDeeplink — SDK развернёт ссылку и вернёт конечный URL:
Tracehub.processAndResolveDeeplink(url) { resolvedUrl in // Вызывается на главном потоке navigate(to: resolvedUrl)}Отложенный диплинк
Заголовок раздела «Отложенный диплинк»Отложенный диплинк — ссылка, по которой пользователь кликнул до установки приложения; SDK получает её при первом запуске. Ссылка приходит не мгновенно, а вместе с данными атрибуции установки. Если атрибуции у установки нет (установка считается органической), отложенный диплинк не придёт вовсе.
Обратный вызов задаётся в конфигурации:
config.deferredDeeplinkCallback = { url in print("Отложенный диплинк: \(url)") return true // true — SDK перейдёт по ссылке; false — обработаете сами}Последний диплинк
Заголовок раздела «Последний диплинк»let last = await Tracehub.lastDeeplink()print("Последний диплинк: \(last?.absoluteString ?? "нет")")LinkMe позволяет встраивать диплинк в параметр _dlt входящего URL. При включённой поддержке SDK автоматически извлечёт и обработает вложенную ссылку: например, из URL с ?_dlt=myapp%3A%2F%2Fpath будет извлечён и обработан myapp://path.
config.enableLinkMe()Атрибуция
Заголовок раздела «Атрибуция»Синхронное чтение — вернёт nil, пока атрибуция ещё не получена от сервера:
if let attr = Tracehub.getAttribution() { print("Сеть: \(attr.network ?? "-"), трекер: \(attr.trackerName ?? "-")")}Асинхронное ожидание с таймаутом:
if let attr = await Tracehub.getAttributionAsync(timeout: 5.0) { print("Атрибуция получена: \(attr.trackerToken ?? "-")")} else { print("Атрибуция не получена за 5 с")}Реакция на изменение атрибуции (первая атрибуция после установки, реатрибуция):
config.attributionChangedCallback = { attr in analytics.setUserProperty("campaign", value: attr.campaign) analytics.setUserProperty("network", value: attr.network)}Поля атрибуции
Заголовок раздела «Поля атрибуции»| Поле | Тип | Описание |
|---|---|---|
trackerToken |
String? |
Токен трекинг-ссылки, через которую пришла установка |
trackerName |
String? |
Название трекинг-ссылки |
network |
String? |
Рекламная сеть |
campaign |
String? |
Название кампании |
adgroup |
String? |
Группа объявлений |
creative |
String? |
Идентификатор креатива |
clickLabel |
String? |
Метка клика |
thid |
String? |
Идентификатор устройства в Tracehub (THID) |

