Реализация механизма согласия на обработку данных (Consent Management)
Без CMP (Consent Management Platform) приложение с аналитикой и рекламой нарушает GDPR с первого запуска — Firebase Analytics, Facebook SDK и AppsFlyerначинают собирать данные до того, как пользователь что-либо разрешил. Штраф за это реален. Задача — встроить управление согласиями так, чтобы ни один SDK не инициализировался до явного разрешения пользователя.
IAB TCF 2.2 и почему это важно
IAB Transparency & Consent Framework (TCF) 2.2 — стандарт для рекламной экосистемы. Если приложение использует рекламные сети (AdMob, ironSource, AppLovin), CMP должна быть совместима с TCF. Иначе рекламные партнёры не получат сигнал о согласии, и монетизация ломается.
Сертифицированные IAB CMP: OneTrust, Usercentrics, Didomi, Quantcast Choice. Все имеют мобильные SDK.
Что происходит технически при запуске приложения
До появления CMP диалога — никакого трекинга. После принятия:
- согласие сохраняется локально (Keychain/Keystore)
- инициализируются только разрешённые SDK
Схема инициализации:
// iOS, упрощённо
func application(_ app: UIApplication, didFinishLaunchingWithOptions...) {
ConsentManager.shared.requestConsentUpdate { status in
switch status {
case .obtained:
self.initializeAnalyticsIfAllowed()
self.initializeAdsIfAllowed()
case .notRequired: // не в ЕС/UK
self.initializeAll()
case .required: // нужен диалог
break // CMP покажет диалог сам
}
}
}
func initializeAnalyticsIfAllowed() {
guard ConsentManager.shared.hasConsent(for: .analytics) else { return }
Analytics.configure()
}
На Android аналогично через UserMessagingPlatform (Google UMP) или SDK выбранной CMP.
Google UMP как минимальный вариант
Google User Messaging Platform — бесплатный вариант от Google, интегрируется в AdMob. Подходит для приложений, монетизирующихся только через Google рекламу:
val params = ConsentRequestParameters.Builder()
.setTagForUnderAgeOfConsent(false)
.build()
consentInformation.requestConsentInfoUpdate(
activity, params,
{
if (consentInformation.isConsentFormAvailable) {
loadForm()
}
},
{ error -> /* обработать */ }
)
UMP не подходит, если используются сторонние рекламные сети — нужна полноценная TCF-совместимая CMP.
Гранулярные согласия
GDPR требует раздельных согласий по целям. Минимальный набор категорий:
- Необходимые (Strictly Necessary) — без согласия, нельзя отключить
- Аналитика (Analytics) — Firebase, Amplitude, Mixpanel
- Реклама (Advertising) — AdMob, Facebook Audience Network
- Персонализация (Personalization) — рекомендательные системы
- Внешние сервисы — Sentry (crash reporting), Intercom (support)
Crash reporting — спорная категория. Технически нужен для работы сервиса, можно аргументировать как necessary. Но если Sentry/Crashlytics передаёт user_id — это персональные данные, нужно согласие.
iOS ATT Framework
На iOS 14.5+ приложения обязаны запрашивать ATTrackingManager.requestTrackingAuthorization перед доступом к IDFA (рекламному идентификатору). Это отдельно от GDPR-согласия — это требование Apple.
ATTrackingManager.requestTrackingAuthorization { status in
switch status {
case .authorized:
// IDFA доступен, можно передавать в рекламные SDK
let idfa = ASIdentifierManager.shared().advertisingIdentifier
case .denied, .restricted, .notDetermined:
// работаем без IDFA, SKAdNetwork для атрибуции
}
}
Показывать ATT диалог нужно после CMP диалога и желательно с предварительным объяснением зачем это нужно — иначе конверсия разрешений очень низкая.
Хранение и синхронизация согласий
Согласие хранится локально с timestamp и версией документов (Privacy Policy, Terms). При смене версии — повторный запрос. При смене региона пользователя — пересмотр применимых требований.
Логировать согласие нужно серверно: при изменении отправлять на бэкенд {user_id, consent_version, purposes: {...}, timestamp, ip_hash}. Это доказательная база при проверке регулятора.
Сроки реализации CMP с гранулярными согласиями, условной инициализацией SDK, ATT flow на iOS и серверным логированием — 2–3 дня при использовании готовой CMP SDK. Кастомная реализация без готового SDK — до 5 дней.







