Интеграция аналитики Adjust в мобильное приложение
Adjust — MMP (Mobile Measurement Partner) с сильной позицией в европейском и азиатском рынках. Как и AppsFlyer, основная задача — атрибуция установок и in-app событий. Выбор между Adjust и AppsFlyer часто определяется рекламными партнёрами: некоторые DSP и сети предпочитают работать через Adjust.
Подключение SDK
iOS через Swift Package Manager — пакет adjust/ios_sdk:
import Adjust
// AppDelegate
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = ADJConfig(
appToken: "YOUR_APP_TOKEN",
environment: ADJEnvironmentProduction
)
config?.logLevel = ADJLogLevelError
config?.delegate = self
Adjust.appDidLaunch(config)
return true
}
Важно: ADJEnvironmentSandbox vs ADJEnvironmentProduction — в песочнице трафик не попадает в продуктовую статистику. Частая ошибка — выкатить релиз с Sandbox.
Android:
implementation("com.adjust.sdk:adjust-android:4.+")
val config = AdjustConfig(this, "YOUR_APP_TOKEN", AdjustConfig.ENVIRONMENT_PRODUCTION)
config.setLogLevel(LogLevel.ERROR)
Adjust.onCreate(config)
На Android дополнительно нужен AdjustLifecycleCallbacks в Application.onCreate() или ручные вызовы onResume/onPause в каждой Activity.
Отслеживание событий
В Adjust каждое событие создаётся в дашборде и получает уникальный Event Token — четырёхсимвольный код (abc123). Код используется при вызове SDK:
let event = ADJEvent(eventToken: "abc123")
event?.addCallbackParameter("product_id", value: "sku_789")
event?.addCallbackParameter("category", value: "electronics")
event?.setRevenue(990.0, currency: "RUB")
event?.setOrderId("order_\(orderId)") // дедупликация
Adjust.trackEvent(event)
setOrderId — критически важен для e-commerce: предотвращает дублирование события покупки при повторных вызовах (например, из-за retry сетевого запроса).
SKAdNetwork на iOS 14+
Adjust управляет conversion values автоматически через конфигурацию в дашборде. Схема кодирования определяется в Adjust Suite — там задаётся, какие события и их последовательность кодируются в 6 битах:
// ATT запрос должен быть до start() или сразу после
Adjust.requestTrackingAuthorization { status in
// status: ATTrackingManager.AuthorizationStatus
}
Без requestTrackingAuthorization на iOS 14.5+ IDFA недоступен, и атрибуция будет работать только через SKAdNetwork (агрегированно, с задержкой до 72 часов).
Deeplink атрибуция
// Universal Links
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL {
Adjust.appWillOpen(url)
}
return true
}
// URL Schemes
func application(_ app: UIApplication, open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
Adjust.appWillOpen(url)
return true
}
Adjust vs AppsFlyer: практический выбор
| Аспект | Adjust | AppsFlyer |
|---|---|---|
| Рынок | Европа, Азия | Глобально, особенно US |
| Цена | По запросу, обычно ниже для малых объёмов | По запросу |
| Fraud Protection | Встроенный (Adjust Fraud Prevention) | Встроенный (Protect360) |
| SKAdNetwork | Да | Да |
| Raw Data Export | S3, BigQuery через Data Locker | S3 через Data Locker |
Что входит в работу
- Подключение SDK (iOS/Android/Flutter)
- Настройка environment для debug/release сборок
- Создание event tokens в дашборде + интеграция в коде
- Конфигурация ATT и SKAdNetwork для iOS 14+
- Deeplink и Universal Links
- Тестирование через Adjust Testing Console
Сроки
Базовая атрибуция с событиями: 1–2 дня. С deeplink и SKAdNetwork: до 3 дней. Стоимость рассчитывается индивидуально.







