Перейти к содержанию

Что необходимо🔗

Нужно обновить некоторые библиотеки, в которых добавилась поддержка TCF, а также интегрировать сам TCF модуль.

  1. Обновить MRGService(core) до 6.10.0 или выше.
  2. Обновить IronSource до 7.7.0 или выше.
  3. Если используется ISMRGSCustomAdapter , то его нужно обновить до 6.10.0 или выше.
  4. Интегрировать TCF модуль MRGSDidomi.

Добавление модуля в проект🔗

Добавление в Unity проект (общая инструкция)

Шаг 1. Добавьте источники

Для того, чтобы добавить MRGS в проект через Unity Package Manager (доступно с Unity 2018+) просто добавьте в файл Packages/manifest.json раздел scopedRegistries, добавив в него следующую запись:

{
    "dependencies": {
        ...
    },
    "scopedRegistries": [
            {
                "name": "MRGS",
                "url": "https://mrgs-nexus.my.games/repository/mrgs-uninty-plugins/",
                "scopes": [
                    "games.my.mrgs"
                ]
            }
    ]
}

Альтернативно, можно нажать Edit -> Project Settings -> Package Manager -> '+' in scoped registry section, и заполнить поля в соответствии с данными выше.

Шаг 2. Добавьте зависимость

  • Нажмите Window -> Package Manager -> select 'Packages: MyRegistries' from dropdown list, выберите пакет MRGSDidomi из списка, затем нажмите "Install"
  • Импортируйте модуль: using MRGS;
  • Загрузите последнюю версию библиотеки. Распакуйте архив.
  • (Для интеграции unitypackage) В Unity нажмите Assets -> Import Package -> Custom Package, и выберите пакет games.my.mrgs.didomi.unitypackage из скачанного архива.
  • (Для интеграции tgz) В Unity нажмите Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакет games.my.mrgs.didomi-<version>.tgz из скачанного архива.
  • Импортируйте модуль: using MRGS;
Добавление в iOS проект (общая инструкция)

Шаг 1. Добавьте зависимости

Через Package collection

  • В Xcode выберите File > Add Packages
  • Выберите «+» > "Add Swift Package Collection"
  • Вставьте URL: https://mrgs-nexus.my.games/repository/ios-sdks/MRGSPackageCollection.json
  • Выберите модуль MRGSDidomi из "MRGS Package Collection".
  • Или вы можете выбрать пакет «MRGS» из "MRGS Package Collection" (содержит все модули mrgs в качестве продуктов), а затем выбрать только продукт "MRGS/Didomi".

Отдельными пакетами

  • В Xcode выберите File > Add Packages
  • В строке поиска в правом верхнем углу вставьте URL: https://mrgs-gitea.my.games/mrgs/mrgsdidomi-ios-sdk.git
  • Добавьте модуль в свой проект
  • Или вы можете вставить URL https://mrgs-gitea.my.games/mrgs/ios-sdks.git, чтобы подключить пакет "MRGS", который содержит все модули mrgs в качестве продуктов, а затем выбрать только продукт "MRGS/Didomi".

Шаг 2. Добавьте поддержку категорий ObjectiveC

  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSDidomi; или #import <MRGSDidomi/MRGSDidomi.h>

Шаг 1. Добавьте источники

В вашем podfile добавьте источники в начало файла:

source 'https://github.com/CocoaPods/Specs.git' # For main repo
source 'https://mrgs-gitea.my.games/mrgs/cocoapods-specs.git'  # For MRGS repo

Шаг 2. Добавьте зависимости

В target добавьте последнюю версию MRGSDidomi:

Чтобы добавить через subspecs:

target 'MyProject' do
    pod 'MRGS', '~> 5.0.0', :subspecs => ['Didomi']
end

Для добавления через отдельные модули:

target 'MyProject' do
    pod 'MRGSDidomi', '~> 5.0.0'
end

Чтобы добавить все модули mrgs:

target 'MyProject' do
    pod 'MRGS/AllKits', '~> 5.0.0'
end

Шаг 3. Установите зависимости

  • Выполните pod install (или pod install --repo-update если необходимо)
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSDidomi; или #import <MRGSDidomi/MRGSDidomi.h>

Шаг 1. Добавьте зависимости

Добавьте зависимость в ваш Cartfile:

binary "https://mrgs-nexus.my.games/repository/ios-sdks/MRGSDidomi/MRGSDidomi.json" ~> 5.0.0

Шаг 2. Установите зависимости

  • Выполните carthage update --use-xcframeworks
  • Добавьте загруженные фреймворки в свой проект (убедитесь, что опция "do not embed" включена)
  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSDidomi; или #import <MRGSDidomi/MRGSDidomi.h>
  • Загрузите последнюю версию библиотеки. Распакуйте архив.
  • Добавьте MRGSDidomi.xcframework из скачанного архива в ваш проект (Перетащите библиотеки в раздел "Linked frameworks and Libraries") (для совместимости в архиве также находится MRGSDidomi.framework - fat framework старого вида)

  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".

  • Импортируйте модуль в коде: @import MRGSDidomi; или #import <MRGSDidomi/MRGSDidomi.h>
  • Также, вы можете добавить из архива файлы MRGServiceKit.h и module.modulemap в свой проект, либо в настройках проекта укажите путь до них в разделе Build Settings -> Header search paths. Теперь вместо импорта каждого из наших фреймворков по отдельности, вы можете импортировать только один заголовочный файл: @import MRGServiceKit;
Добавление в Android проект

Добавьте зависимость в build.gradle файл:

dependencies {
    def mrgsVersion = "6.x.x"

    implementation "games.my.mrgs:didomi:$mrgsVersion"
}

Скопируйте файл MRGSDidomi.aar в директорию libs вашего проекта. Добавьте необходимые зависимости в файл build.gradle

dependencies {
    //...
    implementation(name: 'MRGSDidomi', ext:'aar')

    implementation 'io.didomi.sdk:android:1.87.0'
}

Инициализация SDK🔗

Прежде чем приступить к инициализация SDK, потребуется получить AppKey и NoticeId.

  1. AppKey - один общий на MY.GAMES. Его можно получить в админке Didomi на главной странице

didomi-consent-api-key

  1. NoticeId - у каждого проекта он свой. Его можно получить в админке Didomi в разделе Consent Notices

didomi-consent-notices

Затем провести инициализацию MRGSDidomi:

var settings = new MRGSDidomiInitializeParameters(
    apiKey:  "<AppKey>",
    localConfigurationPath: null,
    remoteConfigurationUrl: null,
    providerId: null,
    disableDidomiRemoteConfig: false,
    languageCode: null,
    noticeId: "<NoticeId>"
);
MRGSDidomi.Instance.Setup(settings);
DidomiInitializeParameters* params = [[DidomiInitializeParameters alloc] initWithApiKey:@"<AppKey>"
                                                                 localConfigurationPath:nil
                                                                 remoteConfigurationURL:nil
                                                                             providerID:nil
                                                              disableDidomiRemoteConfig:NO
                                                                           languageCode:nil
                                                                               noticeID:@"<NoticeId>"];

[[MRGSDidomi sharedInstance] setupWithParams:params];
import games.my.mrgs.didomi.MRGSDidomi;
import io.didomi.sdk.DidomiInitializeParameters;

final DidomiInitializeParameters settings = new DidomiInitializeParameters(
    "<AppKey>",
    null,
    null,
    null,
    false,
    null,
    "<NoticeId>"
);

MRGSDidomi.getInstance().setup(context, settings);

GDPR

Если в вашем проекте есть поддержка показа GDPR, то инициализацию Didomi лучше проводить после того как пользователь примет условия GDPR.

Логика инициализации рекламных SDK🔗

ВАЖНО: Инициализацию любых рекламных SDK надо отложить до момента получения consent..

Проекту необходимо реализовать логику включения рекламных SDK основываясь на результате показа TCF и сопоставления целей и ID из Didomi. Важно поддержать следующие возможные сценарии:

  • Вариант 1: Получили полное согласие от пользователя ((opt-in): all consent/legitimate interest enabled). Включаем все SDK, показываем персонализированную рекламу.
  • Вариант 2: Получили полный отказ от пользователя ((opt-out) => all consent/legitimate interest disabled). НЕ инициализируем никакие рекламные SDK's, рекламу НЕ показываем.
  • Вариант 3: Частичное соглашение, но на Цель 1 был получен отказ (consent disabled cookies). НЕ инициализируем никакие рекламные SDK's, рекламу НЕ показываем.
  • Вариант 4: Частичное соглашение, на Цель 1 получили согласие, а на Цель 3 и 4 получили отказ (consent enabled cookies + consent disabled create_ads_profile; select_personalized_ads). Включаем рекламные SDK's, но показываем не персонализированную рекламу.

Если получили согласие на Цель 1, можно инициализировать рекламные SDK's, в том числе IronSource SDK (медиацию). Также необходимо отправлять в медиацию результаты согласие/несогласие на Цели 3 и 4 (персонализированная реклама).

IronSource

Согласно документации, можно отправить результаты согласие/несогласие на Цели 3 и 4 следующим образом:

var result = MRGSDidomi.Instance.HasAcceptedPersonalizedAdvertising;
IronSource.Agent.setConsent(result);
BOOL result = [MRGSDidomi sharedInstance].hasAcceptedPersonalizedAdvertising;
[IronSource setConsent:result];
final boolean result = MRGSDidomi.getInstance().hasAcceptedPersonalizedAdvertising();
IronSource.setConsent(result);

Tapjoy Offerwall

Этот SDK можно инициализировать, только если получили согласие на Цель 1, так как данное SDK работает с персональными данными.
Согласно документации, у Tapjoy есть свои флаги:
Есть согласие на цель 1 + нет согласия на таргетированную рекламу (цели 3 и 4) - TJStatusFalse
Есть согласие на цель 1 + есть согласие на таргетированную рекламу (цели 3 и 4) - TJStatusTrue

Показ TCF окна🔗

Логика показа окна TCF🔗

Без получения consent, не показываем никакую рекламу - ни внешнюю, ни кросс-промо. Если по каким-то причинам Didomi SDK не инициализировалось или инициализировалось с ошибкой и не было показано окно TCF, считается, что consent не получен и нужно повторно вызывать окно.

Для проектов без Interstitial🔗

С user-initiated форматом - если проект не получил согласие TCF на старте игры, то проект вызывает TCF-баннер при нажатии на кнопку “Посмотреть рекламу” (то есть показ блока TCF вместо показа рекламы).

Для проектов с Interstitial🔗

Если проект не получил согласие TCF на старте игры, то проект вызывает TCF-баннер в момент входа в игру в сессию, когда пользователь должен увидеть первый interstitial, например:

  • Если планируются показ interstitial в первую сессию - показ TCF сразу после показа окна с ToS/Privacy Policy и ATT.
  • Если планируется показ interstitial на 7й день жизни - показ TCF на старте игры для игроков чей день жизни >= 7, при этом если до interstitial пользователь захотел посмотреть Rewarded Video, показываем TCF при нажатии на кнопку “Посмотреть рекламу”.

Показ основного баннера (1st layer)🔗

MRGSDidomi.Instance.ShowNotice();
[[MRGSDidomi sharedInstance] showNoticeAtViewController:self];
import androidx.fragment.app.FragmentActivity;
import games.my.mrgs.didomi.MRGSDidomi;

MRGSDidomi.getInstance().showNotice(FragmentActivity);

Примечание

Вам не нужно ожидать события Ready перед тем как вызвать showNotice, потому что они вызываются внутренне (самим Didomi SDK). Следовательно, при вызове этого метода уведомление о согласии и просмотры предпочтений будут отображаться только в том случае, если это требуется (если пользователь попадает под условия показа TCF), и только после того, как SDK будет готово.

Показ настроек (2nd layer)🔗

Проекту необходимо добавить кнопку Privacy Settings в настройки. По нажатию на кнопку должно вызываться окно TCF (сразу со списком целей 2nd layer). Лучше иметь примерное одинаковое название у всех, так как на эту кнопку ссылаемся в общем privacy policy.

Для показа настроек целей (2nd layer) воспользуйтесь методом:

MRGSDidomi.Instance.ShowPreferences();
[[MRGSDidomi sharedInstance] showPreferencesAtViewController:self forView:ViewsPurposes];
import games.my.mrgs.didomi.MRGSDidomi;

MRGSDidomi.getInstance().showPreferences(FragmentActivity);

Важно

Данный метод может приводить к неопределенному поведению если его вызывать до инициализации Didomi SDK или если SDK еще не готово. На пример SDK может запомнить что метод был вызван, и когда оно будет готово оно может его показать, то есть между вызовом метода и готовностью SDK может пройти много времени, но если времени пройдет очень много, SDK может проигнорировать вызов функции вовсе.

Дополнительные возможности🔗

Особенности работы🔗

Очень важно учесть, что при работе с функционалом Didomi SDK, нужно вызывать его функционал только после успешной инициализации самого SDK. В противном случае это может приводить к: падениям, не корректному возврату результатов, или функционал просто не будет ни как отвечать на его вызов. Исключением является лишь методы инициализации и выставления делегатов/слушателей событий, последние нужно добавлять до вызова метода инициализации.

Результатом успешной инициализации SDK служит событие из делегата/слушателя событий onReady.

Основной делегат/слушатель событий🔗

Основным делегатом/слушателем в Didomi является DidomiEventListener, предоставляющий большое кол-во событий. Стоит отменить что в MRGSDidomi для Unity была перенесена лишь основная/важная часть событий, но по запросу сможет добавить остальные требуемые/необходимые события.

Выставление/удаление делегата/слушателя:

var listener = new MRGSDidomiEventListener();
listener.Ready += (o, e) => {
    Debug.Log("Didomi#OnReady was called.");
};
listener.Error += (o, e) => {
    Debug.Log("Didomi#OnError was called: " + e.ErrorMessage);
};
listener.ShowNotice += (o, e) => {
    Debug.Log("Didomi#OnShowNotice was called.");
};
listener.HideNotice += (o, e) => {
    Debug.Log("Didomi#OnHideNotice was called.");
};
listener.ShowPreferences += (o, e) => {
    Debug.Log("Didomi#OnShowPreferences was called.");
};
listener.HidePreferences += (o, e) => {
    Debug.Log("Didomi#OnHidePreferences was called.");
};
listener.ConsentChanged += (o, e) => {
    Debug.Log("Didomi#ConsentChanged was called.");
};

MRGSDidomi.Instance.AddEventListener(listener);
MRGSDidomi.Instance.Setup(MRGSDidomiInitializeParameters);

// MRGSDidomi.Instance.RemoveEventListener(listener);
DDMEventListener* listener = [[DDMEventListener alloc] init];
listener.onReady = ^(enum DDMEventType type) {
};
listener.onConsentChanged = ^(enum DDMEventType type) {
};
listener.onShowPreferences = ^(enum DDMEventType type) {
};

[[MRGSDidomi sharedInstance] addEventListener:listener];
// Init Didomi SDK

// [[MRGSDidomi sharedInstance] removeEventListener:listener];
import android.util.Log;

import androidx.annotation.NonNull;

import games.my.mrgs.didomi.MRGSDidomi;
import io.didomi.sdk.DidomiInitializeParameters;
import io.didomi.sdk.events.ConsentChangedEvent;
import io.didomi.sdk.events.ErrorEvent;
import io.didomi.sdk.events.EventListener;
import io.didomi.sdk.events.HideNoticeEvent;
import io.didomi.sdk.events.HidePreferencesEvent;
import io.didomi.sdk.events.ReadyEvent;
import io.didomi.sdk.events.ShowNoticeEvent;
import io.didomi.sdk.events.ShowPreferencesEvent;
import io.didomi.sdk.functionalinterfaces.DidomiEventListener;

final DidomiEventListener listener = new EventListener() {
    @Override
    public void ready(@NonNull ReadyEvent event) {
        Log.d("Didomi", "#OnReady was called.");
    }

    @Override
    public void error(@NonNull ErrorEvent event) {
        Log.d("Didomi", "#OnError was called: " + event.getErrorMessage());
    }

    @Override
    public void showNotice(@NonNull ShowNoticeEvent event) {
        Log.d("Didomi", "#OnShowNotice was called.");
    }

    @Override
    public void hideNotice(@NonNull HideNoticeEvent event) {
        Log.d("Didomi", "#OnHideNotice was called.");
    }

    @Override
    public void showPreferences(@NonNull ShowPreferencesEvent event) {
        Log.d("Didomi", "#OnShowPreferences was called.");
    }

    @Override
    public void hidePreferences(@NonNull HidePreferencesEvent event) {
        Log.d("Didomi", "#OnHidePreferences was called.");
    }

    @Override
    public void consentChanged(@NonNull ConsentChangedEvent event) {
        Log.d("Didomi", "#ConsentChanged was called.");
    }
};

MRGSDidomi.getInstance().addEventListener(listener);
MRGSDidomi.getInstance().setup(Context, DidomiInitializeParameters);

// MRGSDidomi.getInstance().removeEventListener(listener);
Значения событий

DidomiEventListener#Ready - Сигнализирует о том что Didomi SDK успешно инициализировалось и что можно работать с остальным функционалом данного SDK.
DidomiEventListener#Error - В момент инициализации Didomi SDK произошла ошибка (также возможен вызов данного метода в течение работы SDK). Если ошибка повторяется, возможно есть проблемы с ключами AppKey или NoticeId. При попытке вызывать другие методы SDK, можно получить неопределенные поведения.
DidomiEventListener#ShowNotice - Пользователь наблюдает основой баннер соглашения (1st layer).
DidomiEventListener#HideNotice - Пользователь закрыл основой баннер соглашения (1st layer).
DidomiEventListener#ShowPreferences - Пользователь наблюдает окно настроек (2st layer). Это событие также может вызываться каждый раз, когда пользователь попадет на это окно из 1st layer.
DidomiEventListener#HidePreferences - Пользователь закрыл окно настроек (2st layer). Это событие может вызываться каждый раз, если пользователь переходил на это окно из 1st layer.
DidomiEventListener#ConsentChanged - Вызывается каждый раз когда пользователь принял основное решение в основном баннере (1st layer) или меняет свои решения позже через настройки (2st layer).

Дополнительный делегат/слушатель событий🔗

MRGSDidomi SDK предоставляет дополнительный делегат/слушатель MRGSDidomiListener, для упрощения некоторой логики/функционала. Кол-во событий может измениться в будущем.

Выставление/удаление делегата/слушателя:

class YourClass : MRGSDidomi.IDelegate
{
    YourClass()
    {
        MRGSDidomi.Instance.Delegate = this;
        MRGSDidomi.Instance.Setup(MRGSDidomiInitializeParameters);

        // MRGSDidomi.Instance.Delegate = null;
    }

    public void OnReceiveConsentStatus()
    {
        Debug.Log("Didomi#OnReceiveConsentStatus was called.");
        // Write here extra logic base on user's choice to initialize ads SDK's
    }
}
@interface DidomiDelegateListener: NSObject <MRGSDidomiDelegate>
@end

@implementation DidomiDelegateListener

-(void)setup{
    [MRGSDidomi sharedInstance].delegate = self;

    // [MRGSDidomi sharedInstance].delegate = nil;
}

- (void)didReceiveConsentStatus {
    NSLog(@"Didomi#OnReceiveConsentStatus was called.");
    // Write here extra logic base on user's choice to initialize ads SDK's
}

@end
import android.util.Log;

import games.my.mrgs.didomi.MRGSDidomi;
import games.my.mrgs.didomi.MRGSDidomiListener;
import io.didomi.sdk.DidomiInitializeParameters;

final MRGSDidomiListener listener = new MRGSDidomiListener() {
    @Override
    public void onReceiveConsentStatus() {
        Log.d("MRGSDidomi", "#onReceiveConsentStatus was called.");
        // Write here extra logic base on user's choice to initialize ads SDK's
    }
};

MRGSDidomi.getInstance().setOnDidomiListener(listener);
MRGSDidomi.getInstance().setup(context, config);

// MRGSDidomi.getInstance().setOnDidomiListener(null);
Значения событий

MRGSDidomiListener#OnReceiveConsentStatus - Вызывается только один раз за сессию и сигнализирует о том что проект может приступить к инициализации рекламных SDK's. Это событие скрывает в себе такие проверки как: Успешную инициализацию Didomi SDK, попадает ли пользователь под TCF, соглашался ли пользователь ранее с TCF или согласился с ним только что. Обратите внимание, что данный метод лишь сигнализирует о подходящем моменте для инициализации рекламных SDK's, но проекту все еще нужно написать дополнительную логику основываясь на результате действия пользователя: разрешил ли он показывать ему рекламу и разрешил ли он показывать персонализированную рекламу.

Проверить на требования показа согласия🔗

Чтобы проверить, попадет ли пользователь под условия показа TCF и требуется ли ему показывать соглашение, воспользуйтесь методом:

var result = MRGSDidomi.Instance.IsConsentRequired;
BOOL result = [MRGSDidomi sharedInstance].isConsentRequired;
import games.my.mrgs.didomi.MRGSDidomi;

final boolean result = MRGSDidomi.getInstance().isConsentRequired();

Важно

Данный метод всегда будет возвращать false если Didomi SDK не инициализировано или не готово к работе.

Проверить разрешение на показ рекламы🔗

Чтобы проверить, разрешил ли пользователь показывать ему рекламу (Цель/Purpose 1 - cookies), воспользуйтесь методом:

var result = MRGSDidomi.Instance.HasAcceptedAdvertising;
BOOL result = [MRGSDidomi sharedInstance].hasAcceptedAdvertising;
import games.my.mrgs.didomi.MRGSDidomi;

final boolean result = MRGSDidomi.getInstance().hasAcceptedAdvertising();

Важно

Данный метод всегда будет возвращать неопределенный результат если Didomi SDK не инициализировано или не готово к работе.

Проверить разрешение на показ персонализированной рекламы🔗

Чтобы проверить, разрешил ли пользователь показывать ему персонализированную рекламу (Цель/Purpose 3 и 4 - create_ads_profile и select_personalized_ads), воспользуйтесь методом:

var result = MRGSDidomi.Instance.HasAcceptedPersonalizedAdvertising;
BOOL result = [MRGSDidomi sharedInstance].hasAcceptedPersonalizedAdvertising;
import games.my.mrgs.didomi.MRGSDidomi;

final boolean result = MRGSDidomi.getInstance().hasAcceptedPersonalizedAdvertising();

Важно

Данный метод всегда будет возвращать неопределенный результат если Didomi SDK не инициализировано или не готово к работе.

Проверить принимал ли пользователь соглашение🔗

Чтобы проверить, принимал ли пользователь ранее соглашение, воспользуйтесь методом:

var result = MRGSDidomi.Instance.HasAcceptedAgreement;
BOOL result = [MRGSDidomi sharedInstance].hasAcceptedAgreement;
import games.my.mrgs.didomi.MRGSDidomi;

final boolean result = MRGSDidomi.getInstance().hasAcceptedAgreement();

Важно

Данный метод всегда будет возвращать false если Didomi SDK не инициализировано или не готово к работе.

Чтобы получить Consent String воспользуйтесь методом:

var userStatus = MRGSDidomi.Instance.UserStatus;
var consentString = userStatus?.ConsentString ?? "";
DDMUserStatus* userStatus = [MRGSDidomi sharedInstance].userStatus;
NSString* consentString = userStatus.consentString ?: @"";
import games.my.mrgs.didomi.MRGSDidomi;
import io.didomi.sdk.models.UserStatus;

final UserStatus userStatus = MRGSDidomi.getInstance().getUserStatus();
final String consentString = userStatus != null ? userStatus.getConsentString() : "";

Проверка статусов у целей🔗

Для получения списка целей, проверки и сопоставления их статусов:

var userStatus = MRGSDidomi.Instance.UserStatus;
if (userStatus == null) {
    // Didomi wasn't initialized or ready
    return;
}

var purposes = userStatus.Purposes;
// You can also check Consent and Legitimate Interest statuses.
var consent = purposes.Consent;
var isCookiesEnabled = consent.Enabled.Contains("cookies");
var isCookiesDisabled = consent.Disabled.Contains("cookies");

// etc
DDMUserStatus* userStatus = [MRGSDidomi sharedInstance].userStatus;
if(userStatus == nil){
    // Didomi wasn't initialized or ready
    return;
}

DDMUserStatusPurposes* purposes = userStatus.purposes;
// You can also check Consent and Legitimate Interest statuses.
DDMUserStatusIDs* consent = purposes.consent;
BOOL isCookiesEnabled = [consent.enabled containsObject:@"cookies"];
BOOL isCookiesDisabled = [consent.disabled containsObject:@"cookies"];

// etc
import games.my.mrgs.didomi.MRGSDidomi;
import io.didomi.sdk.models.UserStatus;

final UserStatus userStatus = MRGSDidomi.getInstance().getUserStatus();
if (userStatus == null) {
    // Didomi wasn't initialized or ready
    return;
}

final UserStatus.Purposes purposes = userStatus.getPurposes();
// You can also check Consent and Legitimate Interest statuses.
final UserStatus.Ids consent = purposes.getConsent();
final boolean isCookiesEnabled = consent.getEnabled().contains("cookies");
final boolean isCookiesDisabled = consent.getDisabled().contains("cookies");

// etc

Проверка статусов о поставщиков🔗

Для получения списка поставщиков и проверки их статусов:

var userStatus = MRGSDidomi.Instance.UserStatus;
if (userStatus == null) {
    // Didomi wasn't initialized or ready
    return;
}

var vendors = userStatus.Vendors;
// You can also check Consent and Legitimate Interest statuses.
var consent = vendors.Consent;
var isGoogleEnabled = consent.Enabled.Contains("google");
var isGoogleDisabled = consent.Disabled.Contains("google");

// etc
DDMUserStatus* userStatus = [MRGSDidomi sharedInstance].userStatus;
if(userStatus == nil){
    // Didomi wasn't initialized or ready
    return;
}

DDMUserStatusVendors* vendors = userStatus.vendors;
// You can also check Consent and Legitimate Interest statuses.
DDMUserStatusIDs* consent = vendors.consent;
BOOL isGoogleEnabled = [consent.enabled containsObject:@"google"];
BOOL isGoogleDisabled = [consent.disabled containsObject:@"google"];

// etc
import games.my.mrgs.didomi.MRGSDidomi;
import io.didomi.sdk.models.UserStatus;

final UserStatus userStatus = MRGSDidomi.getInstance().getUserStatus();
if (userStatus == null) {
    // Didomi wasn't initialized or ready
    return;
}

final UserStatus.Vendors vendors = userStatus.getVendors();
// You can also check their statuses.
final UserStatus.Ids consent = vendors.getConsent();
final boolean isGoogleEnabled = consent.getEnabled().contains("google");
final boolean isGoogleDisabled = consent.getDisabled().contains("google");

// etc

События и данные🔗

Таблица для сопоставления целей с Didomi SDK🔗

Purpose № Meaning Didomi SDK ID Type
1 Store and/or access cookies Consent
2 Use limited data to select advertising select_basic_ads Consent, Legitimate Interest
3 Create profiles for personalized advertising create_ads_profile Consent
4 Use profiles to select personalized advertising select_personalized_ads Consent
5 Create profiles to personalize content create_content_profile Consent
6 Use profiles to select personalized content select_personalized_content Consent
7 Measure advertising performance measure_ad_performance Consent, Legitimate Interest
8 Measure content performance measure_content_performance Consent, Legitimate Interest
9 Understand audiences through statistics market_research Consent, Legitimate Interest
10 Develop and improve services market_research Consent, Legitimate Interest
11 Use limited data to select content N/A Consent, Legitimate Interest

Собираемые метрики🔗

MRGSDidomi SDK собирает следующую статистику по TCF (название метрики: Трекинг запроса TCF 2.0 [-20]):

Object ID Meaning
0 Notice Displayed
1 Total User Choices
2 Opt-ins
3 Opt-outs
4 Partial opt-ins
5 'See more' button
6 Purpose 1
7 Purpose 3
8 Purpose 4
9 Consent Re-collection
Значения событий

Notice Displayed - Общее количество показов TCF-баннера.
Total User Choices - Общее количество полученных решений пользователем.
Opt-ins - Согласие со всеми целями и партнерами, события по кнопке Accept (1st layer) и по кнопке Accept All (2nd layer) (Opt-in => all consent/legitimate interest enabled).
Opt-outs - Отказ от всех целей, событие по кнопке Confirm Choices (2nd layer) при всех выключенных переключателей (Opt-out => all consent/legitimate interest disabled).
Partial opt-ins - Событие по кнопке Confirm Choices на 2nd layer при хотя бы одном выключенном или включенном переключателе (At least 1 consent/legitimate interest differs from other choices).
'See more' button - Нажатие на кнопку See more, переход с первого слоя на второй.
Purpose 1 - Согласие с целью 1 (Store and/or access).
Purpose 3 - Согласие с целью 3 (Create profiles for personalized advertising).
Purpose 4 - Согласие с целью 4 (Use profiles to select personalized advertising).
Consent Re-collection - Повторные показы TCF-баннера пользователям.

Посмотреть рекламу

Проектам нужно самим реализовать логирования событий нажатия на кнопку “Посмотреть рекламу”.

Пример🔗

using MRGS;

namespace Sample
{
    internal class DidomiExample
    {
        public class InitManager : MRGSDidomi.IDelegate
        {
            private bool _shouldInit = true;

            // After GDPR accepted
            public void OnInit()
            {
                // Setup delegate
                MRGSDidomi.Instance.Delegate = this;

                // Init didomi
                MRGSDidomi.Instance.Setup(new MRGSDidomiInitializeParameters("<API_KEY>", noticeId: "<NOTICE>"));

                // Showing notice on app start (recommended by Didomi)
                // Or you can show it when needed
                MRGSDidomi.Instance.ShowNotice();
            }

            public void OnReceiveConsentStatus()
            {
                var acceptedAds = MRGSDidomi.Instance.HasAcceptedAdvertising;
                var acceptedPersonalizedAds = MRGSDidomi.Instance.HasAcceptedPersonalizedAdvertising;

                if (acceptedAds)
                {
                    // Init sdks if needed (delegate can be called multiple times for session)
                    if (_shouldInit)
                    {
                        _shouldInit = false;
                        IronSource.Agent.init("<APP_KEY>");
                    }

                    // Set consents to sdks
                    IronSource.Agent.setConsent(acceptedPersonalizedAds);
                }
            }
        }

        /// <summary>
        /// View with button to show ad
        /// </summary>
        public class AdViewManager
        {
            public void OnShowAd()
            {
                var acceptedAds = MRGSDidomi.Instance.HasAcceptedAdvertising;
                if (acceptedAds)
                {
                    // Show loaded ad
                }
                else
                {
                    // Show explaining window
                    // ...

                    MRGSDidomi.Instance.ShowPreferences();

                    // If you don't show notice at app start,
                    // then you need to show it here:
                    // if (!MRGSDidomi.Instance.HasAcceptedAgreement)
                    // {
                    //     MRGSDidomi.Instance.ShowNotice();
                    // }
                    // else
                    // {
                    //     MRGSDidomi.Instance.ShowPreferences();
                    // }
                }
            }
        }

        /// <summary>
        /// Settings window in app
        /// </summary>
        public class SettingsViewManager
        {
            public bool ShouldShowTcfSettingsButton()
            {
                return MRGSDidomi.Instance.IsConsentRequired;
            }

            public void OnShowTCF()
            {
                MRGSDidomi.Instance.ShowPreferences();
            }
        }
    }
}
@interface InitManager: UIViewController <MRGSDidomiDelegate>
@property (nonatomic) BOOL shouldInit;
@end

@implementation InitManager

// After GDPR accepted
-(void)onInit{
    // Setup delegate
    [MRGSDidomi sharedInstance].delegate = self;

    // Init didomi
    DidomiInitializeParameters* params = [[DidomiInitializeParameters alloc] initWithApiKey:@"<AppKey>"
                                                                    localConfigurationPath:nil
                                                                    remoteConfigurationURL:nil
                                                                                providerID:nil
                                                                disableDidomiRemoteConfig:NO
                                                                            languageCode:nil
                                                                                noticeID:@"<NoticeId>"];
    [[MRGSDidomi sharedInstance] setupWithParams:params];

    // Showing notice on app start (recommended by Didomi)
    // Or you can show it when needed
    [[MRGSDidomi sharedInstance] showNoticeAtViewController:self];
}

- (void)didReceiveConsentStatus {
    BOOL acceptedAds = [MRGSDidomi sharedInstance].hasAcceptedAdvertising;
    BOOL acceptedPersonalizedAds = [MRGSDidomi sharedInstance].hasAcceptedPersonalizedAdvertising;

    if (acceptedAds) {
        // Init sdks if needed (delegate can be called multiple times for session)
        if (_shouldInit) {
            _shouldInit = false;
            [IronSource initWithAppKey:@"<APP_KEY>"];
        }

        // Set consents to sdks
        [IronSource setConsent:acceptedPersonalizedAds];
    }
}

@end

/// View with button to show ad
@interface AdViewManager: UIViewController
@end

@implementation AdViewManager

-(void)onShowAd{
    BOOL acceptedAds = [MRGSDidomi sharedInstance].hasAcceptedAdvertising;
    if (acceptedAds) {
        // Show loaded ad
    } else {
        // Show explaining window
        // ...

        [[MRGSDidomi sharedInstance] showPreferencesAtViewController:self forView:ViewsPurposes];

        // If you don't show notice at app start,
        // then you need to show it here:
        // if (![MRGSDidomi sharedInstance].hasAcceptedAgreement) {
        //     [[MRGSDidomi sharedInstance] showNoticeAtViewController:self];
        // } else {
        //     [[MRGSDidomi sharedInstance] showPreferencesAtViewController:self forView:ViewsPurposes];
        // }
    }
}

@end

/// Settings window in app
@interface SettingsViewManager: UIViewController
@end

@implementation SettingsViewManager

-(BOOL)shouldShowTcfSettingsButton {
    return [MRGSDidomi sharedInstance].isConsentRequired;
}

-(void)onShowTCF{
    [[MRGSDidomi sharedInstance] showPreferencesAtViewController:self forView:ViewsPurposes];
}

@end
import android.app.Activity;
import android.content.Context;

import androidx.fragment.app.FragmentActivity;

import com.ironsource.mediationsdk.IronSource;

import games.my.mrgs.didomi.MRGSDidomi;
import games.my.mrgs.didomi.MRGSDidomiListener;
import io.didomi.sdk.DidomiInitializeParameters;

class DidomiExample {
    public class InitManager implements MRGSDidomiListener {
        private boolean shouldInit = true;

        // After GDPR accepted
        public void onInit () {
            // Setup delegate
            MRGSDidomi.getInstance().setOnDidomiListener(this);

            // Init didomi
            MRGSDidomi.getInstance().setup(Context, DidomiInitializeParameters);

            // Showing notice on app start (recommended by Didomi)
            // Or you can show it when needed
            MRGSDidomi.getInstance().showNotice(FragmentActivity);
        }

        @Override
        public void onReceiveConsentStatus() {
            final boolean acceptedAds = MRGSDidomi.getInstance().hasAcceptedAdvertising();
            final boolean acceptedPersonalizedAds = MRGSDidomi.getInstance().hasAcceptedPersonalizedAdvertising();

            if (acceptedAds) {
                // Init sdks if needed (delegate can be called multiple times for session)
                if (shouldInit) {
                    shouldInit = false;
                    IronSource.init(Activity, "<APP_KEY>", ...);
                }

                // Set consents to sdks
                IronSource.setConsent(acceptedPersonalizedAds);
            }
        }
    }

    /// <summary>
    /// View with button to show ad
    /// </summary>
    public class AdViewManager {
        public void onShowAd() {
            final boolean acceptedAds = MRGSDidomi.getInstance().hasAcceptedAdvertising();
            if (acceptedAds) {
                // Show loaded ad
            } else {
                // Show explaining window
                // ...
                MRGSDidomi.getInstance().showPreferences(FragmentActivity);

                // If you don't show notice at app start,
                // then you need to show it here:
                //if (!MRGSDidomi.getInstance().hasAcceptedAgreement()) {
                //     MRGSDidomi.getInstance().showNotice(FragmentActivity);
                //} else {
                //     MRGSDidomi.getInstance().showPreferences(FragmentActivity);
                //}
            }
        }
    }

    /// <summary>
    /// Settings window in app
    /// </summary>
    public class SettingsViewManager {

        public boolean shouldShowTcfSettingsButton() {
            return MRGSDidomi.getInstance().isConsentRequired();
        }

        public void onShowTCF() {
            MRGSDidomi.getInstance().showPreferences(FragmentActivity);
        }
    }
}

Последнее обновление: 2024-01-29
Дата создания: 2024-01-29