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-сертификат — это пункт может казаться очевидным, но это важно.
Ниже вы можете найти две ссылки на ресурсы, которые вы можете использовать во время работы над соответствием вашего приложения:
- App privacy details on the App Store
- 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 остается прежним:
- Swift
- Objective-C
@UIApplicationMain
final class MyAppDelegate: UIResponder, UIApplicationDelegate, AppodealInitializationDelegate {
func application(
_ application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil ) -> Bool {
Appodeal.setAutocache(false, types: .interstitial)
Appodeal.setLogLevel(.verbose)
// New optional delegate for initialization completion
Appodeal.setInitializationDelegate(self)
/// Any other pre-initialization
/// app specific logic
Appodeal.initialize(
withApiKey: "APP_KEY",
types: .interstitial
)
return true
}
func appodealSDKDidInitialize() {
// Appodeal SDK did complete initialization
}
}
@interface MyAppDelegate ()
<AppodealInitializationDelegate>
@end
@implementation MyAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[Appodeal setAutocache:NO types:AppodealAdTypeInterstitial];
[Appodeal setLogLevel:APDLogLevelVerbose];
// New optional delegate for initialization completion
[Appodeal setInitializationDelegate:self];
/// Any other pre-initialization
/// app specific logic
[Appodeal initializeWithApiKey:@"APP KEY" types:AppodealAdTypeInterstitial];
return YES;
}
- (void)appodealSDKDidInitialize {
// Appodeal SDK did complete initialization
}
@end
Дополнительно
Начиная с версии Appodeal SDK 3.2.1 вам не нужно обновлять согласие пользователя вручную, все данные будут считаны с NSUserDefaults и переданы в другие SDK автоматически. Также, в случае, если приложение уже исползует альтернтивный Consent Management Platform, Appodeal SDK будет использовать его данные, не изменяя их.
Ручное управление согласием
При желании вы можете управлять согласием и обновлять его вручную, используя методы Stack Consent Manager.
Сейчас StackConsentManager так же поддерживает Swift Concurrency.
Stack Consent Manager можно синхронизировать в любой момент жизненного цикла приложения. Рекомендуем синхронизировать его при запуске приложения. Допускается несколько вызовов синхронизации. Пример:
- Swift
- Objective-C
import StackConsentManager
/// Initialisation
class YourAppDelegate: AppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?
) -> Bool {
let parameters = ConsentUpdateRequestParameters(
appKey: "YOUR_APP_KEY",
mediationSdkName: "YOUR_SDK_NAME",
mediationSdkVersion: "YOUR_SDK_VERSION",
COPPA: true
)
// requesting consent info update
ConsentManager.shared.requestConsentInfoUpdate(parameters: parameters) { error in
guard error == nil else { return } // error occured while receiving consent info
// loading and showing consent dialog
ConsentManager.shared.loadAndPresentIfNeeded(rootViewController: UIViewController()) { error in
if let error {
// error occured
} else {
// everything was fine, now you have user's consent
// initialize SDK here
}
}
}
return true
}
}
#import <StackConsentManager/StackConsentManager-Swift.h>
@implementation YourAppDelegate
/// Initialisation
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
APDConsentUpdateRequestParameters *parameters = [[APDConsentUpdateRequestParameters alloc] initWithAppKey:@"YOUR_APP_KEY" mediationSdkName:@"YOUR_SDK_NAME" mediationSdkVersion:@"YOUR_SDK_VERSION" COPPA:true];
// requesting consent info update
[APDConsentManager.shared requestConsentInfoUpdateWithParameters:parameters completion:^(NSError * error) {
if (error) {
// error occured while receiving consent info
return;
}
// loading and showing consent dialog
[APDConsentManager.shared loadAndPresentIfNeededWithRootViewController:[UIViewController new] completion:^(NSError *error) {
if (error) {
return; // error occured while receiving user consent
}
// everything was fine, now you have user's consent
// initialize SDK here
}];
}];
return YES;
}
@end
Принудительный показ окна согласия.
Если вы хотите получить больше контроля над Consent dialog, вы можете использовать следующий код. В нем Consent dialog загружается отдельно и есть возможность, например, хранить на него ссылку
- Swift
- Objective-C
/// Initialisation
class YourAppDelegate: AppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?
) -> Bool {
let parameters = ConsentUpdateRequestParameters(
appKey: "YOUR_APP_KEY",
mediationSdkName: "YOUR_SDK_NAME",
mediationSdkVersion: "YOUR_SDK_VERSION",
COPPA: true
)
// requesting consent info update
ConsentManager.shared.requestConsentInfoUpdate(parameters: parameters) { error in
guard error == nil else { return } // error occured while receiving consent info
// loading consent dialog
ConsentManager.shared.load { dialog, error in
guard error == nil else { return } // error occured while loading consent dialog
// showing consent dialog
dialog?.present(rootViewController: UIViewController(), completion: { error in
guard error == nil else { return } // error occured while receiving user consent
// everything was fine, now you have user's consent
// initialize SDK here
})
}
}
return true
}
}
/// Initialisation
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
APDConsentUpdateRequestParameters *parameters = [[APDConsentUpdateRequestParameters alloc] initWithAppKey:@"YOUR_APP_KEY" mediationSdkName:@"YOUR_SDK_NAME" mediationSdkVersion:@"YOUR_SDK_VERSION" COPPA:true];
// requesting consent info update
[APDConsentManager.shared requestConsentInfoUpdateWithParameters:parameters completion:^(NSError * error) {
if (error) {
return; // error occured while receiving consent info
}
// loading consent dialog
[APDConsentManager.shared loadWithCompletion:^(APDConsentDialog *dialog, NSError *error) {
if (error) {
return; // error occured while loading consent dialog
}
if (dialog) {
// showing consent dialog
[dialog presentWithRootViewController:[UIViewController new] completion:^(NSError *error) {
if (error) {
return; // error occured while receiving user consent
}
// everything was fine, now you have user's consent
// initialize SDK here
}];
}
}];
}];
return YES;
}
APP_KEY
- обязательный параметр (Appodeal APP Key)
SDK позволяет вызывать api Сonsent окна то лько после синхронизации
Проверка статуса согласия
После завершения синхронизации вы можете получить информацию о предыдущем согласии пользователя. До синхронизации этот параметр не определен.
- Swift
- Objective-C
// Check consent status
let status = ConsentManager.shared.status
// Check consent status
APDConsentStatus status = [APDConsentManager.shared status];
Отзыв согласия
Если вам необходимо отозвать согласие пользователя, вы можете использовать следующий код:
- Swift
- Objective-C
// Check consent status
ConsentManager.shared.revoke()
// Check consent status
[APDConsentManager.shared revoke];