Згода у WebView: як синхронізувати нативну та веб-згоду

Проблема подвійного банера

Багато застосунків частково нативні, частково веб. Гра показує магазин, новини чи довідку у WebView; утиліта відображає статті зі свого сайту; гібридний застосунок обгортає більшу частину інтерфейсу у веб-контент. У кожної сторони свій механізм згоди: нативний застосунок використовує вбудований CMP або SDK, а веб-сторінки завантажують веб-CMP. Якщо вони не пов’язані, користувача питають двічі, вибір в одному місці ігнорується в іншому, а рекламні запити з WebView йдуть із неправильними сигналами.

У цьому посібнику описано, як узгодити нативну та веб-згоду, щоб користувачі відповідали один раз, а кожен рекламний запит ніс те саме рішення.

Де кожна сторона зберігає згоду

Нативний застосунок

IAB TCF визначає, як вбудований CMP зберігає згоду: у NSUserDefaults на iOS і SharedPreferences на Android, із використанням стандартних ключів, таких як IABTCF_TCString, IABTCF_gdprApplies та IABTCF_PurposeConsents. Рекламні SDK читають ці ключі безпосередньо. IAB GPP визначає подібні ключі з префіксом IABGPP_, наприклад IABGPP_HDR_GppString.

Веб

Веб-CMP зазвичай зберігає своє рішення у власних (first-party) cookie чи локальному сховищі для домену сайту та надає його через JavaScript-функції __tcfapi і __gpp. Рекламні теги на сторінці викликають ці функції, а не нативне сховище.

Розрив

У WebView власний простір cookie та сховища, окремий від браузера пристрою й від нативних налаштувань застосунку. На iOS WKWebView з непостійним сховищем даних забуває все під час закриття. Між двома сторонами нічого не передається, якщо ви самі цього не збудуєте.

Оберіть одне джерело істини

Перше рішення — яка сторона володіє згодою. Для більшості застосунків відповідь — нативний CMP, тому що:

Пріоритет веба може мати сенс для гібридних застосунків, увесь інтерфейс яких — веб-контент, але тоді рішення доведеться записувати назад у нативне сховище для нативних SDK.

Передавання нативної згоди у WebView

Якщо джерело істини — нативна сторона, WebView має бачити те саме рішення. Поширені шаблони:

  1. Впровадити реалізацію __tcfapi. До запуску скриптів сторінки впровадьте невеликий скрипт, що визначає __tcfapi (і __gpp, якщо потрібно) та відповідає на виклики TC string і значеннями, прочитаними з нативного сховища. Рекламні теги на сторінці тоді отримують нативне рішення через стандартний API.
  2. Приховати веб-банер. Налаштуйте веб-CMP так, щоб він не показувався, коли сторінку завантажено всередині вашого застосунку, наприклад за параметром запиту чи власним токеном user agent, який ви контролюєте. Інакше користувач побачить другий банер.
  3. Передати рядок під час завантаження. Деякі веб-CMP можуть прийняти наявний рядок згоди під час ініціалізації та використати його. Підтримувані методи шукайте в документації вашого веб-CMP.

Який би шаблон ви не обрали, переконайтеся, що впроваджувані значення оновлюються, коли користувач змінює вибір на нативному екрані налаштувань, а не лише під час наступного запуску застосунку.

Передавання веб-згоди назад у нативний застосунок

Якщо користувачі можуть змінювати згоду всередині WebView, наприклад на сторінці налаштувань приватності, застосунок має про це дізнатися. Використовуйте JavaScript-міст: обробник повідомлень на iOS або JavaScript-інтерфейс на Android. Веб-сторона слухає через __tcfapi('addEventListener', ...) і надсилає новий рядок нативному коду, який записує стандартні ключі. Перевіряйте дані з WebView перед записом; приймайте повідомлення лише від вашого власного контенту.

Реклама всередині WebView

Реклама, що відображається у WebView, є веб-рекламою. Вона читає згоду зі сторінки, а не з нативного сховища, якщо тільки рекламний SDK не надає спосіб пов’язати їх. Наприклад, Google Mobile Ads SDK пропонує API для реєстрації WebView, щоб реклама всередині них могла використовувати сигнали застосунку; актуальну документацію для вашого SDK дивіться окремо. У будь-якому разі тестом переконайтеся, що рекламні запити з WebView несуть той самий рядок TC або GPP, що й нативні рекламні запити.

Чек-лист тестування

Головні висновки

← Блaderegistrdelays delays Читати все →