GDPR и CCPA
Имейте в виду, что лучше всего обратиться к квалифицированным юристам, чтобы получить подробную информацию и быть хорошо осведомленным в вопросах защиты персональных данных.
Общее положение о защите данных, более известное как GDPR, вступило в силу 25 мая 2018 года. Это набор правил, призванных дать гражданам ЕС больше контроля над своими личными данными. Любые издатели приложений, которые созданы в ЕС или имеющие пользователей, базирующихся в Европе, обязаны соблюдать GDPR или рискуют столкнуться с большими штрафами. Калифорнийский закон о конфиденциальности потребителей (CCPA) вступил в силу 1 января 2020 года.
Мы собрали несколько ресурсов ниже, чтобы помочь издателям лучше понять, какие шаги им нужно выполнить, чтобы соответствовать требованиям GDPR.
Вы можете получить больше информации о GDPR и CCPA и различиях в этих законах вы можете найти здесь
Шаг 1. Обновление Политики Конфиденциальности
1.1 Убедитесь, Что Ваша Политика Конфиденциальности Включает Информацию О Сборе Рекламных Идентификаторов.
Не забудьте добавить информацию об IP-адресе и сборе advertising IDs, а также ссылку на политику конфиденциальности Appodeal в политику конфиденциальности вашего приложения в Google Play.
Чтобы ускорить процесс, вы можете использовать генераторы политики конфиденциальности
- просто вставьте advertising ID, IP address, location (если вы собираете местоположение пользователя) в поле "Personally Identifiable Information you collect"(Личная информация, которую вы собираете) и ссылку на политику конфиденциальности Appodeal в разделе "Ссылка на политику конфиденциальности сторонних поставщиков услуг, используемых приложением".
1.2 Добавьте Политику Конфиденциальности В Свое Мобильное Приложение.
Вы должны добавить свои политики конфиденциальности в двух местах: на странице вашего приложения в магазине приложений и внутри вашего приложения.
Подробные инструкции по добавлению политики конфиденциальности в приложение можно найти на веб-сайтах юридических служб. Например, Iubenda, решение, разработанное с учетом требований законодательства, предоставляет исчерпывающее руководство по включению политики конфиденциальности в ваше приложение.
Убедитесь, что на вашем веб-сайте с политикой конфиденциальности есть SSL сертификат - этот момент может показаться очевидным, но он по-прежнему важен.
Вот два полезных ресурса, которые вы можете использовать во время работы над соответствием вашего приложения:
Пожалуйста, обратите внимание, что, хотя мы всегда готовы предоставить вам ценную информацию, мы не уполномочены предоставлять какие-либо юридические консультации. Важно адресовать свои вопросы юристам, которые работают именно в этой области.
Шаг 2. Stack Consent Manager
Для того чтобы Appodeal и наши поставщики рекламы могли предоставлять рекламу, которая наиболее релевантна для ваших пользователей, как издателю мобильных приложений, вам необходимо получить явное согласие пользователей в регионах, попадающих под действие законов GDPR и CCPA.
Чтобы получить согласие на сбор персональных данных ваших пользователей, мы предлагаем вам воспользоваться готовым решением - Stack Consent Manager.
Stack Consent Manager поставляется с заранее подготовленным окном согласия, которое вы можете легко показать своим пользователям. Это означает, что вам больше не нужно создавать собственное окно согласия.
Начиная с Appodeal SDK 3.0, Stack Consent Manager включен по умолчанию в Appodeal SDK.
Согласие будет запрошено автоматически при инициализации SDK, и форма согласия будет показана, если это необходимо, без каких-либо дополнительных вызовов.
- Kotlin
- Java
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Appodeal.initialize(activity, appKey, adTypes, object : ApdInitializationCallback {
override fun onInitializationFinished(list: List<ApdInitializationError>?) {
// Инициализация Appodeal завершена
}
})
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Appodeal.initialize(activity, appKey, adTypes, new ApdInitializationCallback() {
@Override public void onInitializationFinished(List<? extends ApdInitializationError> list) {
// Инициализация Appodeal завершена
}
});
}
Дополнительная Информация
Stack Consent Manager включен в Appodeal SDK по умолчанию. Согласие будет запрошено автоматически при инициализации SDK, и форма согласия будет показана, если это необходимо, без каких-либо дополнительных вызовов.
Также вы можете использовать свой собственный менеджер согласия или использовать наш Stack Consent Manager в ручном режиме.
Обновить Решение Пользователя
Если вы хотите дать возможность пользователям изменить согласие на сбор персональных данных, то вы можете обновить состояние Consent используя методы:
- Kotlin
- Java
Appodeal.updateGDPRUserConsent(GDPRUserConsent.Personalized)
Appodeal.updateCCPAUserConsent(CCPAUserConsent.OptIn)
Appodeal.updateGDPRUserConsent(GDPRUserConsent.Personalized);
Appodeal.updateCCPAUserConsent(CCPAUserConsent.OptIn);
Используйте следующие значения, чтобы задать согласие пользователя на GDPR и CCPA.
GDPRUserConsent.Unknown
- статус не определен. Консент окно показано не было.
GDPRUserConsent.Personalized
- пользователь дал согласие на персонализированную рекламу.
GDPRUserConsent.NonPersonalized
- пользователь НЕ дал согласие на персонализированную рекламу.
CCPAUserConsent.Unknown
- статус не определен. Консент окно показано не было.
CCPAUserConsent.OptIn
- пользователь дал согласие на персонализированную рекламу.
CCPAUserConsent.OptOut
- пользователь НЕ дал согласие на персонализированную рекламу.
Вы можете использовать эти методы для предоставления согласия пользователя GDPR / CCPA в любом месте вашего приложения. Найти больше информации о GDPR / CCPA можно здесь.
Кастомизация Stack Consent
Вы можете управлять согласием и обновлять его вручную с помощью вызовов Stack Consent Manager.
Обновление Статуса Согласия
Чтобы обновить согласие, вызовите метод:
- Kotlin
- Java
override fun onCreate(savedInstanceState: Bundle?) {
ConsentManager.requestConsentInfoUpdate(this, "YOUR_APP_KEY", object: ConsentInfoUpdateListener() {
override fun onConsentInfoUpdated(consent: Consent) {
super.onConsentInfoUpdated(consent)
// Статус согласия пользователя успешно обновлен.
// Инициализируем Appodeal SDK с полученным здесь объектом Consent или показываем окно согласия.
}
override fun onFailedToUpdateConsentInfo(error: ConsentManagerError) {
super.onFailedToUpdateConsentInfo(error)
// Не удалось обновить статус согласия пользователя.
// Инициализируем Appodeal SDK с параметрами по умолчанию.
}
})
}
@Override
protected void onCreate(Bundle savedInstanceState) {
ConsentManager.requestConsentInfoUpdate(this, "YOUR_APP_KEY", new ConsentInfoUpdateListener() {
@Override
public void onConsentInfoUpdated(@NonNull Consent consent) {
super.onConsentInfoUpdated(consent);
// Статус согласия пользователя успешно обновлен.
// Инициализируем Appodeal SDK с полученным здесь объектом Consent или показываем окно согласия.
}
@Override
public void onFailedToUpdateConsentInfo(@NonNull ConsentManagerError consentManagerError) {
super.onFailedToUpdateConsentInfo(consentManagerError);
// Не удалось обновить статус согласия пользователя.
// Инициализируем Appodeal SDK с параметрами по умолчанию.
}
});
}
requestConsentInfoUpdate
может быть запрошен в любой момент жизненного цикла приложения. Мы
рекомендуем запросить его при запуске приложения. Допускается несколько вызовов по запросу.
Необходимые параметры:
YOUR_APP_KEY
- Ключ приложения Appodeal, вы можете найти его в вашем личном кабинете;
ConsentInfoUpdateListener
- listener для обработки результата запроса.
Если информация о согласии успешно обновлена, обновленное согласие предоставляется с помощью метода
onConsentInfoUpdated()
от ConsentInfoUpdateListener
.
Теперь вы можете получать информацию о предыдущем состоянии consent пользователя и зоне регулирования.
- Kotlin
- Java
// Получить consent status
val consentStatus = consent.status
// Получить consent status
Consent.Status consentStatus = consent.getStatus();
Перед запросом эти параметры находятся в состоянии undefined
.
Значение Consent Status | Описанияе |
---|---|
UNKNOWN | Значение не определено (метод requestConsentInfoUpdate() не был вызван) |
NON_PERSONALIZED | Пользователь не предоставил согласие на персонифицированную рекламу. |
PARTLY_PERSONALIZED | Пользователь частично(для нескольких рекламных сетей) дал согласие на персонализированную рекламу. |
PERSONALIZED | Пользователь предоставил согласие на персонифицированную рекламу. |
Необходимость Отображения Окна Согласия
После вызова метода onConsentInfoUpdated вам необходимо определить, подпадают ли ваши пользователи под действие GDPR и CCPA и следует ли показывать окно согласия на сбор персональных данных.
Вы можете проверить, нужно ли показывать диалоговое окно согласия или нет. Перед запросом
requestConsentInfoUpdate
эти параметры не определены и возвращают false
.
- Kotlin
- Java
// Получить текущий статус ShouldShow
var consentShouldShow = ConsentManager.shouldShow
if (consentShouldShow) {
// Показать окно согласия
}
// Получить текущий статус ShouldShow
boolean consentShouldShow = ConsentManager.getShouldShow();
if (consentShouldShow) {
// Показать окно согласия
}
Отображение Окна Согласия
SDK позволяет показывать окно согласия только после вызова requestConsentInfoUpdate
.
После запроса SDK вы можете сформировать и загрузить окно согласия. Загрузка разрешена для любой з оны регулирования и не зависит от предыдущего согласия пользователя.
Обязательный параметр Context
.
Опциональный параметр ConsentFormListener
.
- Kotlin
- Java
// Создать ConsentFormListener
val consentFormListener = object : ConsentFormListener() {
override fun onConsentFormLoaded(consentForm: ConsentForm) {
// Форма согласия была загружена. Теперь вы можете отобразить форму согласия как активность или как диалог
}
override fun onConsentFormError(error: ConsentManagerError) {
// Не удалось загрузить или показать форму согласия. Более подробную информацию можно найти в объекте 'error'
// Инициализируем Appodeal SDK с параметрами по умолчанию.
}
override fun onConsentFormOpened() {
// Форма согласия была показана
}
override fun onConsentFormClosed(consent: Consent) {
// Consent form was closed, you may initialize Appodeal SDK here
}
}
// Создание нового экземпляра ConsentForm
val consentForm = ConsentForm(this, consentFormListener)
// Загрузка ConsentForm
consentForm.load()
// Создать ConsentFormListener
IConsentFormListener consentFormListener = new ConsentFormListener() {
@Override
public void onConsentFormLoaded(@NonNull ConsentForm consentForm) {
// Форма согласия была загружена. Теперь вы можете отобразить форму согласия как активность или как диалог
}
@Override
public void onConsentFormError(ConsentManagerError error) {
// Не удалось загрузить или показать форму согласия. Более подробную информацию можно найти в объекте 'error'
// Инициализируем Appodeal SDK с параметрами по умолчанию.
}
@Override
public void onConsentFormOpened() {
// Форма согласия была показана
}
@Override
public void onConsentFormClosed(Consent consent) {
// Форма согласия была закрыта, здесь можно инициализировать Appodeal SDK
}
};
// Создание нового экземпляра ConsentForm
ConsentForm consentForm = new ConsentForm(context, consentFormListener);
// Загрузка ConsentForm
consentForm.load();
Вы можете проверить, готово ли к показу окно согласия:
- Kotlin
- Java
// Указывает, что окно согласия готово к показу
val loaded = consentForm.isLoaded
// Указывает, что окно согласия готово к показу
boolean loaded = consentForm.isLoaded();
Вы можете проверить, показывается ли окно согласия:
- Kotlin
- Java
// Указывает, что окно согласия показывается
val showing = consentForm.isShowing
// Указывает, что окно согласия показывается
boolean showing = consentForm.isShowing();
После того, как окно согласия будет доступно, вы можете его показать:
- Kotlin
- Java
// Показать СonsentForm
consentForm.show()
// Показать СonsentForm
consentForm.show();
После первого показа окна согласия параметр ConsentManager.shouldShow
будет иметь значение FALSE
в следующих сессиях.
Обновить значение Сonsent
Если вы хотите дать возможность пользователям изменить согласие на сбор персональных данных, то вы можете обновить состояние Consent используя методы:
- Kotlin
- Java
Appodeal.updateConsent(consent)
Appodeal.updateConsent(consent);
Advanced
Вы можете записывать ключи iAB в SharedPreference через consent manager, настроив хранилище перед
запросом в ConsentManager.Storage
SDK не удаляет ключи iAB из SharedPreference
, а только переопределяет их.
- Kotlin
- Java
// Указать хранилище
ConsentManager.storage = ConsentManager.Storage.SHARED_PREFERENCE
// Получить хранилище
val iabStorage = ConsentManager.storage
// Указать хранилище
ConsentManager.setStorage(ConsentManager.Storage.SHARED_PREFERENCE);
// Получить хранилище
ConsentManager.Storage iabStorage = ConsentManager.getStorage();
Пример Использования
Вам необходимо обновить значение согласия перед инициализацией Appodeal SDK. Приведенный ниже код демонстрирует, как отобразить окно согласия и обновить значение согласия с помощью Stack Consent Window, если необходимо разделить показ окна и инициализацию Appodeal SDK. После обновления значения согласия вы можете инициализировать Appodeal SDK.
- Kotlin
- Java
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestConsentUpdate()
}
fun initializeAppodeal() {
// Используйте этот метод для предотвращения лишних запросов ConsentInfoUpdate.
Appodeal.initialize(this, appKey, adTypes)
}
fun showConsent() {
val consentFormListener = object : ConsentFormListener() {
override fun onConsentFormLoaded(consentForm: ConsentForm) {
// Форма согласия была загружена. Теперь можно отобразить форму согласия.
consentForm.show()
}
override fun onConsentFormError(error: ConsentManagerError) {
// Не удалось загрузить или показать форму согласия. Более подробную информацию можно найти в объекте 'error'
// Инициализируем Appodeal SDK здесь.
initializeAppodeal()
}
override fun onConsentFormOpened() {
// Форма согласия показана.
}
override fun onConsentFormClosed(consent: Consent) {
// Форма согласия была закрыта. Обновите здесь значение согласия.
Appodeal.updateConsent(consent)
// Инициализируйте Appodeal SDK здесь.
initializeAppodeal()
}
}
// Создание нового экземпляра ConsentForm.
val consentForm = ConsentForm(this, consentFormListener)
// Загрузить ConsentForm.
consentForm.load()
}
fun requestConsentUpdate() {
// Обновить статус согласия. Требуется для отображения ConsentForm.
ConsentManager.requestConsentInfoUpdate(this, appKey, object : ConsentInfoUpdateListener() {
override fun onConsentInfoUpdated(consent: Consent) {
super.onConsentInfoUpdated(consent)
// Статус согласия пользователя успешно обновлен.
// Показать окно согласия для получения согласия пользователя.
if (ConsentManager.shouldShow) {
showConsent()
} else {
// Инициализируйте Appodeal SDK здесь.
initializeAppodeal()
}
}
override fun onFailedToUpdateConsentInfo(error: ConsentManagerError) {
super.onFailedToUpdateConsentInfo(error)
// Не удалось обновить статус согласия пользователя.
// Инициализируйте Appodeal SDK здесь.
initializeAppodeal()
}
})
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestConsentUpdate();
}
// Используйте этот метод для предотвращения лишних запросов ConsentInfoUpdate.
void initializeAppodeal() {
Appodeal.initialize(this, appKey, adTypes);
}
void showConsent() {
IConsentFormListener consentFormListener = new ConsentFormListener() {
@Override
public void onConsentFormLoaded(@NonNull ConsentForm consentForm) {
// Форма согласия была загружена. Теперь можно отобразить форму согласия.
consentForm.show();
}
@Override
public void onConsentFormError(ConsentManagerError error) {
// Не удалось загрузить или показать форму согласия. Более подробную информацию можно найти в объекте 'error'
// Инициализируйте Appodeal SDK здесь.
initializeAppodeal();
}
@Override
public void onConsentFormOpened() {
// Форма согласия показана.
}
@Override
public void onConsentFormClosed(Consent consent) {
// Форма согласия была закрыта. Обновите здесь значение согласия.
Appodeal.updateConsent(consent);
// Инициализируйте Appodeal SDK здесь.
initializeAppodeal();
}
};
// Создание нового экземпляра ConsentForm.
ConsentForm consentForm = new ConsentForm(this, consentFormListener);
// Загрузить ConsentForm.
consentForm.load();
}
void requestConsentUpdate() {
ConsentManager.requestConsentInfoUpdate(this, appKey, new ConsentInfoUpdateListener() {
@Override
public void onConsentInfoUpdated(@NonNull Consent consent) {
super.onConsentInfoUpdated(consent);
// Статус согласия пользователя успешно обновлен.
// Показать окно согласия для получения согласия пользователя.
if (ConsentManager.getShouldShow()) {
showConsent();
} else {
// Инициализируйте Appodeal SDK здесь.
initializeAppodeal();
}
}
@Override
public void onFailedToUpdateConsentInfo(@NonNull ConsentManagerError consentManagerError) {
super.onFailedToUpdateConsentInfo(consentManagerError);
// Не удалось обновить статус согласия пользователя.
// Инициализируйте Appodeal SDK здесь.
initializeAppodeal();
}
});
}
Свое Окно Согласия
Если вы не хотите использовать Stack Content Manager SDK, вы можете использовать другое решение для получения согласия пользователя и предоставить его перед инициализацией Appodeal SDK.
Необходимо передать согласие перед методом инициализации нашего SDK, используя следующие методы:
- Kotlin
- Java
Appodeal.updateGDPRUserConsent(GDPRUserConsent.Personalized)
Appodeal.updateCCPAUserConsent(CCPAUserConsent.OptIn)
Appodeal.updateGDPRUserConsent(GDPRUserConsent.Personalized);
Appodeal.updateCCPAUserConsent(CCPAUserConsent.OptIn);
Используйте следующие значения, чтобы задать согласие пользователя на GDPR и CCPA:
GDPRUserConsent.Unknown
- статус не определен. Консент окно показано не было.
GDPRUserConsent.Personalized
- пользователь дал согласие на персонализированную рекламу.
GDPRUserConsent.NonPersonalized
- пользователь НЕ дал согласие на персонализированную рекламу.
CCPAUserConsent.Unknown
- статус не определен. Консент окно показано не было.
CCPAUserConsent.OptIn
- пользователь дал согласие на персонализированную рекламу.
CCPAUserConsent.OptOut
- пользователь НЕ дал согласие на персонализированную рекламу.
Предоставление значений согласия перед инициализацией предотвращает встроенное отображение окна согласия. Вы должны использовать этот подход, чтобы отключить показ окно согласия в зонах GDPR / CCPA, или если вы хотите, чтобы пользователь мог изменить свое решение.