Dans ce document, vous trouverez des informations générales sur la manière d'intégrer notre SDK à votre projet. Pour plus de détails, veuillez vous reporter à notre documentation de référence API. Tous les extraits de code ci-dessous ont été extraits de notre application de démonstration.
1. Installation
consentmanager SDK est une solution complète pour la gestion du consentement des utilisateurs dans les applications mobiles. Conçu pour gérer la conformité au RGPD, les préférences de confidentialité des utilisateurs et la transparence du suivi publicitaire, ce SDK offre une intégration transparente pour les plateformes iOS et Android. De plus, il propose des plugins/ponts d'encapsulation pour React Native, Flutter et Unity, ce qui le rend polyvalent dans divers environnements de développement.
Étapes – Description générale
-
Intégration et configuration :
- Intégrez le SDK dans votre application.
- Configurez les paramètres du SDK en fonction de vos besoins.
-
Création d'une instance et affichage de la couche de consentement :
- Au démarrage de l'application, créez une instance de la
CMPManagerclasse. Cette instance gérera le processus de consentement. - Le SDK affichera automatiquement l'écran de consentement si nécessaire.
- Au démarrage de l'application, créez une instance de la
-
Traitement des données de consentement des utilisateurs :
- Une fois les consentements recueillis, les informations sont stockées et peuvent être consultées via différentes propriétés et méthodes exposées par notre SDK. Vous disposerez d'informations sur les consentements refusés ou acceptés, les fournisseurs et les finalités.
1.1 Intégration et configuration
Ajouter une dépendance via Gradle
Ajoutez la ligne suivante à votre fichier build.gradle :
dependencies {
implementation "net.consentmanager.sdkv3:cmsdkv3:3.2.0"
}
Synchronisez ensuite votre projet.
1.2 Création d'une instance et affichage de la couche de consentement
Au démarrage de l'application (dans votre onCreate ), vous devez créer une instance de la classe CMPManager. Vous devrez configurer deux objets qui seront transmis à la méthode getInstance : UrlConfig, qui gère votre configuration CMP, comme l'identifiant de code et la langue par défaut, et ConsentLayerUIConfig. qui configurera l'apparence de la WebView qui affichera la couche de consentement. Ensuite, vous passerez l'instance Activity à l'aide de la méthode setActivityet attribuer le délégué, comme indiqué ci-dessous. Dans l'exemple ci-dessous, vous pouvez voir les deux objets qui sont transmis. La checkAndOpen() fonction récupérera automatiquement les données nécessaires depuis notre serveur et déterminera si l'écran de consentement doit s'afficher ou non. Si c'est le cas, le SDK affichera automatiquement l'écran de consentement à ce stade, via un WebView créée par notre SDK, qui affichera la couche de consentement avec le texte et les boutons correspondant à vos configurations CMP (choisies via le Code-ID de votre CMP), collectera les données et enregistrera les informations de consentement dans la zone NSUserDefaults de l'appareil, afin que l'application puisse afficher les publicités ciblées en conséquence.
Veuillez noter qu'il est essentiel de déclarer et d'initialiser le CMPManager SDK dans la onCreate méthode, sinon la vue risque de ne pas être prête à l'emploi et le SDK peut échouer. Veuillez également respecter le modèle singleton, afin de n'avoir qu'une seule instance du SDK. Assurez-vous également d'utiliser les données de configuration correctes. Les données de configuration se trouvent dans votre compte ConsentManager sous Menu > CMP > Obtenir le code pour les applications > Code-ID
Veuillez également noter que les fonctionnalités permettant de déterminer si le consentement est nécessaire ou non, ainsi que l'affichage de la couche de consentement, dépendent d'une connexion réseau fiable. S'il n'y a pas de connexion disponible ou si le mécanisme de réessai ne parvient pas à atteindre notre serveur, l'événement didReceiveError renverra une erreur de délai d'attente, et le SDK sera donc totalement incapable de déterminer la nécessité d'un consentement, car il sera totalement incapable d'afficher la couche de consentement. Veuillez vous assurer que votre logique en tient compte.
Exemple :
import net.consentmanager.cm_sdk_android_v3.CMPManager
import net.consentmanager.cm_sdk_android_v3.CMPManagerDelegate
import net.consentmanager.cm_sdk_android_v3.ConsentLayerUIConfig
import net.consentmanager.cm_sdk_android_v3.UrlConfig
class MainActivity : ComponentActivity(), CMPManagerDelegate {
private lateinit var cmpManager: CMPManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
val urlConfig = UrlConfig(
id = "YOUR_CODE_ID_HERE",
domain = "delivery.consentmanager.net",
language = "EN",
appName = "CMDemoAppKotlin"
)
val webViewConfig = ConsentLayerUIConfig(
position = ConsentLayerUIConfig.Position.FULL_SCREEN,
backgroundStyle = ConsentLayerUIConfig.BackgroundStyle.dimmed(Color.BLACK, 0.5f),
cornerRadius = 10f,
respectsSafeArea = true,
isCancelable = false
)
cmpManager = CMPManager.getInstance(
context = this,
urlConfig = urlConfig,
webViewConfig = webViewConfig,
delegate = this
)
cmpManager.setActivity(this)
checkAndOpen()
}
private fun checkAndOpenConsentLayer() {
cmpManager.checkAndOpen { result ->
result.onSuccess {
showCMPDemoScreen()
}.onFailure { error ->
Log.e("DemoApp", "Check and open consent layer failed with error: $error")
}
}
}
private fun showCMPDemoScreen() {
setContent {
MaterialTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
CMPDemoScreen(cmpManager)
}
}
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
Log.d("CMP DemoApp", "Configuration changed")
super.onConfigurationChanged(newConfig)
cmpManager.onApplicationResume()
}
override fun onPause() {
Log.d("CMP DemoApp", "Activity paused")
super.onPause()
cmpManager.onApplicationPause()
}
override fun onDestroy() {
Log.d("CMP DemoApp", "Activity destroyed")
super.onDestroy()
cmpManager.onActivityDestroyed()
}
override fun didReceiveConsent(consent: String, jsonObject: Map<String, Any>) {
Log.d("CMP DemoApp", "Consent Layer successfully received consent message.")
runOnUiThread {
showCMPDemoScreen()
}
}
override fun didShowConsentLayer() {
Log.d("CMP DemoApp", "Consent Layer open message received.")
}
override fun didCloseConsentLayer() {
Log.d("CMP DemoApp", "Consent Layer close message received.")
runOnUiThread {
showCMPDemoScreen()
}
}
override fun didReceiveError(error: String) {
Log.e("CMP DemoApp", "SDK error: $error")
}
}
1.3 Traitement des données relatives au consentement des utilisateurs
Vérification des consentements des utilisateurs
Our SDK offer a unified method to check and retrieve consent information,getUserStatus()
:
val status = cmpManager.getUserStatus()
Log.d("CMPDemo", "User Status: ${status.hasUserChoice}")
Log.d("CMPDemo", "TCF: ${status.tcf}")
Log.d("CMPDemo", "Additional Consent: ${status.addtlConsent}")
Log.d("CMPDemo", "Regulation: ${status.regulation}")
Log.d("CMPDemo", "---- Vendors Status ----")
status.vendors.forEach { (vendorId, choice) ->
Log.d("CMPDemo", "Vendor $vendorId: $choice")
}
Log.d("CMPDemo", "---- Purposes Status ----")
status.purposes.forEach { (purposeId, choice) ->
Log.d("CMPDemo", "Purpose $purposeId: $choice")
}
Pour plus d'informations sur les autres méthodes, veuillez consulter notre documentation API complète.
Réouverture de la fenêtre de consentement pour vérifier les choix des utilisateurs
Afin de permettre à l'utilisateur de vérifier ou de modifier ses choix, vous pouvez simplement appeler openConsentLayer()
cmpManager.forceOpen()
Cette méthode affichera la couche de consentement via la même instance WebView créée lors des étapes précédentes.
Importation/exportation des informations de consentement vers d'autres sources
Dans certains cas, une application native peut contenir des webviews afin d'afficher des informations, telles que des publicités ou du contenu. Afin de transmettre les informations de consentement du SDK vers la webview, vous pouvez récupérer la chaîne de consentement en utilisant :
consentData = cmpManager.exportCMPInfo()
Cela permettra d'exporter les informations de consentement et toutes les autres données requises par le CMP. Vous pouvez ensuite transmettre ces informations au CMP présent dans votre webview en les ajoutant à l'URL appelée dans la webview.
Si, par ailleurs, vous devez importer la chaîne de consentement à l'aide du SDK, vous pouvez utiliser l'exemple ci-dessous :
val consentStringToImport = "Q1FERkg3QVFERkg3QUFmR01CSVRCQkVnQUFBQUFBQUFBQWlnQUFBQUFBQUEjXzUxXzUyXzUzXzU0XzU1XzU2XyNfczI3ODlfczI3OTBfczI3OTFfczI2OTdfczk3MV9VXyMxLS0tIw"
cmpManager.importCMPInfo(consentStringToImport)
Créer une mise en page personnalisée
Pour créer une vue personnalisée de WKWebView, vous pouvez créer un wrapper pour la ComponentActivity qui doit être transmise au SDK CMP, ce qui vous permet de contrôler entièrement son apparence et son cycle de vie. Pour plus d'informations, veuillez vous reporter à la documentation officielle.
Connexion
Lorsque vous utilisez notre SDK iOS, vous pouvez avoir besoin de déboguer ou d'analyser les informations de journal à diverses fins. Les journaux générés par notre SDK sont classés sous « CMP », ce qui vous permet de filtrer et d'afficher facilement uniquement les journaux pertinents. Pour plus d'informations, veuillez vous reporter à cette section de notre documentation.
Dépannage
Class Not Found ou NoSuchMethodException :
ProGuard peut parfois obscurcir les noms de classes ou supprimer des méthodes référencées dynamiquement via la réflexion. Pour remédier à cela, vous devez spécifier les classes et les méthodes qui doivent rester intactes dans le fichier de configuration de ProGuard à l'aide de la directive -keep .
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;
#}