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
В соответствии с Appodeal и рекламными сетями в предоставлении наиболее подходящей мобильной рекламы конечному пользователю, вам необходимо запрашивать соглашение в регионах GDPR и CCPA.
Чтобы получить согласие на сбор персональных данных ваших пользователей, мы предлагаем воспользоваться готовым решением - Stack Consent Manager.
Библиотека Stack Consent Manager включает разработанное окно согласия, показ которого вы можете предоставлять конечному пользователю. Это означает что вам больше не требуется создавать данное окно согласия самостоятельно.
Начиная с Appodeal SDK 3.0, Stack Consent Manager включен в состав Appodeal SDK по умолчанию.
Согласие будет запрошено автоматически при инициализации SDK, и форма согласия будет показана, если это необходимо, без дополнительных вызовов.
Имейте в виду, что Согласие будет отображаться только в регионах ЕС и Калифорнии, вы можете использовать VPN для тестирования.
- 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, или если вы хотите, чтобы пользователь мог изменить свое решение.