Реализация Deferred Deep Linking в мобильном приложении
Обычный deep link работает только если приложение установлено. Пользователь нажимает на ссылку, приложение не установлено — ссылка ведёт в стор, контекст теряется. Deferred deep linking решает именно эту ситуацию: пользователь устанавливает приложение и при первом запуске попадает на тот экран, на который нажимал. Это критично для рекламных кампаний, реферальных программ и шаринга контента.
Как это работает технически
Механика deferred deep linking строится на нескольких слоях.
Слой 1: передача параметров до установки. Классический подход — fingerprinting: при переходе по ссылке сервер сохраняет параметры (кампания, контент, реферер) вместе с fingerprint браузера (IP, user agent, разрешение экрана). После установки приложение делает запрос к серверу со своим fingerprint — сервер матчит и возвращает сохранённые параметры.
Точность fingerprinting — 70–85%. Достаточно для большинства маркетинговых задач, но не для финансовых операций.
Слой 2: Google Play Referrer (Android). Надёжнее fingerprinting. При переходе по ссылке с &referrer= параметром Google Play сохраняет его и передаёт приложению при первой установке через InstallReferrerClient:
val referrerClient = InstallReferrerClient.newBuilder(context).build()
referrerClient.startConnection(object : InstallReferrerStateListener {
override fun onInstallReferrerSetupFinished(responseCode: Int) {
if (responseCode == InstallReferrerClient.InstallReferrerResponse.OK) {
val referrer = referrerClient.installReferrer.installReferrer
// parse UTM parameters from referrer string
}
}
override fun onInstallReferrerServiceDisconnected() {}
})
Слой 3: SKAdNetwork / StoreKit AdNetwork (iOS). Apple закрыла fingerprinting в iOS 14.5+ через App Tracking Transparency. Для iOS деferred deep linking работает только через:
- Клипборд — копируем параметры в буфер обмена на лендинге, приложение читает при первом запуске (требует
UIPasteboard.general.string, iOS 16+ показывает системный prompt) - Сторонние SDK (Branch, AppsFlyer, Adjust), которые используют детерминированное сопоставление через IDFA (с разрешения) и SKAdNetwork для атрибуции без него
Реализация через Branch.io
Branch — наиболее полный инструмент для deferred deep linking. Поддерживает Android (Play Referrer + fingerprint), iOS (клипборд + SKAdNetwork + детерминированное), web fallback.
Android SDK:
// Application.onCreate()
Branch.getAutoInstance(this)
// Activity.onStart()
Branch.sessionBuilder(this)
.withCallback { referringParams, error ->
if (error == null && referringParams != null) {
val screen = referringParams.getString("screen")
val itemId = referringParams.getString("item_id")
if (referringParams.getBoolean("+clicked_branch_link", false)) {
// навигация на нужный экран
navigateTo(screen, itemId)
}
}
}
.withData(intent?.data)
.init()
iOS SDK:
Branch.getInstance().initSession(launchOptions: launchOptions) { params, error in
guard error == nil, let params = params else { return }
if let clicked = params["+clicked_branch_link"] as? Bool, clicked {
let screen = params["screen"] as? String
self.navigateTo(screen: screen)
}
}
Универсальные ссылки (iOS) и App Links (Android) настраиваются параллельно — Branch генерирует нужные apple-app-site-association и assetlinks.json через свой dashboard.
Кастомная реализация без сторонних SDK
Если Branch/AppsFlyer избыточны (нет бюджета на enterprise план или политика против third-party SDK), можно реализовать упрощённую версию:
- Создать endpoint
/deferred?screen=product&id=123— сохраняет параметры + fingerprint в Redis с TTL 24 часа - На Android: установить referrer через
?referrer=screen%3Dproduct%26id%3D123в ссылке на Play Store - При первом запуске: читать через
InstallReferrerClient(Android) или делать запрос с fingerprint (iOS) - Навигация на нужный экран
Ограничение: на iOS точность ~70–75%, Android через Play Referrer — ~95%.
Тестирование
Deferred deep linking крайне сложно тестировать в dev-окружении: нужна реальная установка из стора или тестовый track (Firebase App Distribution / TestFlight). Для Branch — режим testMode позволяет эмулировать клики в debug-сборке.
Обязательные тест-кейсы:
- Установка на чистое устройство по ссылке
- Переход по ссылке с уже установленным приложением (обычный deep link)
- Переход по ссылке, удаление и повторная установка (параметры не должны применяться повторно)
- Переход без клика на Branch ссылку (organic install — параметров нет)
Что входит в работу
Выбираем стратегию под платформы и бюджет (Branch/AppsFlyer vs кастомная реализация), настраиваем Universal Links и App Links, реализуем SDK интеграцию с навигацией на нужные экраны, тестируем все сценарии на реальных устройствах. Документируем схему параметров для маркетинговой команды.
Срок: 5–10 дней с учётом настройки домена, тестирования всех сценариев установки и интеграции с навигацией.







