Интеграция аналитики Branch в мобильное приложение
Branch — это не просто MMP (Mobile Measurement Partner). Основная ценность платформы — deep linking инфраструктура: Universal Links на iOS и App Links на Android работают корректно даже в edge-кейсах, где стандартные механизмы ломаются. Атрибуция установок — вторичная функция, которая идёт в комплекте.
Типичная ситуация: пользователь кликает на баннер в Instagram Stories на iOS, переходит в App Store, устанавливает приложение. Стандартная атрибуция через Universal Links теряет UTM-параметры на этапе редиректа через App Store. Branch решает это через отложенный диплинк (deferred deep link) — при первом открытии приложения SDK «узнаёт» откуда пришёл пользователь и открывает нужный экран.
Подключение iOS SDK
Через CocoaPods или SPM (BranchPlugin). Конфигурация в AppDelegate:
import Branch
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Branch.getInstance().setIdentity(userId) // если пользователь авторизован
Branch.getInstance().initSession(launchOptions: launchOptions) { params, error in
guard error == nil, let params = params, params["+clicked_branch_link"] as? Bool == true else { return }
let screen = params["screen"] as? String
let itemId = params["item_id"] as? String
// навигация на нужный экран
NavigationRouter.shared.navigate(to: screen, itemId: itemId)
}
return true
}
// Universal Links
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
Branch.getInstance().continue(userActivity)
return true
}
// URL Schemes
func application(_ app: UIApplication, open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
Branch.getInstance().application(app, open: url, options: options)
return true
}
+clicked_branch_link — флаг в params, который отличает Branch-диплинк от обычного первого запуска. Без этой проверки будет навигация куда-то при каждом первом открытии приложения.
Подключение Android SDK
// build.gradle (app)
implementation("io.branch.sdk.android:library:5.+")
В AndroidManifest.xml добавляем метаданные Branch Key и intent-filter для App Links. В Application.onCreate():
Branch.getAutoInstance(this)
В целевой Activity:
override fun onStart() {
super.onStart()
Branch.sessionBuilder(this).withCallback { referringParams, error ->
if (error != null) return@withCallback
if (referringParams?.getBoolean("+clicked_branch_link") == true) {
val screen = referringParams.getString("screen")
// навигация
}
}.withData(intent.data).init()
}
Создание диплинков и атрибуция
Branch Link создаётся через дашборд или программно через SDK:
let buo = BranchUniversalObject(canonicalIdentifier: "product/\(productId)")
buo.title = product.name
buo.contentMetadata.customMetadata["screen"] = "product_detail"
buo.contentMetadata.customMetadata["item_id"] = productId
let lp = BranchLinkProperties()
lp.channel = "email"
lp.campaign = "summer_sale"
lp.addControlParam("$fallback_url", withValue: "https://myapp.com/products/\(productId)")
buo.getShortUrl(with: lp) { url, error in
// url — Branch-ссылка для шаринга
}
$fallback_url — куда отправлять пользователей, у которых не установлено приложение и нет возможности перейти в Store (например, десктопные браузеры).
Атрибуция и аналитика
Branch отслеживает весь путь: клик → установка → первое открытие → конверсионное событие. Передача конверсий:
let event = BranchEvent.standardEvent(.purchase)
event.transactionID = orderId
event.revenue = orderTotal
event.currency = BNCCurrency.RUB
event.logEvent()
Стандартные события (BranchEvent.standardEvent) автоматически мэппятся на рекламные платформы (Meta, Google Ads) без дополнительной настройки.
Проблемы, с которыми сталкиваемся
Associated Domains не настроены — Universal Links не работают, приложение не перехватывает ссылки. Нужно добавить applinks:yourdomain.app.link в Entitlements и убедиться, что Apple Developer Portal содержит Associated Domains Capability.
Клиентский SDK инициализируется после навигации — диплинк-параметры теряются, потому что UI уже отобразился до того, как initSession вернул результат. Решение: откладывать первоначальную навигацию до completion block.
Android Back Stack при диплинке — пользователь открывает приложение через диплинк, попадает на экран продукта, нажимает Back и выходит из приложения вместо перехода на главный экран. Нужно явно выстраивать Back Stack через TaskStackBuilder.
Что входит в работу
- Подключение Branch SDK (iOS / Android / Flutter / React Native)
- Настройка Associated Domains и Universal Links на iOS
- Настройка App Links и intent-filter на Android
- Конфигурация deferred deep linking с навигацией
- Создание шаблонов Branch Links для маркетинговых каналов
- Настройка конверсионных событий
- Тестирование через Branch Dashboard → Live View
Сроки
Диплинк с атрибуцией на одной платформе: 1–2 дня. iOS + Android с полным набором событий: 3–4 дня. Стоимость рассчитывается индивидуально.







