Info
Contenu

[Androïde] 1. consentmanager Intégration SDK

La 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.

Comment ça marche

  1. Intégrez le SDK dans l'application et configurez les paramètres du SDK
  2. Une fois le SDK intégré dans une application, le SDK fournira des fonctions au développeur de l'application afin de récupérer les données de consentement
  3. Dès que l'application démarre, le SDK récupère automatiquement les informations du consentmanager serveurs afin de préparer le SDK à son utilisation.
  4. Il est recommandé qu'au démarrage de l'application, l'application crée une instance de classe CMPConsentTool. Une fois le fichier créé, le SDK affichera automatiquement l'écran de consentement si nécessaire.
  5. Lorsque l'application souhaite traiter des données personnelles, elle doit «demander» au SDK si le consentement a été donné pour l'objectif et le fournisseur spécifiques.

Installation

Depuis la version 1.7.0, le référentiel SDK a été déplacé vers le référentiel officiel Maven. Le guide de migration peut être trouvé ici

Trouver les versions natives du SDK compatibles ici.

gradle

Ajoutez la dépendance à vos applications build.gradle. (Pour toujours obtenir la dernière version, utilisez le symbole + pour obtenir les mises à jour les plus récentes. Vous pouvez par exemple toujours obtenir les versions les plus récentes pour les mises à jour mineures via 1.x.+)

dependencies {
  implementation 'net.consentmanager.sdk:android:x.xx.x'
}

Maven

Ajoutez la dépendance à vos applications build.gradle. (Pour toujours obtenir la dernière version de maven, vous pouvez utiliser différentes méthodes pour refuser la plage de versions. Vous pouvez les rechercher ici )

<dependency>
    <groupId>net.consentmanager.sdk</groupId>
    <artifactId>android</artifactId>
    <version>x.xx.x</version>
</dependency>

Utilisation de la bibliothèque

Permissions

Ce SDK nécessite les autorisations suivantes, veuillez vous assurer de les ajouter à votre AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

Lancer l'outil ConsentTool

Avec l'app-start (généralement votre fonction viewDidAppear), vous devez créer une instance de la classe CMPConsentTool. Cela 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 du consentement du SDK afin de l'utiliser dans l'application.

Pour lancer le ConsentTool, accédez à votre classe ciblée et créez une instance de CMPConsentTool comme indiqué ci-dessous:

class CmpDemoActivity : FragmentActivity() {

    private lateinit var cmpManager: CmpManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val config = CmpConfig.apply {
            id ="yourid"
            domain = ConsentActivity.CMP_DOMAIN
            appName = ConsentActivity.CMP_APP_NAME
            language = ConsentActivity.LANG
        }
        cmpManager = CmpManager.createInstance(this, config)
        cmpManager.initialize(this)
    }
// Java example instantiation: 

    CmpManager cmpManager = null;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CmpConfig cmpConfig = CmpConfig.INSTANCE;
        cmpConfig.setId("YourId");
        cmpConfig.setDomain("delivery.consentmanager.net");
        cmpConfig.setAppName("YourAppName");
        cmpConfig.setLanguage("EN");
        cmpConfig.setTimeout(4000);
        cmpManager = CmpManager.createInstance(this, cmpConfig);
      
    }

// ... open layer and asking for purpose:

        cmpManager.openConsentLayer(getApplication());
        if (cmpManager.hasPurposeConsent("PURPOSE_ID")) {
            Log.d(TAG, "has purpose");
        }

Afin de créer l'instance de CMPConsentTool, vous devez configurer l'instance. Vous devrez fournir le CODE-ID, le domaine du serveur, un nom d'application et une langue. Le CODE-ID et le domaine du serveur se trouvent dans votre consentmanager compte sous Menu> Obtenir le code. Le nom de l'application peut être utilisé pour distinguer différentes applications dans le consentmanager rapports. Pour la langue, vous pouvez utiliser une chaîne vide ("") pour la détection automatique ou un code de langue à 2 lettres ("EN", "DE", "FR" et ainsi de suite).

Les valeurs de configuration peuvent être insérées de différentes manières:

a) Configuration du SDK via CmpConfig

Ajoutez les lignes suivantes à votre code:

val config = CmpConfig.apply { 
            serverDomain = CMP_DOMAIN
            appName = CMP_APP_NAME
            language = LANG
            id = CODE_ID
        }
cmpManager = CmpManager.createInstance(this, config)
b) Configuration du SDK via createInstance()

Ajoutez la ligne suivante à votre code:

        cmpManager =
            CmpManager.createInstance(
                this,
                config.id,
                config.domain,
                config.appName,
                config.language
            )

Initialisation et ouverture de la couche de consentement

Pour vérifier si l'utilisateur doit donner son consentement et ouvrir la couche de consentement, il existe différentes options. 

Par Initialiser l'appel

La initialize La fonction est conçue pour configurer le SDK CMP dans le contexte de votre application et vérifier et ouvrir automatiquement la couche de consentement si nécessaire. Le initialize peut être chaîné à la création de l'instance

cmpManager = CmpManager.createInstance(this, config).initialize(this)
Par appel CheckAndOpen

Semblable au initialize fonction, CheckAndOpenLayer ouvrira la couche de consentement si nécessaire. 

 cmpManager.checkAndOpenConsentLayer(this)
Manuellement

La check La fonction propose une approche manuelle pour déterminer si le consentement de l’utilisateur est requis. Il permet un mécanisme de rappel et un mécanisme de cache facultatif pour réduire les requêtes réseau.

        cmpManager.check({ isConsentRequired ->
            if (isConsentRequired) {
                // Consent is required, handle accordingly
                runOnUiThread {
                    // Update UI or show consent dialog
                    cmpManager.openLayer()
                }
            } else {
                // Consent is not required, proceed with application logic
            }
        }, isCached = true)

Création d'une mise en page personnalisée

Pour créer une mise en page personnalisée, vous pouvez utiliser le CmpUIConfig classe avec différentes options de style. Cette classe propose également des mises en page prédéfinies comme 

  • configurerHalfScreenBottom
  • configurerHalfScreenTop
  • configurerCenterScreen
  • configurerSmallCenterScreen
  • configurerLargeTopScreen
  • configurerLargeBottomScreen

Pour créer une mise en page personnalisée, le SDK CMP propose également différentes stratégies :

  • Fenêtre de dialogue
  • Fenêtre Popup
  • Fragment

Vous pouvez modifier la stratégie en définissant le paramètre UIConfig : 

CmpUIConfig.uiStrategy = CmpUIStrategy.DIALOG
CmpUIConfig.uiStrategy = CmpUIStrategy.POPUP
CmpUIConfig.uiStrategy = CmpUIStrategy.ACTIVITY
CmpUIConfig.uiStrategy = CmpUIStrategy.FRAGMENT

Nous recommandons d'utiliser une fenêtre contextuelle qui est également définie par défaut depuis la version 2.3.0

Deux paramètres importants détermineront le Apparaitre et Dialogue comportement: 

Comportement des popups
Paramètre isFocusable = vrai isFocusable = faux
isOutsideTouchable = vrai Rejette sur contact extérieur. Peut obtenir le focus pour les événements d’entrée. Rejette sur contact extérieur. N'obtient pas le focus et n'intercepte pas la saisie au clavier.
isOutsideTouchable = faux Ne rejette pas sur contact extérieur. Peut obtenir le focus et intercepter les événements d’entrée. Ne rejette pas sur contact extérieur. N'obtient pas le focus et n'intercepte pas la saisie au clavier.

 

 

 

Comportement du dialogue
Paramètre isFocusable = vrai isFocusable = faux
isOutsideTouchable = vrai Rejette sur contact extérieur (setCanceledOnTouchOutside(true)). La boîte de dialogue est focalisable par défaut. La boîte de dialogue ne se ferme pas lors d'un contact extérieur et peut ne pas se comporter comme prévu car les boîtes de dialogue peuvent généralement être focalisées.
isOutsideTouchable = faux Ne rejette pas sur contact extérieur (setCanceledOnTouchOutside(false)). La boîte de dialogue reste focalisable et peut intercepter les événements d'entrée. La boîte de dialogue ne se ferme pas lors d'un contact extérieur et peut ne pas se comporter comme prévu en raison du manque de focalisation.
Exemple de fragment :
R.id.cmpContainer est un Framelayout qui pourrait ressembler à ceci dans le XML de présentation d'activité dans layout/{your_activity}.xml

<FrameLayout
    android:id="@+id/cmpContainer"
    android:layout_width="match_parent"
    android:layout_height="400dp"
    android:translationZ="90dp"
    app:layout_constraintTop_toTopOf="parent" />

Pour implémenter la fonctionnalité selon laquelle certains domaines sont sur liste blanche et, lorsqu'ils sont accessibles dans la WebView de la plate-forme de consentement (CMP), ne sont pas ouverts dans un navigateur externe comme Chrome mais dans la WebView elle-même, vous pouvez implémenter un mécanisme de rappel pour effectuer des actions personnalisées basées sur le domaine, comme l'ouverture d'une activité Android.

// apply the domains to be whitelisted
CmpConfig.apply {
            id = cmpId
            domain = cmpDomain
            appName = cmpAppName
            language = cmpLanguage
            domainWhitelist = cmpDomainWhitelist
        }


// implement the callback: CmpOnClickLinkCallback
    override fun onClickLink(url: String): Boolean {
        Log.d("CMP", url)
        // Business logic
        return true // return handleWebViewInteraction boolean
    }

Utilisation du SDK

Afin de vérifier si un fournisseur ou un objectif a son consentement, vous pouvez utiliser les deux méthodes:

cmpManager?.hasPurposeConsent(purposeTextState.value)
cmpManager?.hasVendorConsent(vendorTextState.value)                             

Les deux méthodes hasPurposeConsent et hasVendorConsent nécessitent deux paramètres:

  • id - Chaîne du fournisseur ou de l'ID de fonction. Veuillez noter que les identifiants de fournisseur peuvent avoir différents formats ("123", "s123" et "c123"), veuillez vérifier avec Menu> Fournisseurs et Menu> Objectifs dans votre consentmanager compte.
  • isIABVendor / isIABPurpose - Si le fournisseur ou l'objet est un fournisseur / objectif qui suit la norme IAB TCF, vous devrez définir un vrai, sinon un faux.

N'oubliez pas: tous les fournisseurs qui n'appartiennent pas à l'IAB ont des ID commençant par un "s" ou "c" (par exemple, "s123"); les fournisseurs qui appartiennent à l'IAB ont des ID ne commençant pas par un «s» ou «c».

Réouverture de l'écran de consentement

Afin de permettre à l'utilisateur de modifier les choix, vous pouvez simplement appeler openCmpConsentToolView():

cmpManager?.openConsentLayer(context)

Dans certains cas, une application native peut contenir des vues Web afin d'afficher certaines choses comme du contenu publicitaire ou publicitaire. Afin de transmettre les informations de consentement du SDK à la vue Web, veuillez utiliser la fonction:

String consentData = cmpConsentTool?.exportCmpString();

Cela exportera les informations de consentement et toutes les autres données nécessaires au CMP. Vous pouvez ensuite transmettre ces informations au CMP qui se trouve dans votre vue Web en l'ajoutant à l'URL appelée dans la vue Web:

myWebView.loadURL("https://mywebsite.com/....#cmpimport=" + consentData);

Écouteurs d'événements personnalisés

Pour ajouter une logique de processus supplémentaire, vous pouvez utiliser des écouteurs d'événement. Les écouteurs d'événement suivants sont disponibles :

Nom

Se produit

 

SurOpenCallback

Écouteur d'événement à l'ouverture du CMP

OncmpcloseCallback

Écouteur d'événement lorsque CMP est fermé

SurCMPNotOpenedCallback

Écouteur d'événement lorsque CMP n'a pas besoin d'être ouvert

SurErreurRappel

Écouteur d'événement lorsqu'il y a une erreur dans le processus de gestion des consentements.

OnButtonClickedCallback

Écouteur pour ButtonEvent

Autorisation d'importation/exportation

Pour importer ou exporter le consentement, vous pouvez utiliser la fonction exportCMPData(Contexte contextuel) et importCMPData (contexte contextuel, chaîne cmpData). Vérifiez l'exemple ci-dessous : 

La chaîne de consentement que vous devez transmettre doit être encodée en base64.

 

Diagramme de séquence du SDK CMP

CMP-séquence-diagramme- (1) .png


Journal

Lorsque vous utilisez notre SDK Android, vous devrez peut-être déboguer ou analyser les informations du journal à diverses fins. Les journaux générés par notre SDK sont étiquetés avec « CMP », ce qui vous permet de filtrer et d'afficher facilement uniquement les journaux pertinents. Ce guide fournit des instructions étape par étape sur la façon d'accéder à ces journaux à l'aide de Logcat dans Android Studio.

Rechercher la balise : Dans la barre de recherche au-dessus des instructions du journal, saisissez CMP pour filtrer les journaux marqués avec "CMP".

Facultatif : activer le mode débogage

In CMPConfig, ensemble isDebugMode = true.

val config = CmpConfig.apply {
    // ... other settings
    isDebugMode = true
}
  • Active des journaux plus détaillés marqués avec « CMP ».
  • Utile pour le débogage et l'analyse.

Dépannage

Classe introuvable ou NoSuchMethodException :

ProGuard peut parfois masquer les noms de classe ou supprimer les méthodes référencées dynamiquement via la réflexion. Pour résoudre ce problème, vous devez spécifier les classes et méthodes qui doivent rester intactes dans le fichier de configuration ProGuard à l'aide du -keep Directive.

Exemple de configuration ProGuard pour conserver une classe spécifique et ses méthodes :

# Kotlin serialization looks up the generated serializer classes through a function on companion
# objects. The companions are looked up reflectively so we need to explicitly keep these functions.
-keepclasseswithmembers class **.*$Companion {
    kotlinx.serialization.KSerializer serializer(...);
}
# If a companion has the serializer function, keep the companion field on the original type so that
# the reflective lookup succeeds.
-if class **.*$Companion {
  kotlinx.serialization.KSerializer serializer(...);
}
-keepclassmembers class <1>.<2> {
  <1>.<2>$Companion Companion;
}

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keepattributes JavascriptInterface

-keepclassmembers class net.consentmanager.sdk.common.callbacks.* {
   public *;
}

-keepclassmembers class net.consentmanager.sdk.consentlayer.ui.consentLayer.CmpWebView {
   public *;
}

-keepclassmembers class net.consentmanager.sdk.consentlayer.ui.CmpLayerAppInterface {
   public *;
}
-keep class net.consentmanager.sdk.CMPConsentTool {
                                                      *;
                                                  }

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keepattributes JavascriptInterface

# Serializer for classes with named companion objects are retrieved using `getDeclaredClasses`.
# If you have any, uncomment and replace classes with those containing named companion objects.
#-keepattributes InnerClasses # Needed for `getDeclaredClasses`.
#-if @kotlinx.serialization.Serializable class
#com.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
#com.example.myapplication.HasNamedCompanion2
#{
#    static **$* *;
#}
#-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept.
#    static <1>$$serializer INSTANCE;
#}

 

Retour en haut de la page