GDPR И CCPA
Пожалуйста, обратите внимание, что лучше всего обратиться к квалифицированным юристам, чтобы получить дополнительную информацию и быть хорошо подготовленным к соблюдению требований.
Закон Европейского союза о защите персональных данных, более известный как GDPR, вступил в силу 25 Мая 2018 года. Это набор правил, разработанный для жителей Европейского союза, о получении контроля над сбором их персональных данных. Любые бизнесы, основанные в Европейском союзе или имеющие пользователей из Европейского союза, обязаны соответствовать закону о защите персональных данных (GDPR) во избежание связанных рисков. Закон California Consumer Privacy Act (CCPA) вступил в силу 1 Января 2020 года. Мы собрали вместе полезную информацию, для того что бы помочь вам лучше понять необходимые шаги в соответсвии вашего приложения требованиям GDRP.
Шаг 1. Обновление Политики Конфеденциальности
Добавьте Дополнительную Информацию В Вашу Политику Конфиденциальности
Не забудьте добавить информацию о сборе IP адреса и рекламного ID, так же как ссылку на политику конфиденциальности Appodeal в вашу политику конфиденциальности в App Store и Google Play.
Для ускорения процесса вы можете воспользоваться генераторами политики конфиденциальности, где вам необходимо будет указать ID, IP адрес и локацию (если вы ее собираете) в поле Personally Identifiable Information you collect (в поле с дополнительной информацией о вашем приложении) а так же как ссылку на политику конфиденциальности Appodeal в поле Link to the privacy policy of third party service providers used by the app.
Добавьте Политику Конфиденциальности В Ваше Мобильное Приложение
Вам необходимо явно добавить ссылку на вашу политику конфиденциальности в два места: на страницу приложения в app’s store и в ваше приложение.
Вы можете найти подробные инструкции о добавлении политики конфиденциальности в ваше приложения на официальных ресурсах, например: Iubenda - решение, адаптированное к требованиям законодательства, которое содержит подробное руководство по включению политики конфиденциальности в ваше приложение.
Убедитесь что ваш сайт с политикой конфиденциальности содержит SSL-сертификат — это пункт может казаться очевидным, но это важно.
Ниже вы можете найти две ссылки на ресурсы, которые вы можете использовать во время работы над соответствием вашего приложения:
- Privacy, Security and Deception regulations (by Google Play)
- Recommendations on Developing a Meaningful Privacy Policy (by Attorney General California Department of Justice)
Пожалуйста, обратите внимание, что, хотя мы всегда готовы предоставить вам ценную информацию, мы не уполномочены предоставлять какие-либо юридические консультации. Важно адресовать свои вопросы юристам, которые работают в соответствующей области.
Шаг 2. Настройка Stack Consent Manager c поддержкой TCF v2
Начиная с версии 3.2.1 Appodeal SDK полностью совместим с Google UMP и поддерживает IAB TCF v2.
В соответствии с Appodeal и рекламными сетями в предоставлении наиболее подходящей мобильной рекламы конечному пользователю, вам необходимо запрашивать соглашение в регионах GDPR.
Чтобы получить согласие на сбор персональных данных ваших пользователей, мы предлагаем воспользоваться готовым решением - Stack Consent Manager, основанном на Google User Messaging Platform (UMP).
Перед началом работы, требуется настроить Google UMP. Воспользуйтесь этой инструкцией для настройки окна согласия.
Шаг 3. Интеграция Stack Consent Manager
Библиотека Stack Consent Manager включает разработанное окно согласия, показ которого вы можете предоставлять конечному пользователю. Это означает что вам больше не требуется создавать данное окно согласия самостоятельно.
Начиная с Appodeal SDK 3.0, Stack Consent Manager включен в состав Appodeal SDK по умолчанию.
Согласие будет запрошено автоматически при инициализации SDK, и форма согласия будет показана, если это необходимо, без дополнительных вызовов.
Имейте в виду, что Согласие будет отображаться только в регионах ЕС, вы можете использовать VPN для тестирования.
Это означает, что код интеграции Appodeal SDK остается прежним:
- UPM Дистрибуция
- Manual Дистрибуция
private void Start()
{
int adTypes = AppodealAdType.Interstitial | AppodealAdType.Banner | AppodealAdType.RewardedVideo | AppodealAdType.Mrec;
string appKey = "YOUR_APPODEAL_APP_KEY";
AppodealCallbacks.Sdk.OnInitialized += OnInitializationFinished;
Appodeal.Initialize(appKey, adTypes);
}
#region Initialization Callback
public void OnInitializationFinished(object sender, SdkInitializedEventArgs e) { }
#endregion
class Test : IAppodealInitializationListener
{
private void Start()
{
int adTypes = Appodeal.INTERSTITIAL | Appodeal.BANNER | Appodeal.REWARDED_VIDEO | Appodeal.MREC;
string appKey = "YOUR_APPODEAL_APP_KEY";
Appodeal.initialize(appKey, adTypes, this);
}
#region Initialization Callback
public void onInitializationFinished(List <-string-> errors) { }
#endregion
}
Продвинутое Использование CMP
Если необходимо, вы можете управлять мендежером согласия вручную, при помощи Appodeal CMP юнити плагина. Для этого сначало нужно установить этот плагин, как показано ниже:
-
Убедитесь, что у вас установлен Appodeal юнити плагин v4.4.0 или новее через UPM.
-
Скопируйте ссылку ниже, перейдите в Window → Package Manager → "+" → Add package from git URL, вставьте скопированную ссылку и нажмите Enter.
https://github.com/appodeal/cmp-unity-plugin.git#v2.2.0
- Добавьте пространство имён, указанное ниже, в ваш скрипт
using AppodealStack.Cmp;
Обновление Статуса Согласия
Чтобы обновить согласие, вызовите метод:
private void Start()
{
ConsentManager.Instance.OnConsentInfoUpdateFailed += (sender, args) =>
{
Debug.Log($"[Appodeal CMP] OnConsentInfoUpdateFailed event triggered. Cause: {args.Cause}");
};
ConsentManager.Instance.OnConsentInfoUpdateSucceeded += (sender, args) =>
{
Debug.Log($"[Appodeal CMP] OnConsentInfoUpdateSucceeded event triggered.");
};
var parameters = new ConsentInfoParameters
{
AppKey = "YOUR_APPODEAL_APP_KEY",
IsUnderAgeToConsent = false,
Sdk = "Appodeal",
SdkVersion = Appodeal.GetNativeSDKVersion()
};
ConsentManager.Instance.RequestConsentInfoUpdate(parameters);
}
RequestConsentInfoUpdate метод может быть запрошен в любой момент жизненного цикла приложения. Мы рекомендуем
запрашивать его при запуске приложения. Допускается несколько вызовов в рамках одной сессии.
Необходимые параметры: YOUR_APPODEAL_APP_KEY - Ключ приложения Appodeal, его можно получить
в личном кабинете;
ConsentInfoParameters - Класс данных, представляющий параметры для запроса на обновление согласия в Appodeal
Consent Manager. Используйте этот класс для инкапсуляции необходимой информации и для обновления предпочтений согласия.
Параметры:
AppKey- Ключ, связанный с пользователем, для которого обновляется согласие.IsUnderAgeToConsent- Опционально. Указывает, помечен ли данный пользователь как не достигший возраста согласия. Устанавливается вtrue, если пользователь не достиг возраста согласия, в противном случае устанавливается вfalse.Sdk- Опционально. Идентификатор SDK, выполняющего запрос на обновление согласия.SdkVersion- Опционально. Версия SDK, выполняющего запрос на обновление согласия.
ConsentManager.Instance.OnConsentInfoUpdateFailed, ConsentManager.Instance.OnConsentInfoUpdateSucceeded -
слушатели для запроса результата.
Текущий Статус Согласия
После обновления информации о согласии вы можете проверить текущий статус:
var status = ConsentManager.Instance.ConsentStatus;
Перечисление, представляющее возможные статусы согласия в Appodeal Consent Manager.
Unknown- Представляет неизвестный статус согласия;Required- Представляет статус требуемого согласия;NotRequired- Представляет необязательный статус согласия;Obtained- Представляет статус полученного согласия.
Загрузка Формы Согласия
Вы м ожете загрузить и получить ConsentForm объект, используя следующий код:
private ConsentForm consentForm;
ConsentManager.Instance.OnConsentFormLoadFailed += (sender, args) =>
{
Debug.Log($"[Appodeal CMP] OnConsentFormLoadFailed event triggered. Cause: {args.Cause}");
};
ConsentManager.Instance.OnConsentFormLoadSucceeded += (sender, args) =>
{
Debug.Log($"[Appodeal CMP] OnConsentFormLoadSucceeded event triggered.");
consentForm = args.ConsentForm;
};
ConsentManager.Instance.Load();
Отображение Формы Согласия
После того как окно согласия будет загружено, вы можете показать его.
ConsentManager.Instance.OnConsentFormDismissed += (sender, args) =>
{
string message = "[Appodeal CMP] OnConsentFormDismissed event triggered.";
if (args.Error != null) message += $" Error: {args.Error}";
Debug.Log(message);
consentForm = null;
};
consentForm?.Show();
Загрузка И Показ По Необходимости
В качестве альтернативы, вы можете загрузить и автоматически показать форму, если это необходимо.
ConsentManager.Instance.OnConsentFormDismissed += (sender, args) =>
{
string message = "[Appodeal CMP] OnConsentFormDismissed event triggered.";
if (args.Error != null) message += $" Error: {args.Error}";
Debug.Log(message);
};
ConsentManager.Instance.LoadAndShowConsentFormIfRequired();
Сб рос Статуса Согласия
Вы можете сбросить статус согласия на Unknown, используя метод:
ConsentManager.Instance.Revoke();
Поддержк а US State Regulations (Privacy Entry Point)
2.1.0.Privacy-законы штатов США (CCPA, CPA, VCDPA и другие) работают по модели opt-out: обработка данных разрешена по умолчанию, но пользователю должна быть предоставлена постоянная возможность отказаться — обычно в виде кнопки "Do Not Sell or Share My Personal Information" (Privacy Entry Point). В США форма согласия не показывается автоматически при инициализации SDK, потому что согласие при запуске не требуется — форму отказа нужно показывать по запросу пользователя.
Для поддержки этого сценария Consent Manager предоставляет два члена:
ConsentManager.Instance.PrivacyOptionsStatus— позволяет определить, нужно ли отображать кнопку Privacy Entry Point в интерфейсе приложения.ConsentManager.Instance.ShowPrivacyOptionsForm()— показывает US opt-out форму (или форму повторного согласия GDPR, если вызвать её в регионе EEA).
Оба становятся доступны после завершения RequestConsentInfoUpdate.
Проверка необходимости Privacy Entry Point
Используйте PrivacyOptionsStatus, чтобы решить, нужно ли отрисовывать кнопку отказа. Свойство
возвращает PrivacyOptionsStatus.Required для пользователей из регулируемых штатов США и EEA (для
повторного согласия GDPR), PrivacyOptionsStatus.NotRequired для остальных и
PrivacyOptionsStatus.Unknown до завершения RequestConsentInfoUpdate.
if (ConsentManager.Instance.PrivacyOptionsStatus == PrivacyOptionsStatus.Required)
{
// Покажите кнопку «Do Not Sell or Share My Personal Information» / Privacy Settings
}
Показ Privacy Options формы
Вызывайте ShowPrivacyOptionsForm из обработчика нажатия кнопки Privacy Entry Point. Это
единственный способ показать US opt-out форму; вызов должен быть инициирован явным действием
пользователя, а не инициализацией SDK. Результат приходит через то же событие OnConsentFormDismissed,
что и для формы согласия.
ConsentManager.Instance.OnConsentFormDismissed += (sender, args) =>
{
string message = "[Appodeal CMP] OnConsentFormDismissed event triggered.";
if (args.Error != null) message += $" Error: {args.Error}";
Debug.Log(message);
};
ConsentManager.Instance.ShowPrivacyOptionsForm();
После того как пользователь взаимодействует с US opt-out формой, Stack Consent Manager записывает
соответствующие ключи (IABGPP_*) в стандартные настройки платформы, откуда их читают рекламные сети.
Пока форма не была показана хотя бы один раз, эти ключи остаются пустыми, и рекламные с ети могут
считать, что согласие не собрано.
Неперсонализированная реклама
Согласие применяется автоматически — дополнительная интеграция не требуется.
Если вы хотите запросить неперсонализированную рекламу независимо от полученного согласия, вызовите
Appodeal.SetNonPersonalized(true). Это отключает сбор данных, используемых для персонализации рекламы,
а значение, установленное издателем, имеет приоритет над согласием, полученным из CMP. Вызывайте его
до Appodeal.Initialize(...).
Это актуально в нескольких сценариях:
- Пользователи с возрастными ограничениями (США). Законы штатов США (CCPA/CPRA в Калифор нии и
аналогичные законы в Вирджинии, Колорадо, Коннектикуте и других) ограничивают продажу или передачу
персональных данных несовершеннолетних, а COPPA устанавливает более строгие правила для детей младше
13 лет. Используйте этот флаг вместе с
SetChildDirectedTreatment, когда точный возраст неизвестен, но таргетинг необходимо ограничить. - Пользователи, отказавшиеся от персонализированной рекламы через ваш собственный процесс согласия, если они не подпадают под конкретное регулирование, охватываемое другими API.
- Общий отказ (opt-out) — универсальный вариант для подавления сигналов таргетинга, когда ни один из более специфичных флагов конфиденциальности не применим.
Appodeal.SetNonPersonalized(true);
Переопределение географии для тестирования (Debug Settings)
2.2.0 (Appodeal Unity Plugin 4.4.0).Какую форму увидит пользователь, зависит от его географии: форма согласия GDPR в EEA, US opt-out форма в регулируемых штатах США и ничего в остальных регионах. Чтобы протестировать каждый сценарий без VPN, укажите Stack Consent Manager, какую географию имитировать на ваших тестовых устройствах.
Вызовите ConsentManager.Instance.SetDebugSettings до RequestConsentInfoUpdate (или до
Appodeal.Initialize, если вы полагаетесь на автоматический сценарий):
Geography—ConsentDebugGeography.Eea,ConsentDebugGeography.RegulatedUsStateилиConsentDebugGeography.Other.TestDeviceIds— идентификаторы физических устройств, на которых разрешено переопределение. Эмуляторы и симуляторы разрешены всегда, поэтому для них список можно оставить пустым.
Нативные SDK применяют переопределение, только если выполняются оба условия; иначе оно игнорируется, а лог устройства сообщает причину:
- сборка отладочная: Unity Development Build на Android, приложение, запущенное из Xcode, на iOS.
Release-сборки пишут
[Appodeal CMP] Debug settings ignored - release build; - устройство — эмулятор/симулятор, либо его идентификатор указан в
TestDeviceIds. Незарегистрированное устройство пишет[Appodeal CMP] Debug settings ignored - this device is not registered. Add testDeviceIds = ["<id>"] to ConsentDebugSettings.— скопируйте идентификатор из этой строки. На Android он не меняется при переустановке; на iOS он вычисляется изidentifierForVendorи меняется, когда с устройства удалено последнее приложение вашего вендора.
Когда переопределение применено, в логе появляется
[Appodeal CMP] CMP=Stack - debug geography EEA sent to server, а статус согласия и форма определяются
для имитируемой географии. Та же настройка управляет и Google UMP, если он настроен для приложения.
Unity Editor игнорирует debug-настройки и сообщает об этом в лог.
ConsentManager.Instance.SetDebugSettings(new ConsentDebugSettings
{
Geography = ConsentDebugGeography.Eea,
TestDeviceIds = new List<string> { "TEST_DEVICE_ID_FROM_LOG" }
});
ConsentManager.Instance.RequestConsentInfoUpdate(parameters);
Чтобы убрать переопределение, вызовите SetDebugSettings(null).
Сохранённое согласие имеет приоритет над имитируемой географией: после того как пользователь ответил на
форму, она не показывается повторно, пока согласие не отозвано (ConsentManager.Instance.Revoke()) или
не очищены данные приложения. Удалите debug-настройки перед публикацией; в release-сборках они в любом
случае игнорируются.