Questa guida ti aiuterà a migrare dalla versione precedente dell'SDK CMP a quella attuale. Tratteremo le modifiche ai nomi dei metodi, ai parametri e alle funzionalità nuove o deprecate. Per esempi di app demo, consulta questo link. Ci sono due cartelle, una con un'app demo sviluppata interamente in Java, che include un wrapper per Java chiamato JavaCMPManager un'altra sviluppata interamente in Kotlin.
Tieni presente che questa versione dell'SDK CMP è stata completamente ricostruita da zero e rappresenta quindi un cambiamento significativo, poiché tutti i metodi sono stati rinominati, così come le firme, e ora offre callback per quasi tutti i metodi. In tutti i casi, dovrai modificare il tuo codice e aggiornare le dipendenze per assicurarti che la tua app mobile funzioni come previsto. Inoltre, vale la pena menzionare che tutti i dati memorizzati dalla versione precedente del nostro SDK sui dispositivi degli utenti verranno cancellati, il che costringerà l'app a visualizzare nuovamente il layer di consenso.
Archivi
Tieni presente che tutti i nostri repository sono cambiati per l'SDK Android. Segui le istruzioni qui sotto per scoprire dove indirizzare il tuo gestore di dipendenze.
Maven
Nel tuo file Gradle, sostituisci la riga precedente con quella qui sotto:
implementation("net.consentmanager.sdkv3:cmsdkv3:3.2.0")
Dopo aver apportato le modifiche, sincronizza il tuo progetto.
Punti chiave della migrazione
-
Modello Delegate: invece di singoli listener, la nuova versione utilizza un unico protocollo delegate (
CMPManagerDelegate) per la gestione degli eventi. Contiene 4 eventi principali:-
didReceiveConsent(consent: String, jsonObject: Map<String, Any>)
Questo viene attivato quando il layer dei consensi è stato chiuso dopo che l'utente ha aggiornato i propri consensi OPPURE quando si invocano metodi che causano modifiche ai consensi, come acceptAll, rejectAll, acceptVendors, rejectVendors, ecc. Significa che l'utente ha accettato o rifiutato alcuni o tutti i consensi e che questi sono stati correttamente salvati nel dispositivo. -
didShowConsentLayer
Viene attivato quando il layer di consenso è stato effettivamente visualizzato. Significa che non c'era un consenso valido nel dispositivo, quindi ne deve essere raccolto uno nuovo. -
didCloseConsentLayer
Questo evento viene attivato quando l'SDK ha verificato la necessità di un consenso, ma non era necessario e il livello non è stato visualizzato. Significa che nel dispositivo è già presente un consenso valido, quindi non è necessario un nuovo consenso e il livello di consenso non verrà visualizzato. -
didReceiveError
Questo viene attivato quando l'operazione dell'SDK ha generato un errore.
-
- Gestori di completamento: molti metodi ora includono gestori di completamento per operazioni asincrone. Aggiorna il tuo codice per gestire questi callback in modo appropriato.
-
Stringa di consenso: usa
exportCMPInfo()invece digetConsentString()per recuperare le informazioni sul consenso. - Consensi del fornitore e dello scopo: i metodi per ottenere i consensi del fornitore e dello scopo ora restituiscono array di ID. Potrebbe essere necessario modificare la logica per gestire questi array.
-
Stringa sulla privacy per gli Stati Uniti: il
getUSPrivacyString()metodo è stato deprecato. Se lo stavi utilizzando per la conformità al CCPA, tieni presente che questo metodo non è più disponibile. -
Verifica dei requisiti di consenso: usa il nuovo
checkAndOpen(completion:)metodo per determinare automaticamente se è necessario il consenso prima di mostrare il layer di consenso.
Modifiche ai metodi e alle firme
Inizializzazione
- Vecchio:
CmpManager.initialize(context: Context, cmpConfig: CmpConfig) - Novità:
CmpManager.createInstance(context: Context, cmpConfig: CmpConfig)
Imposta la configurazione dell'interfaccia utente
- Vecchio:
.withCmpViewControllerConfigurationBlock { ... } - Novità: l'opzione non è prevista, ma puoi creare un'attività wrapper e controllare il ciclo di vita e l'aspetto dal tuo codice.
Verifica del consenso
- Vecchio:
check({ ... }, isCached: Bool), - Novità:
checkAndOpen(completion: (Error?) -> Void)
Verifica e apertura del layer di consenso, se necessario
- Vecchia versione:
checkAndOpenConsentLayer() - Novità:
checkAndOpen(completion: (Error?) -> Void)
Layer di consenso aperto
- Vecchio:
openConsentLayer() - Novità:
forceOpen(completion: (Result<Unit>) -> Unit)
Accetta tutti i consensi
- Vecchio:
acceptAll(callback: ConsentCallback) - Novità:
cceptAll(completion: (Result<Unit>) -> Unit)
Rifiuta tutti i consensi
- Vecchio:
rejectAll(onFinish: () -> Unit) - Novità:
rejectAll(completion: (Result<Unit>) -> Unit)
Abilita gli scopi
- Vecchia versione:
enablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?) - Novità:
acceptPurposes(purposes: List<String>, updatePurpose: Boolean, completion: (Result<Unit>) -> Unit)
Disabilita scopi
- Vecchio:
disablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?) - Novità:
rejectPurposes(purposes: List<String>, updateVendor: Boolean, completion: (Result<Unit>) -> Unit)
Abilita fornitori
- Vecchio:
enableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?) - Novità:
acceptVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Disabilita fornitori
- Vecchia versione:
disableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?) - Novità:
rejectVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Ottieni tutti gli scopi
- Vecchia versione:
getAllPurposes(): List<String> - Novità:
getAllPurposesIDs(): List<String>
Obiettivi da raggiungere
- Vecchia versione:
getEnabledPurposes(): List<String> - Novità:
getUserStatus(): UserConsentStatus
Ottieni tutti i fornitori
- Vecchio:
getAllVendors(): List<String> - Novità:
getUserStatus(): UserConsentStatus
Ottieni fornitori abilitati
- Vecchio:
getEnabledVendors(): List<String> - Novità:
getUserStatus(): UserConsentStatus
Verifica dello scopo del consenso
- Vecchia versione:
hasPurposeConsent(String): Boolean - Novità:
getStatusForPurpose(id: String): ConsentStatus
Verifica il consenso del fornitore
- Vecchio:
hasVendorConsent(String): Boolean - Novità:
getStatusForVendor(id: String): ConsentStatus
Esporta stringa CMP
- Vecchia versione:
exportCmpString() : String - Novità:
exportCMPInfo(): String
Importa stringa CMP
- Vecchia versione:
importCmpString(consentString: String, completionHandler: ((Error?) -> Unit)?) - Novità:
importCMPInfo(cmpString: String, completion: (Result<Unit>) -> Unit)
Reimposta i dati relativi al consenso
- Vecchia versione:
reset() - Novità:
resetConsentManagementData(completion: (Result<Unit>) -> Unit)
Gestione dello stato della modalità di consenso di Google
- Vecchia versione:
withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface) - Novità:
getGoogleConsentModeStatus
Gestione del callback onLinkClick
- Vecchia versione: la v2 aveva una funzione di whitelist. Nella versione attuale, il processo è stato semplificato e l'utente ha il pieno controllo sul comportamento da seguire in base all'URL restituito dal metodo.
cmpConfig.domainWhitelist = ["add your domains to be whitelisted"]
cmpManager.withOnCmpLinkClickListener({ url, decisionHandler in
//check URL and add the nav action
decisionHandler!.pointee = WKNavigationActionPolicy.allow
decisionHandler!.pointee = WKNavigationActionPolicy.cancel
// return shouldCloseWebView (true) or stay open (false)
return true
})
- Novità: l'utente ha il pieno controllo su quale comportamento seguire in base all'URL. Pertanto, i precedenti URL inseriti nella whitelist dovrebbero essere migrati all'interno del metodo callback,
cmpManager.setOnClickLinkCallback { url ->
if (url.contains("google.com")) {
// Open Google URLs in external browser
try {
startActivity(Intent(Intent.ACTION_VIEW, url.toUri()))
true // Return true to indicate we handled the URL
} catch (e: Exception) {
Log.e("DemoApp", "Error opening URL: $url", e)
false
}
} else {
// Let other URLs load in the WebView
false
}
}
Metodi deprecati:
checkIfConsentIsRequired(completion: @escaping (Bool) -> Void)-
hasUserChoice() -> Bool -
hasPurposeConsent(id: String) -> Bool -
hasVendorConsent(id: String) -> Bool -
openConsentLayer(completion: @escaping (NSError?) -> Void) -
getAllPurposesIDs() -> [String] -
getEnabledPurposesIDs() -> [String] -
getDisabledPurposesIDs() -> [String] -
getAllVendorsIDs() -> [String] -
getEnabledVendorsIDs() -> [String] -
getDisabledVendorsIDs() -> [String] getUSPrivacyString()calledThisDay(): BooleangetConsentstring(): StringgetGoogleACString(): StringgetUSPrivacyString(): Stringinitialize(context: Context, cmpConfig: CmpConfig)setCallbacks(...)withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface)
Esempi di migrazione
Kotlin
// ============================================
// Previous versions
// ============================================
class CmpDemoActivity : FragmentActivity() {
private lateinit var cmpManager: CmpManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val config = CmpConfig.apply {
id = "<YOUR-CONSENTMANAGER-APP-ID>" // example: b238acdf1a
domain = "<YOUR-CONSENTMANAGER-APP-DOMAIN>" // example: delivery.consentmanager.net
appName = "<YOUR-CONSENTMANAGER-APP-NAME>" // example: testApp
language = "<YOUR-CONSENTMANAGER-APP-LANGUAGE>" // example: DE
}
cmpManager = CmpManager.createInstance(this, config)
cmpManager.initialize(this)
}
}
// ============================================
// SDK v3 implementation
// ============================================
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
val urlConfig = UrlConfig(
id = "09cb5dca91e6b",
domain = "delivery.consentmanager.net",
language = "EN",
appName = "CMDemoAppKotlin"
)
// This UI Config for Android is limited, but you have the option to create an activity wrapper
// to have full control over the appearance and the position
val webViewConfig = ConsentLayerUIConfig(
position = ConsentLayerUIConfig.Position.FULL_SCREEN, // that's the only position available for Android
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.checkWithServerAndOpenIfNecessary { 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")
}
}
Java
// ===================================================
// Previuous versions
// ===================================================
public class CmpDemoActivity extends AppCompatActivity {
private CmpManager cmpManager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CmpConfig cmpConfig = CmpConfig.INSTANCE;
cmpConfig.setId("<YOUR-CONSENTMANAGER-APP-ID>"); // example: a000aaaa1a
cmpConfig.setDomain("<YOUR-CONSENTMANAGER-APP-DOMAIN>"); // example: delivery.consentmanager.net
cmpConfig.setAppName("<YOUR-CONSENTMANAGER-APP-NAME>"); // example: testApp
cmpConfig.setLanguage("<YOUR-CONSENTMANAGER-APP-LANGUAGE>"); // example: EN
cmpConfig.setTimeout(4000);
cmpManager = CmpManager.createInstance(this, cmpConfig);
cmpManager.initialize(this)
}
}
// ===========================================
// SDK v3 implementation
// ===========================================
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cmp_demo);
UrlConfig urlConfig = new UrlConfig(
"09cb5dca91e6b",
"delivery.consentmanager.net",
"EN",
"CMDemoAppJava"
);
// This UI Config for Android is limited, but you have the option to create an activity wrapper
// to have full control over the appearance and the position
ConsentLayerUIConfig webViewConfig = new ConsentLayerUIConfig(
ConsentLayerUIConfig.Position.FULL_SCREEN,
ConsentLayerUIConfig.BackgroundStyle.dimmed(Color.BLACK, 0.5f),
10f,
true,
false
);
JavaCMPManager cmpManager = JavaCMPManager.getInstance(this, urlConfig, webViewConfig, this);
cmpManager.setActivity(this);
cmpManager.checkAndOpen(result -> {
if (result.isSuccess()) {
} else {
Log.e("JavaDemoAp", "Initialize method failed with error: " + result.exceptionOrNull());
}
return null;
});
}
private void showCMPDemoScreen() {
Intent intent = new Intent(this, CMPDemoActivity.class);
startActivity(intent);
finish();
}
@Override
public void didShowConsentLayer() {
Log.d("CMP JavaDemoAp", "Consent Layer open message received.");
}
@Override
public void didCloseConsentLayer() {
Log.d("CMP JavaDemoAp", "Consent Layer close message received.");
}
@Override
public void didReceiveError(@NonNull String error) {
Log.e("CMP JavaDemoAp", "SDK error: " + error);
}
@Override
public void didReceiveConsent(@NonNull String consent, @NonNull Map<String, Any> jsonObject) {
Log.d("CMP JavaDemoAp", "Consent received: " + consent);
runOnUiThread(this::showCMPDemoScreen);
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
super.onPointerCaptureChanged(hasCapture);
}
@Override
public void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner, @NonNull Lifecycle.State state) {
}
}