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

DMA🔗

В связи с выходом DMA большим digital компаниями (gatekeepers) для работы с идентификаторами пользователя нужно получать явные разрешения от пользователей. Разрешения собираются с использованием специальных сервисов CMP (consent management platform). Например, Didomi

Для Google сбор этих разрешений перекладывается на проект. Другие большие компании (Meta и другие) берут этот сбор на себя. Таким образом эти изменения касаются прежде всего работы с Google. Если не реализовать эти изменения, то спустя какое-то время атрибуция от Google будет отключена.

Важно, что пока некоторое время для старых версия AF SDK атрибуция Google будет работать (Google некоторое время будет отдавать атрибуцию для тех пользователей, которые разрешили работать с их id). Но надо оперативно внедрять, никаких гарантий нет и такая возможность может в любой момент пропасть.

Основные тезисы и рекомендации

  • Получение разрешений уже реализовано через CMP. Если уже делает запрос по TCF 2.2, то дополнительно имплементировать ничего не надо.
  • Рекомендуем запросы на разрешение (вызов CMP) делать на самом запуске. Без разрешения AF SDK не инициализируется и как результат не увидит установку и не сможет сделать атрибуцию.
  • Рекомендуем реализовать в проекте “флаг” для включения поддержки этого механизма, который можно включать/выключать со стороны сервера на случай, если возникнут какие-то баги/проблемы.
  • Использовать версии библиотек:
    • AF SDK >= 6.14.0
    • Firebase Unity >= 11.9.0
    • MRGS >= 6.17.0

Интеграция🔗

Обновите SDK до рекомендуемых выше версий

AppsFlyer🔗

Необходим модуль MRGSAnalytics. При инициализации MRGS, в параметрах AppsFlyer необходимо выставить флаг WaitForTCF - время в секундах, после которого AppsFlyer будет запущен, не дожидаясь ответа от CMP. Рекомендуемое значение - 5 минут (300 секунд). В этом режиме MRGS будет ожидать решения пользователя, и при его получении - передаст информацию в AppsFlyer и вызовет старт.

using MRGS;

public class MasterController : MonoBehaviour
{
    void Awake()
    {
        // Setting up MRGS parameters
        // ...

        var sdkParams = new MRGSExternalSDKParams
        {
            // ...
            // For Android, you can specify an empty string instead of APPLE_APP_ID
            AppsFlyerParams = new MRGSAppsFlyerParams(APPS_FLYER_DEVKEY, APPLE_APP_ID)
            {
                Debug = false
                WaitForTCF = 300
            }
            // ...
        };

        // Configuring External SDKs and initializing MRGS
        // ...

        MRGService.Instance.Initialize(serviceParams, sdkParams);
    }
}
@import MRGService;

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Setting up MRGS parameters
    // ...
    //Setting up external SDKs

    MRGSAppsFlyerParams *appsFlyerParams = [[MRGSAppsFlyerParams alloc] initWithDevKey:<APPS_FLYER_DEVKEY> appleAppId:<APPLE_APP_ID>];
    appsFlyerParams.waitForTCF = 300

    NSArray *externalParams = @[ ..., appsFlyerParams];
    [MRGService startWithServiceParams:<params> externalSDKParams:externalParams delegate:nil];
}
import games.my.mrgs.MRGSExternalSDKParams;
import games.my.mrgs.MRGSExternalSDKParams.AppsFlyerParams;
import games.my.mrgs.MRGService;
import games.my.mrgs.MRGServiceParams;

public class YourApplicationClass extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // Setting MRGService
        final MRGServiceParams serviceParams = ...;
        // Setting External SDKs
        final AppsFlyerParams appsFlyerParams = AppsFlyerParams.init("<APPS_FLYER_DEVKEY>");
        appsFlyerParams.setDebuggable(false);
        appsFlyerParams.setWaitForTCF(300);

        final MRGSExternalSDKParams externalSDKParams = MRGSExternalSDKParams.newInstance();
        externalSDKParams.appsFlyerParams = appsFlyerParams;

        MRGService.service(context, serviceParams, externalSDKParams);
    }
}

Важно, что при получении ответа от CMP и на следующих запусках AppsFlyer будет запускаться без этого таймаута

Если есть MRGSDidomi🔗

После получения ответа от Didomi MRGS автоматически передаст результат в MRGSAppsFlyer, делать ничего не нужно.

Если нет MRGSDidomi🔗

После того, как CMP отработал (юзер принял/юзер не попадает/etc - то есть когда уже идет старт всех SDK) - вызвать у MRGSAppsFlyer метод onCMPConsentCollectionFinished (если нет CMP, то нужно сделать, то же самое, но только вручную используя setConsent)

Firebase🔗

Для работы модуль MRGSFirebase НЕ требуется

Если есть MRGSDidomi🔗

  • Необходимо выставить флаг EnableFirebaseConsentSetting в true
MRGSDidomi.Instance.EnableFirebaseConsentSetting = true;
[MRGSDidomi sharedInstance].enableFirebaseConsentSetting = true;
MRGSDidomi.getInstance().enableFirebaseConsentSetting(true);

После этого при получении consent от Didomi MRGS передаст его в Firebase.setConsent

  • Добавить в plist/manifest приложения флаг отложенного старта firebase FIREBASE_ANALYTICS_COLLECTION_ENABLED/firebase_analytics_collection_enabled. Подробнее тут.

Если нет MRGSDidomi🔗

Поддержки такого случая нет, необходимо реализовывать самостоятельно

События🔗

При старте AppsFlyer с consent из CMP, MRGS отправит в AppsFlyer событие mrgs_dma_start с параметрами:

If started from CMP:
"tcfString"

If started with manual consent:
"isUserSubjectToGDPR"
"dataUsage"
"adsPersonalization"

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