Info
Contenu

[Unité] 1. consentmanager Intégration SDK

[Unité] 1. consentmanager Intégration SDK

Sur ce document, vous trouverez des informations générales sur la façon d'intégrer notre SDK à votre projet. Pour plus de détails, veuillez vous référer à notre Référence de l'API Documentation.

1. Installation

Votre consentmanager Le SDK pour les applications Android implémente et fournit des fonctionnalités pour informer l'utilisateur sur la protection des données et demander et recueillir le consentement de l'utilisateur. Il permet aux développeurs d'applications d'intégrer facilement le consentmanager service dans leur application. Comme fonctionnalités principales, nous fournissons :

  • Prend en charge les plates-formes iOS et Android.
  • Un pont entre Unity et les fonctionnalités CMP natives spécifiques à la plateforme.
  • Un moyen simple d'initialiser, de gérer le consentement des utilisateurs et de gérer les données liées à la confidentialité.

En termes de compatibilité, nous avons :

  • Unity 20XX.XX ou version ultérieure
  • iOS (via DllImport)
  • Android (via JNI)

Étapes – Niveau élevé

    1. Intégration et configuration:

      • Intégrez le SDK dans votre application.
      • Configurez les paramètres du SDK en fonction de vos besoins.
    2. Création d'une instance:

      • Au démarrage de l'application, créez une instance du CMPConsentTool classe. Cette instance gérera le processus de consentement.
    3. Initialisation du SDK:
      • Une fois l'instance prête, le SDK récupère automatiquement les informations nécessaires du consentmanager serveurs pour préparer son fonctionnement.
    4. Affichage de l'écran de consentement:

      • Le SDK affichera automatiquement l'écran de consentement si nécessaire lorsque le CMPConsentTool l'instance est créée.
    5. Traitement des données personnelles:

      • Une fois les consentements collectés, les informations sont stockées et sont disponibles pour interrogation via différentes propriétés et méthodes exposées par notre SDK. Vous aurez des informations sur les consentements rejetés ou acceptés, les fournisseurs, les objectifs, etc.

    En suivant ces étapes, vous vous assurez que votre application est conforme aux exigences de consentement et que le consentement de l'utilisateur est correctement géré et stocké.

Consent Manager Diagramme de séquence du SDK du fournisseur

Pour illustrer les étapes ci-dessus, vérifions dans le diagramme ci-dessous trois flux de séquence SDK possibles. 

1. Lors de la création d'une instance à l'aide de Initialize() fonction, il y a deux résultats possibles. La première est lorsque l'API Consentmanger informe le SDK que la CMP ne s'ouvrira pas, ce qui déclenche le OnCmpNotOpenedCallbackOnCmpNotOpenedCallback. Le deuxième résultat est lorsque la couche de consentement s'ouvre, permettant à l'utilisateur d'interagir avec elle, et cela déclenche le SurOpenCallback. Une fois que l'utilisateur a donné son consentement et que celui-ci a été traité, le OnCmpCloseCallbackOnCmpCloseCallback est appelé.

S'il vous plaît noter que le SurErreurRappel est représenté par les flèches rouges en pointillés pour fournir des exemples d'erreurs pouvant survenir au cours du processus.

Initialiser-Cmp-Sequence-Diagram.png

2. Créer une instance et appeler le OpenConsentLayerOnCheck les fonctions conduiront à un processus similaire. La différence est qu'en dissociant la création de l'instance et la vérification de l'API consentementmanger, vous obtenez la possibilité d'ajouter une logique métier et d'interagir avec l'API des bibliothèques.

3. Créer une instance et appeler le OpenConsentLayer fonction ouvrira le calque sans vérifier le consentmanager, si c'est nécessaire. Si le consentement a déjà été donné, les options et les paramètres seront affichés à l'utilisateur. Le flux de processus ressemblera à ceci :

openlayer-Cmp-Sequence-Diagram-.png

Pour plus d'informations sur la présentation de la version du SDK et le journal des modifications, veuillez vous référer à ce lien.

    Importer le package SDK

    En seulement deux étapes, vous pouvez tout configurer.

    Configurer JSON

    Dans CmpSdkConfig.json, vous pouvez définir la version native du SDK pour iOS et Android qui sera utilisée pour le processus de construction : 

    Trouver les versions natives du SDK compatibles ici

    {
      "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."
    }
    

    Paramètres de construction

    Pour modifier les paramètres de construction, accédez à Window -> CmpSdk 

    pluginwindow-unity.png

    Paramètres de construction iOS

    • Activer le script de build iOS : Activez cette option pour activer ou désactiver le script de build responsable de l'intégration du SDK iOS dans le projet Unity.
    • Chemin xcFramework : Spécifiez le chemin d'accès au répertoire xcFramework. Ce chemin peut être modifié directement ou parcouru à l'aide du bouton associé.
    • Inclure la balise de version : Lorsqu'il est activé, ajoute la version du SDK iOS au chemin xcFramework, permettant des configurations spécifiques à la version.
    • Chemin du framework résultant : Affiche le chemin entièrement résolu vers xcFramework, y compris la version du SDK si la balise de version est incluse.
    • Activer la transparence du suivi des applications : Activez cette option pour activer la fonctionnalité de transparence du suivi des applications pour iOS, qui est nécessaire au consentement de l'utilisateur conformément aux directives de confidentialité d'iOS.
    • Message de consentement pour la transparence du suivi des applications : Un champ de texte pour saisir le message personnalisé affiché aux utilisateurs lors de la demande de consentement pour le suivi. Ce message doit être clair et concis, expliquant pourquoi le consentement est nécessaire.

    Paramètres de construction Android

    • Activer le script de build Android : Basculez pour activer ou désactiver le script de build pour intégrer le SDK Android dans le projet Unity. 
    • Intégrer une mise en page personnalisée : Lorsqu'elle est activée, cela permet l'utilisation d'une mise en page personnalisée pour la couche de consentement pour le fragment UIView.

      Si vous souhaitez utiliser une mise en page personnalisée avec des fragments, assurez-vous que votre projet Unity ajoute le appcompat dépendance. Ajouter un modèle principal personnalisé : 
      Actifs/Plugins/Android/mainTemplate.gradle
      et ajoutez la dépendance :
      implémentation 'androidx.appcompat:appcompat:1.xx'

    2. Initialisation du SDK

    Suivez ces étapes pour commencer à utiliser le plugin.

    Initialisation du ConsentTool - automatiquement

    Dans le démarrage de l'application (généralement le override onCreate() fonction), vous devez créer une instance de classe CMPConsentTool. le initialize() La fonction récupérera automatiquement les données nécessaires de notre serveur et déterminera si l'écran de consentement doit être affiché ou non. Si tel est le cas, le SDK affichera automatiquement l'écran de consentement à ce stade, collectera les données et fournira les données à l'application. L'instance peut ensuite être utilisée pour obtenir les détails de consentement du SDK afin de l'utiliser dans l'application.

    Exemple d'initialisation, utilisant le comportement automatique du Initialize() méthode.  

    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);                

    Pour domain utilisez le domaine serveur trouvé dans votre consentmanager compte sous Menu > CMP > Obtenir des codes pour les applications. For codeID utilisez le code-ID trouvé sur la même page dans votre compte consentmanger. appName peut être utilisé pour distinguer différentes applications dans le consentmanager rapport. Pour le language, vous pouvez soit utiliser une chaîne vide ("") pour la détection automatique, soit un code de langue à 2 lettres ("EN", "DE", "FR" et ainsi de suite).

    Initialisation du ConsentTool - manuellement

    Le SDK offre, par souci de flexibilité, un moyen d'afficher manuellement la couche de consentement, comme illustré ci-dessous : 

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

    3. Utilisation du SDK

    Vérifier le consentement: Vérifiez si l'utilisateur a donné son consentement :

    bool hasConsent = CmpManager.Instance.HasConsent();

    Rappels : Définissez des écouteurs de rappel pour divers événements :

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

    Objectif et contrôles des fournisseurs : Vérifiez le consentement lié à des fins et à des fournisseurs spécifiques :

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

    Exporter des données: Exporter les données CMP :

    string cmpString = CmpManager.Instance.ExportCmpString();

    Écouteur d'événement

    Événement de rappel Description Paramètres passés
    ActivéOuvert Déclenché à l'ouverture de l'outil de consentement CMP. Aucune
    Surclose Déclenché lorsque l'outil de consentement CMP est fermé. Aucune
    SurNonOuvert Déclenché si l'outil de consentement CMP ne parvient pas à s'ouvrir. Aucune
    OnCmpButtonClicked Déclenché lorsqu'un bouton de l'outil de consentement CMP est cliqué. CmpButtonEvent buttonEvent
    OnError Déclenché lorsqu'une erreur se produit dans l'outil de consentement CMP. CmpErrorType errorType, string message
    SurGoogleConsentMise à jour Déclenché lorsque le statut du mode de consentement de Google est mis à jour. CmpGoogleConsentModeStatus status
    OnCmpATTrackingStatusChanged (iOS uniquement) Déclenché lorsque l’état de transparence du suivi des applications change. ATTrackingManagerAuthorizationStatus oldStatus, ATTrackingManagerAuthorizationStatus newStatus, double lastUpdated

     

    Disposition personnalisée

    Unity prend en charge différentes mises en page personnalisées : 

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

    Exemple d'utilisation: 

                _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); 

    Documentation de référence : Premiers pas avec Google Firebase pour Unity

    L'intégration : Configuration de l'unité

    Pour utiliser le mode de consentement Google, le SDK CMP Unity prend en charge une interface permettant de définir le statut de consentement Google : 

    // 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}")
    };
    }

    dans cet exemple, le rappel OnGoogleConsentUpdate est appelé lorsque l'utilisateur donne son consentement. 

    FirebaseAnalytics.SetConsent(firebaseConsentDict);

    Dans cette ligne, le statut de consentement est défini sur Firebase Analytics. Les deux autres fonctions mappent le statut de consentement CMP aux types et statuts de consentement de Google.

    Exemple de script

      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
          }
      }

       

      Retour en haut de la page