Перейти к содержимому

Диплинки и атрибуция

Как передавать в SDK входящие ссылки (universal links и собственные схемы), обрабатывать отложенные диплинки и читать данные атрибуции установки.

Каждую входящую ссылку передавайте в Tracehub.processDeeplink(_:) — это нужно для атрибуции переходов и реатрибуции. Если ссылка была короткой ссылкой Tracehub (https://links.tracehub.ru/ol/…), переход засчитывается ей в разделе «Диплинки» кабинета; открытие по собственной схеме приложения передаётся в SDK, но кликом по ссылке не считается — такой URI не связан ни с одной ссылкой Tracehub. В SwiftUI — через модификатор .onOpenURL:

@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
Tracehub.processDeeplink(url)
navigate(to: url)
}
}
}
}

В UIKit — в AppDelegate, отдельно для universal links и собственных URL-схем:

// Universal Links
func 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)