informatie
Content

[Eenheid] 1. consentmanager SDK-integratie

[Eenheid] 1. consentmanager SDK-integratie

In dit document vindt u algemene informatie over hoe u onze SDK in uw project kunt integreren. Voor meer details verwijzen wij u naar onze API-referentie documentatie.

1. Installatie

De consentmanager SDK voor Android-apps implementeert en biedt functionaliteit om de gebruiker te informeren over gegevensbescherming en om toestemming van de gebruiker te vragen en te verzamelen. Het stelt app-ontwikkelaars in staat de consentmanager service in hun app. Als belangrijkste functies bieden we:

  • Ondersteunt zowel iOS- als Android-platforms.
  • Een brug tussen Unity en native platformspecifieke CMP-functionaliteiten.
  • Een eenvoudige manier om gebruikerstoestemming te initialiseren en te beheren en privacygerelateerde gegevens te verwerken.

Wat betreft compatibiliteit hebben we:

  • Eenheid 20XX.XX of later
  • iOS (via DllImport)
  • Android (via JNI)

Stappen - Hoog niveau

    1. Integratie en configuratie:

      • Integreer de SDK in uw app.
      • Configureer de SDK-instellingen volgens uw behoeften.
    2. Een exemplaar maken:

      • Maak bij het opstarten van de app een exemplaar van het CMPConsentTool klas. Deze instantie zal het toestemmingsproces afhandelen.
    3. SDK-initialisatie:
      • Zodra het exemplaar gereed is, haalt de SDK automatisch de benodigde informatie op uit de consentmanager servers ter voorbereiding op de werking ervan.
    4. Het toestemmingsscherm weergeven:

      • De SDK geeft indien nodig automatisch het toestemmingsscherm weer wanneer de CMPConsentTool exemplaar is gemaakt.
    5. Verwerking van persoonlijke gegevens:

      • Zodra de toestemmingen zijn verzameld, wordt de informatie opgeslagen en kan deze worden opgevraagd via verschillende eigenschappen en methoden die door onze SDK worden vrijgegeven. U beschikt over informatie over geweigerde of geaccepteerde toestemmingen, leveranciers, doeleinden, enz.

    Door deze stappen te volgen, zorgt u ervoor dat uw app voldoet aan de toestemmingsvereisten en dat de toestemming van gebruikers op de juiste manier wordt beheerd en opgeslagen.

Consent Manager Provider SDK-sequentiediagram

Laten we, ter illustratie van de bovenstaande stappen, in het onderstaande diagram drie mogelijke SDK-reeksstromen bekijken. 

1. Bij het maken van een instantie met behulp van de Initialize() functioneren, zijn er twee mogelijke uitkomsten. De eerste is wanneer de toestemmingsmanager-API de SDK informeert dat de CMP niet kan worden geopend, waardoor de OnCmpNotOpenedCallback. Het tweede resultaat is wanneer de toestemmingslaag wordt geopend, waardoor de gebruiker ermee kan communiceren, en dit activeert de AanOpenTerugbellen. Zodra de gebruiker toestemming geeft en de toestemming is verwerkt, wordt de OnCmpCloseCallback wordt genoemd.

Houdt u er rekening mee dat de OnErrorTerugbellen wordt weergegeven door de rode onderbroken pijllijnen om voorbeelden te geven van wanneer fouten kunnen optreden tijdens het proces.

Initialiseer-Cmp-Sequence-Diagram.png

2. Een instantie maken en de OpenConsentLayerOnCheck functies zullen tot een soortgelijk proces leiden. Het verschil is dat door het aanmaken van het exemplaar en de controle op de toestemmingsmanger-API te ontkoppelen, u de mogelijkheid krijgt om bedrijfslogica toe te voegen en te communiceren met de bibliotheken-API.

3. Een instantie maken en de OpenConsentLayer functie opent de laag zonder de consentmanager, als het nodig is. Als er al toestemming is gegeven, worden de opties en instellingen aan de gebruiker getoond. Het procesverloop ziet er als volgt uit:

openlayer-Cmp-Sequence-Diagram-.png

Voor meer informatie over ons SDK-versieoverzicht en changelog verwijzen wij u naar deze link.

    Het SDK-pakket importeren

    In slechts twee stappen hebt u alles ingesteld.

      • Download de nieuwste uitgave Van de plugin.
      • Importeer het pakket in uw Unity-project met behulp van Activa > Pakket importeren > Aangepast pakket.

    JSON configureren

    In CmpSdkConfig.json kunt u de native SDK-versie voor iOS en Android instellen die voor het bouwproces zal worden gebruikt: 

    Vind de compatibele native SDK-versies hier

    {
      "displayName": "Consentmanager SDK",
      "name": "CmpSdk",
      "androidBasePath": "net.consentmanager.sdk",
      "version": "1.0.0",
      "androidLibraryVersion": "x.xx.x",
      "iosLibraryVersion": "x.xx.x",
      "description": "Unity plugin helps you to use native Consentmanager functionality on Android and iOS."
    }
    

    Build-instellingen

    Ga naar om de build-instellingen te wijzigen Window -> CmpSdk 

    pluginwindow-unity.png

    iOS Build-instellingen

    • Schakel iOS-buildscript in: Schakel dit in of uit om het buildscript dat verantwoordelijk is voor de integratie van de iOS SDK in het Unity-project in of uit te schakelen.
    • xcFramework-pad: Geef het pad op naar de xcFramework-map. Dit pad kan direct worden bewerkt of er kan naar worden gebladerd via de bijbehorende knop.
    • Versietag opnemen: Indien ingeschakeld, wordt de iOS SDK-versie toegevoegd aan het xcFramework-pad, waardoor versiespecifieke configuraties mogelijk zijn.
    • Resulterend raamwerkpad: Geeft het volledig opgeloste pad naar het xcFramework weer, inclusief de SDK-versie als de versietag is opgenomen.
    • Transparantie van app-tracking inschakelen: Schakel dit in om de App Tracking Transparency-functie voor iOS in te schakelen, wat nodig is voor toestemming van de gebruiker onder de privacyrichtlijnen van iOS.
    • Toestemmingsbericht voor transparantie van app-tracking: Een tekstveld waarin u het aangepaste bericht kunt invoeren dat aan gebruikers wordt weergegeven wanneer toestemming voor tracking wordt gevraagd. Deze boodschap moet duidelijk en beknopt zijn en uitleggen waarom de toestemming nodig is.

    Android Build-instellingen

    • Android-buildscript inschakelen: Schakel tussen het in- of uitschakelen van het buildscript voor het integreren van de Android SDK in het Unity-project. 
    • Integreer aangepaste lay-out: Indien ingeschakeld, is het gebruik van een aangepaste lay-out voor de toestemmingslaag voor het fragment UIView mogelijk.

      Als u een aangepaste lay-out met fragmenten wilt gebruiken, zorg er dan voor dat uw Unity-project de volgende inhoud toevoegt: appcompat afhankelijkheid. Voeg een aangepaste hoofdsjabloon toe: 
      Activa/Plug-ins/Android/mainTemplate.gradle
      en voeg de afhankelijkheid toe:
      implementatie 'androidx.appcompat:appcompat:1.xx'

    2. Initialiseren van de SDK

    Volg deze stappen om de plug-in te gebruiken.

    Initialiseren van de ConsentTool - automatisch

    Binnen de app-start (meestal de reguliere override onCreate() function) , moet u een instantie van class maken CMPConsentTool. De initialize() functie haalt automatisch de benodigde gegevens op van onze server en bepaalt of het toestemmingsscherm getoond moet worden of niet. Als dit het geval is, toont de SDK op dit punt automatisch het toestemmingsscherm, verzamelt de gegevens en verstrekt deze aan de app. De instantie kan vervolgens worden gebruikt om toestemmingsgegevens van de SDK te verkrijgen, zodat deze in de app kunnen worden gebruikt.

    Voorbeeld van initialisatie, waarbij gebruik wordt gemaakt van het automatische gedrag van de Initialize() methode.  

    public string codeId = "<YOUR-CONSENTMANAGER-APP-ID>", // example: b238acdf1a
    public string domain = "<YOUR-CONSENTMANAGER-APP-DOMAIN>", // example: delivery.consentmanager.net
    public string appName = "<YOUR-CONSENTMANAGER-APP-NAME>", // example: testApp
    public string language = "<YOUR-CONSENTMANAGER-APP-LANGUAGE>" // example: DE
    
    CmpManager.Instance.Initialize(domain, codeId, appName, language);                

    Voor domain gebruik het serverdomein dat u in uw consentmanager account onder Menu > CMP's > Codes voor apps ophalen. Voor codeID Gebruik de Code-ID die u op dezelfde pagina in uw consentmanger-account vindt. De appName kan worden gebruikt om verschillende apps in de consentmanager rapportage. Voor de languagekunt u een lege tekenreeks ("") gebruiken voor automatische detectie of een taalcode van 2 letters ("EN", "DE", "FR" enzovoort).

    Initialiseren van de ConsentTool - handmatig

    De SDK biedt, omwille van de flexibiliteit, een manier om de toestemmingslaag handmatig weer te geven, zoals hieronder gedemonstreerd: 

    bool isConsentRequired = await _cmpManager.CheckConsentIsRequired();
    if (isConsentRequired)
    {
    	_cmpManager.OpenConsentLayer();
    }

    3. De SDK gebruiken

    Controleer toestemming: Controleer of de gebruiker toestemming heeft gegeven:

    bool hasConsent = CmpManager.Instance.HasConsent();

    Terugbelverzoeken: terugbellisteners instellen voor verschillende gebeurtenissen:

    CmpManager.Instance.AddEventListeners(OnOpen, OnClose, OnNotOpened, OnCmpButtonClicked, OnError);

    Doel en leverancierscontroles: Controleer op toestemming met betrekking tot specifieke doeleinden en leveranciers:

    bool hasPurpose = CmpManager.Instance.HasPurpose(id);
    bool hasVendor = CmpManager.Instance.HasVendor(id);

    Exportgegevens: CMP-gegevens exporteren:

    string cmpString = CmpManager.Instance.ExportCmpString();

    Evenement luisteraar

    Terugbelgebeurtenis Beschrijving Parameters geslaagd
    Op Open Wordt geactiveerd wanneer de CMP-toestemmingstool wordt geopend. Geen
    AanSluiten Wordt geactiveerd wanneer de CMP-toestemmingstool wordt gesloten. Geen
    AanNietGeopend Wordt geactiveerd als de CMP-toestemmingstool niet kan worden geopend. Geen
    OpCmpButtonklikte Wordt geactiveerd wanneer op een knop binnen de CMP-toestemmingstool wordt geklikt. CmpButtonEvent buttonEvent
    OnFout Wordt geactiveerd wanneer er een fout optreedt in de CMP-toestemmingstool. CmpErrorType errorType, string message
    OpGoogleToestemmingBijgewerkt Wordt geactiveerd wanneer de status van de Google-toestemmingsmodus wordt bijgewerkt. CmpGoogleConsentModeStatus status
    OnCmpATTrackingStatusGewijzigd (alleen iOS) Wordt geactiveerd wanneer de status van App Tracking Transparency verandert. ATTrackingManagerAuthorizationStatus oldStatus, ATTrackingManagerAuthorizationStatus newStatus, double lastUpdated

     

    Aangepaste lay-out

    Unity ondersteunt verschillende aangepaste lay-outs: 

            public enum ScreenConfig
            {
                FullScreen,
                HalfScreenBottom,
                HalfScreenTop,
                CenterScreen,
                SmallCenterScreen,
                LargeTopScreen,
                LargeBottomScreen,
            }

    Voorbeeld gebruik: 

                _cmpConfig = new CmpConfig(CodeId, Domain, AppName, Language)
                {
                    Debug = true,
                    Timeout = 8000
                };
    
                    _cmpConfig.UIConfig.screenConfig = (CmpUIConfig.ScreenConfig) Enum.Parse(typeof(CmpUIConfig.ScreenConfig), s);  
                    _cmpManager.SetUIConfig(_cmpConfig.UIConfig); 

    Referentiedocumentatie: Ga aan de slag met Google Firebase voor Unity

    Integratie: Eenheid instellen

    Om de Google-toestemmingsmodus te gebruiken, ondersteunt de CMP Unity SDK een interface om de Google-toestemmingsstatus in te stellen: 

    // public class CmpSampleScript : MonoBehaviour, IOnCmpGoogleConsentUpdatedCallback { ... 
    // Make sure to implement the Interface IOnCmpGoogleConsentUpdatedCallback
    public void OnGoogleConsentUpdated(CmpGoogleConsentModeStatus status)
    {
    // Convert CmpGoogleConsentModeStatus to Firebase compatible dictionary
    var firebaseConsentDict = new Dictionary<ConsentType, ConsentStatus>();
    
    foreach (var consent in status.ConsentDictionary)
    {
    // Convert GoogleConsentType to Firebase ConsentType
    var firebaseConsentType = ConvertToFirebaseConsentType(consent.Key);
    
    // Convert GoogleConsentStatus to Firebase ConsentStatus
    var firebaseConsentStatus = ConvertToFirebaseConsentStatus(consent.Value);
    
    firebaseConsentDict[firebaseConsentType] = firebaseConsentStatus;
    }
    
    // Apply the consent settings to Firebase Analytics
    FirebaseAnalytics.SetConsent(firebaseConsentDict);
    AppendLog($"Google Consent Mode: {firebaseConsentDict}");
    }
    
    private static ConsentType ConvertToFirebaseConsentType(GoogleConsentType googleConsentType)
    {
    return googleConsentType switch
    {
    GoogleConsentType.AnalyticsStorage => ConsentType.AnalyticsStorage,
    GoogleConsentType.AdStorage => ConsentType.AdStorage,
    GoogleConsentType.AdUserData => ConsentType.AdUserData,
    GoogleConsentType.AdPersonalization => ConsentType.AdPersonalization,
    _ => throw new InvalidEnumArgumentException($"Unknown GoogleConsentType: {googleConsentType}")
    };
    }
    
    private static ConsentStatus ConvertToFirebaseConsentStatus(GoogleConsentStatus googleConsentStatus)
    {
    return googleConsentStatus switch
    {
    GoogleConsentStatus.Granted => ConsentStatus.Granted,
    GoogleConsentStatus.Denied => ConsentStatus.Denied,
    _ => throw new InvalidEnumArgumentException($"Unknown GoogleConsentStatus: {googleConsentStatus}")
    };
    }

    in dit voorbeeld wordt de callback OnGoogleConsentUpdate aangeroepen wanneer de gebruiker toestemming geeft. 

    FirebaseAnalytics.SetConsent(firebaseConsentDict);

    Op deze regel is de toestemmingsstatus ingesteld op Firebase Analytics. De andere twee functies zijn het toewijzen van de CMP-toestemmingsstatus aan de Google-toestemmingstypen en -status.

    Voorbeeldscript

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Threading;
      using CmpSdk.Callbacks;
      #if UNITY_IOS
      using CmpSdk.Delegates;
      #endif
      using CmpSdk.Models;
      using Firebase.Analytics;
      using Firebase.Extensions;
      using UnityEngine;
      using FirebaseApp = Firebase.FirebaseApp;
      
      namespace CmpSdk.Samples.Scripts
      {
          // V prefix for Vendor
          public static class Vendors
          {
              public const string GoogleAnalytics = "S26";
              public const string AmazonAD = "793";
              public const string Facebook = "S7";
              public const string S1 = "S1";
          }
      
          // P prefix for Purpose
          public static class Purposes
          {
              public const string P1 = "1";
              public const string Marketing = "C2";
              public const string Technical = "S2";
              public const string Security = "S1";
          }
      
      
          public class CmpSampleScript : MonoBehaviour, IOnOpenCallback, IOnCloseCallback, IOnCmpNotOpenedCallback,
              IOnCmpButtonClickedCallback, IOnErrorCallback, IOnCmpGoogleConsentUpdatedCallback
          {
              readonly List<string> _purposeList = new() { Purposes.P1, Purposes.Marketing, Purposes.Technical, Purposes.Security };
      
              readonly List<string> _vendorList = new() { Vendors.S1, Vendors.GoogleAnalytics, Vendors.AmazonAD, Vendors.Facebook };
      
              // UI elements
              private string _idPurposeOrVendorInputField;
              private string _importStringInputField;
              [SerializeField] private CmpUIManager uiManager;
      
              // CmpManager Instance
              private CmpConfig _cmpConfig;
              private CmpManager _cmpManager;
              private Thread _mainThread;
      
              // Configuration constants
              private const string CodeId = "TOOD Your CMP Code ID";
              private const string Domain = "delivery.consentmanager.net";
              private const string AppName = "UnityExample";
              private const string Language = "DE";
              private FirebaseApp _app; 
              
              private void Awake()
              {
                  if (!Application.isPlaying)
                  {
                      Debug.Log("Application is not playing.");
                      return;
                  }
                  
                  FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => {
                      var dependencyStatus = task.Result;
                      if (dependencyStatus == Firebase.DependencyStatus.Available) {
                          // Create and hold a reference to your FirebaseApp,
                          // where app is a Firebase.FirebaseApp property of your application class.
                          _app = FirebaseApp.DefaultInstance;
      
                          // Set a flag here to indicate whether Firebase is ready to use by your app.
                      } else {
                          Debug.LogError($"Could not resolve all Firebase dependencies: {dependencyStatus}");
                          // Firebase Unity SDK is not safe to use here.
                      }
                  });
                  _cmpManager = CmpManager.Instance;
              }
              
              private void Start()
              {
                  _cmpConfig = new CmpConfig(CodeId, Domain, AppName, Language)
                  {
                      Debug = true,
                      Timeout = 8000
                  };
      #if UNITY_ANDROID
                  _cmpConfig.UIConfig.isOutsideTouchable = true;
                  _cmpConfig.UIConfig.SetAndroidUiType(AndroidUiType.Dialog);
      #endif
                  // Initialize Consent Manager
                  InitializeCmpManager();
                  // Initialize UI buttons
                  InitializeUIButtons();
      
                  // Launch Consent Manager
                  _cmpManager.Launch();
              }
      
              private void InitializeUIButtons()
              {
                  uiManager.CreateButtons(
                      new ButtonData("Open", OnClickOpenConsentLayer),
                      new ButtonData("Check", OnClickOpenConsentLayerOnCheck),
                      new ButtonData("Check?", OnclickCheckConsentRequired),
                      new ButtonData("ATT?", OnClickRequestATTrackingStatus),
                      new ButtonData("Get Status", OnClickDebugConsentStatus),
                      new ButtonData("Initialize", OnClickInitialize),
                      new ButtonData("Accept All", OnClickAcceptAll),
                      new ButtonData("Reject All", OnClickRejectAll),
                      new ButtonData("Reset", OnClickResetConsentData),
                      new ButtonData("Import", OnClickImportCmpString),
                      new ButtonData("Export", OnClickExportCmpString)
                  );
                  uiManager.CreateDropdown("Screen Config", GetScreenConfigOptions(), s =>
                  {
                      AppendLog($"Set Screen ${s}");
                      _cmpConfig.UIConfig.screenConfig = (CmpUIConfig.ScreenConfig) Enum.Parse(typeof(CmpUIConfig.ScreenConfig), s);  
                      _cmpManager.SetUIConfig(_cmpConfig.UIConfig); 
                  });
                  uiManager.CreateDropdown("Purposes", _purposeList, s =>
                  {
                      _idPurposeOrVendorInputField = s;
                      CheckHasPurpose(s);
                  });
                  uiManager.CreateDropdown("Vendors", _vendorList, s =>
                  {
                      _idPurposeOrVendorInputField = s; 
                      CheckHasVendor(s);
                  }); 
              }
      
              private void InitializeCmpManager()
              {
                  _mainThread = Thread.CurrentThread;
                  AppendLog("Consentmanager SampleScene started");
      
      #if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
              _cmpManager.Initialize(_cmpConfig);
              _cmpManager.AddGoogleConsentModeListener(OnGoogleConsentUpdated);
              _cmpManager.AddEventListeners(OnOpen, OnClose, OnNotOpened, OnCmpButtonClicked, OnError);
      #endif
      
      #if UNITY_IOS
              CmpATTrackingManager.EnableAutomaticATTracking();
              CmpATTrackingManager.Instance.RegisterOnATTrackingStatusChangedListener(OnCmpATTrackingStatusChanged);
      #endif
              }
              
              #region Button Events
      
              private void OnClickInitialize()
              {
                  AppendLog("Initialize");
                  _cmpManager.Launch();
              }
      
              private async void OnClickRejectAll()
              {
                  AppendLog("Calling Reject All"); 
                  await _cmpManager.RejectAll();
                  AppendLog("Rejected All");
              }
      
              private async void OnClickAcceptAll()
              {
                  AppendLog("Calling Accept All");
                  await _cmpManager.AcceptAll();
                  AppendLog("Accepted All");
              }
      
              private void OnClickRequestATTrackingStatus()
              {
                  AppendLog("Request AT Tracking Status");
                  _ = _cmpManager.RequestATTrackingPermission();
              }
      
              private async void OnclickCheckConsentRequired()
              {
                  AppendLog("Calling Check Consent Required");
                  var isRequired = await _cmpManager.CheckConsentIsRequired();
                  AppendLog($"Is consent required: {isRequired}");
              }
      
              private void OnClickOpenConsentLayer()
              {
                  AppendLog("Open Consent Layer");
                  _cmpManager.OpenConsentLayer();
              }
      
              private void OnClickOpenConsentLayerOnCheck()
              {
                  AppendLog("Open Consent Layer on Check");
                  _cmpManager.OpenConsentLayerOnCheck();
              }
      
              private void OnClickImportCmpString()
              {
                  AppendLog("Click Import");
                  ImportCmpString();
              }
      
              private void OnClickResetConsentData()
              {
                  _cmpManager.Reset();
                  AppendLog("Reset");
              }
      
              private void OnClickDebugConsentStatus()
              {
                  DebugConsentStatus();
              }
      
              private void OnClickExportCmpString()
              {
                  var cmpString = _cmpManager.ExportCmpString();
                  AppendLog($"Exported CMP String: {cmpString}");
              }
      
              private void CheckHasPurpose(string purposeId)
              {
                  var hasPurpose = _cmpManager.HasPurpose(purposeId);
                  AppendLog($"Has Purpose ({purposeId}): {hasPurpose}");
              }
      
              private void CheckHasVendor(string vendorId)
              {
                  var hasVendor = _cmpManager.HasVendor(vendorId);
                  AppendLog($"Has Vendor ({vendorId}): {hasVendor}");
              }
      
              private async void ImportCmpString()
              {
                  var cmpString = _importStringInputField;
                  CmpImportResult result;
      
                  if (!string.IsNullOrEmpty(cmpString))
                  {
                      AppendLog($"Importing CMP String from input field: {cmpString}");
                      result = await _cmpManager.ImportCmpString(cmpString);
                  }
                  else
                  {
                      AppendLog($"Importing CMP String from sample string: {cmpString}");
                      result = await _cmpManager.ImportCmpString(cmpString);
                  }
      
                  AppendLog($"Unity import result: {result.IsSuccess} with message: {result.Message}");
              }
      
              #endregion
      
              #region Callbacks
      
              public void OnGoogleConsentUpdated(CmpGoogleConsentModeStatus status)
              {
                  // Convert CmpGoogleConsentModeStatus to Firebase compatible dictionary
                  var firebaseConsentDict = new Dictionary<ConsentType, ConsentStatus>();
      
                  foreach (var consent in status.ConsentDictionary)
                  {
                      // Convert GoogleConsentType to Firebase ConsentType
                      var firebaseConsentType = ConvertToFirebaseConsentType(consent.Key);
      
                      // Convert GoogleConsentStatus to Firebase ConsentStatus
                      var firebaseConsentStatus = ConvertToFirebaseConsentStatus(consent.Value);
      
                      firebaseConsentDict[firebaseConsentType] = firebaseConsentStatus;
                  }
                  
                  // Apply the consent settings to Firebase Analytics
                  FirebaseAnalytics.SetConsent(firebaseConsentDict);
                  AppendLog($"Google Consent Mode: {firebaseConsentDict}");
              }
      
              private static ConsentType ConvertToFirebaseConsentType(GoogleConsentType googleConsentType)
              {
                  return googleConsentType switch
                  {
                      GoogleConsentType.AnalyticsStorage => ConsentType.AnalyticsStorage,
                      GoogleConsentType.AdStorage => ConsentType.AdStorage,
                      GoogleConsentType.AdUserData => ConsentType.AdUserData,
                      GoogleConsentType.AdPersonalization => ConsentType.AdPersonalization,
                      _ => throw new InvalidEnumArgumentException($"Unknown GoogleConsentType: {googleConsentType}")
                  };
              }
      
              private static ConsentStatus ConvertToFirebaseConsentStatus(GoogleConsentStatus googleConsentStatus)
              {
                  return googleConsentStatus switch
                  {
                      GoogleConsentStatus.Granted => ConsentStatus.Granted,
                      GoogleConsentStatus.Denied => ConsentStatus.Denied,
                      _ => throw new InvalidEnumArgumentException($"Unknown GoogleConsentStatus: {googleConsentStatus}")
                  };
              }
      
              public void OnClose()
              {
                  LogThreadContext("OnClose");
                  AppendLog("CMPConsentTool closed");
              }
      
              public void OnCmpButtonClicked(CmpButtonEvent buttonEvent)
              {
                  LogThreadContext("OnCmpButtonClicked");
                  AppendLog($"CMPButton clicked. Event: {buttonEvent}");
              }
      
              public void OnNotOpened()
              {
                  LogThreadContext("OnNotOpened");
                  AppendLog("CMPConsentTool not opened");
              }
      
              public void OnError(CmpErrorType errorType, string message)
              {
                  LogThreadContext("OnError");
                  AppendLog($"Error: {errorType}, {message}");
              }
      
              public void OnOpen()
              {
                  LogThreadContext("OnOpen");
                  AppendLog("CMPConsentTool opened");
              }
      #if UNITY_IOS 
              private void OnCmpATTrackingStatusChanged(ATTrackingManagerAuthorizationStatus oldStatus,
                  ATTrackingManagerAuthorizationStatus newStatus, double lastUpdated)
              {
                  var unixTime = lastUpdated;
                  var dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
                  dtDateTime = dtDateTime.AddSeconds(unixTime).ToLocalTime();
                  AppendLog("OnCmpATTrackingStatusChanged: " + newStatus + " lastUpdated: " + dtDateTime);
              }
      #endif
              
              #endregion
      
              private void DebugConsentStatus()
              {
                  var hasConsent = _cmpManager.HasConsent();
                  var allPurposes = _cmpManager.GetAllPurposes();
                  var disabledPurposes = _cmpManager.GetAllPurposes();
                  var enabledPurposes = _cmpManager.GetEnabledPurposes();
                  var allVendors = _cmpManager.GetAllVendors();
                  var disabledVendors = _cmpManager.GetDisabledVendors();
                  var enabledVendors = _cmpManager.GetEnabledVendors();
                  var exportCmp = _cmpManager.ExportCmpString();
                  
                  AppendLog("-----------------");
                  AppendLog($"Unity All Purposes: {string.Join(", ", allPurposes)}");
                  AppendLog($"Unity Disabled Purposes: {string.Join(", ", disabledPurposes)}");
                  AppendLog($"Unity Enabled Purposes: {string.Join(", ", enabledPurposes)}");
                  AppendLog($"Unity All Vendors: {string.Join(", ", allVendors)}");
                  AppendLog($"Unity Disabled Vendors: {string.Join(", ", disabledVendors)}");
                  AppendLog($"Unity Enabled Vendors: {string.Join(", ", enabledVendors)}");
                  AppendLog($"Unity Exported CMP String: {exportCmp}");
                  AppendLog($"Unity Has Consent: {hasConsent}");
                  AppendLog($"Unity US Privacy String: {_cmpManager.GetUsPrivacyString()}");
                  AppendLog($"Unity Google Ac String: {_cmpManager.GetGoogleAcString()}");
                  AppendLog($"Unity Has Purpose C1: {_cmpManager.HasPurpose("c1")}");
                  AppendLog($"Unity Has Vendor 10: {_cmpManager.HasVendor("628")}");
                  AppendLog($"Unity Google Consent Mode Status: {_cmpManager.GetGoogleConsentModeStatus()}");
                  AppendLog("-----------------");
              }
      
              #region Helper
      
              private void LogThreadContext(string callbackName)
              {
                  var onMainThread = IsMainThread();
                  var threadId = Thread.CurrentThread.ManagedThreadId;
                  AppendLog($"{callbackName} called. Is main thread: {onMainThread} ID: {threadId}");
              }
      
              private bool IsMainThread()
              {
                  return _mainThread.Equals(Thread.CurrentThread);
              }
      
              private void AppendLog(string message)
              {
                  Debug.Log(message); 
      
                  if (uiManager != null)
                  {
                      uiManager.AddLogText(message);
                  }
              }
                      
              private List<string> GetScreenConfigOptions()
              {
                  var options = new List<string>();
                  foreach (var config in Enum.GetValues(typeof(CmpUIConfig.ScreenConfig)))
                  {
                      options.Add(config.ToString());
                  }
      
                  return options;
              }
      
              #endregion
          }
      }

       

      Terug naar boven