In questo documento troverai informazioni generali su come integrare il nostro SDK nel tuo progetto. Per ulteriori dettagli, consulta la nostra documentazione di riferimento API. Tutti i frammenti di codice riportati di seguito sono stati estratti dalla nostra app demo.
1. Installazione
consentmanager SDK è una soluzione completa per la gestione del consenso degli utenti nelle applicazioni mobili. Progettato per gestire la conformità al GDPR, le preferenze di privacy degli utenti e la trasparenza del tracciamento pubblicitario, questo SDK offre un'integrazione perfetta per le piattaforme iOS e Android. Inoltre, offre plugin/bridge wrapper per React Native, Flutter e Unity, rendendolo versatile in vari ambienti di sviluppo.
Passaggi – Descrizione di alto livello
-
Integrazione e configurazione:
- Integra l'SDK nella tua app.
- Configura le impostazioni dell'SDK in base alle tue esigenze.
-
Creazione di un'istanza e visualizzazione del Consent Layer:
- All'avvio dell'app, crea un'istanza della
CMPManagerclasse. Questa istanza gestirà il processo di consenso. - L'SDK visualizzerà automaticamente la schermata di consenso se necessario.
- All'avvio dell'app, crea un'istanza della
-
Elaborazione dei dati relativi al consenso degli utenti:
- Una volta raccolti i consensi, le informazioni vengono archiviate e sono disponibili per l'interrogazione tramite diverse proprietà e metodi esposti dal nostro SDK. Avrai informazioni sui consensi rifiutati o accettati, sui fornitori e sulle finalità.
1.1 Integrazione e configurazione
Aggiunta della dipendenza tramite Gradle
Aggiungi la seguente riga al tuo file build.gradle:
dependencies {
implementation "net.consentmanager.sdkv3:cmsdkv3:3.2.0"
}
Quindi sincronizza il tuo progetto.
1.2 Creazione di un'istanza e visualizzazione del layer di consenso
All'avvio dell'app (la tua onCreate funzione), devi creare un'istanza della classe CMPManager. Dovrai configurare due oggetti che verranno passati al metodo getInstance: UrlConfig, che gestisce la tua configurazione CMP, come Code-ID e lingua predefinita, e ConsentLayerUIConfig, che configurerà l'aspetto della WebView che visualizzerà il layer di consenso. Dopodiché, passerai l'attuale Activity utilizzando il metodo setActivitye assegnare il delegato, come mostrato di seguito. Nell'esempio qui sotto, puoi trovare entrambi gli oggetti che vengono passati. La checkAndOpen() funzione recupererà automaticamente i dati necessari dal nostro server e determinerà se la schermata di consenso deve essere mostrata o meno. In tal caso, l'SDK mostrerà automaticamente la schermata di consenso a questo punto, tramite un WebView creata dal nostro SDK, che visualizzerà il layer di consenso con il testo e i pulsanti in base alle configurazioni del CMP (scelto tramite il Code-ID del CMP), raccoglierà i dati e salverà le informazioni sul consenso nell’area NSUserDefaults del dispositivo, in modo che l’app possa visualizzare gli annunci mirati di conseguenza.
Tieni presente che è fondamentale dichiarare e inizializzare l' CMPManager SDK nel onCreate metodo, altrimenti la vista potrebbe non essere pronta per l'uso e l'SDK potrebbe non funzionare. Si prega di osservare anche il modello singleton, in modo da avere una sola istanza dell'SDK. Inoltre, assicurati di utilizzare i dati di configurazione corretti. I dati di configurazione si trovano nel tuo account Consentmanager in Menu > CMP > Ottieni codice per app > ID codice
Inoltre, tieni presente che le funzionalità relative alla determinazione della necessità o meno del consenso, così come la visualizzazione del layer di consenso, dipendono da una connessione di rete affidabile. Se non è disponibile alcuna connessione o se il meccanismo di riprova non riesce a raggiungere il nostro server, l'evento didReceiveError restituirà un errore di timeout e quindi l'SDK non sarà in grado di determinare la necessità di un consenso, poiché non sarà in grado di visualizzare il layer di consenso. Assicurati che la tua logica tenga conto di questo aspetto.
Esempio:
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 Trattamento dei dati relativi al consenso degli utenti
Verifica dei consensi degli utenti
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")
}
Per ulteriori informazioni sugli altri metodi, consulta la nostra documentazione completa sull'API.
Riaprire il Consent Layer per verificare le scelte degli utenti
Per consentire all'utente di verificare o modificare le proprie scelte, puoi semplicemente chiamare openConsentLayer()
cmpManager.forceOpen()
Questo metodo visualizzerà il layer di consenso tramite la stessa istanza WebView creata nei passaggi precedenti.
Importazione/esportazione delle informazioni sul consenso verso altre fonti
In alcuni casi un'app nativa potrebbe contenere webview per visualizzare informazioni, come pubblicità o contenuti. Per trasmettere le informazioni sul consenso dall'SDK alla webview, puoi recuperare la stringa di consenso utilizzando:
consentData = cmpManager.exportCMPInfo()
Questo esporterà le informazioni sul consenso e tutti gli ulteriori dati necessari al CMP. Potrai quindi trasmettere queste informazioni al CMP presente nella tua webview aggiungendole all'URL richiamato nella webview.
Se, invece, hai bisogno di importare la stringa di consenso utilizzando l'SDK, puoi utilizzare l'esempio qui sotto:
val consentStringToImport = "Q1FERkg3QVFERkg3QUFmR01CSVRCQkVnQUFBQUFBQUFBQWlnQUFBQUFBQUEjXzUxXzUyXzUzXzU0XzU1XzU2XyNfczI3ODlfczI3OTBfczI3OTFfczI2OTdfczk3MV9VXyMxLS0tIw"
cmpManager.importCMPInfo(consentStringToImport)
Creazione di un layout personalizzato
Per creare una vista personalizzata di WKWebView, puoi creare un wrapper per la ComponentActivity che deve essere passata all'SDK CMP, in modo da avere il pieno controllo sull'aspetto e sul ciclo di vita della stessa. Per ulteriori informazioni, consulta la documentazione ufficiale.
Accesso
Quando utilizzi il nostro SDK per iOS, potresti avere la necessità di eseguire il debug o analizzare le informazioni di log per vari scopi. I log generati dal nostro SDK sono contrassegnati con "CMP", consentendoti di filtrare facilmente e visualizzare solo i log rilevanti. Per ulteriori informazioni, consulta questa sezione della nostra documentazione.
Risoluzione dei problemi
Class Not Found o NoSuchMethodException:
ProGuard a volte può offuscare i nomi delle classi o rimuovere i metodi a cui si fa riferimento dinamicamente tramite riflessione. Per risolvere questo problema, è necessario specificare le classi e i metodi che devono essere mantenuti intatti nel file di configurazione di ProGuard utilizzando la -keep .
Esempio di configurazione ProGuard per mantenere una classe specifica e i suoi metodi:
# 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;
#}