Реалізація механізму управління согласием на обробку даних (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 днів.







