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
После этого при получении 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-08-29