Dieser Leitfaden hilft dir bei der Migration von der vorherigen Version des CMP SDK zur aktuellen Version. Wir behandeln die Änderungen bei Methodennamen, Parametern sowie neuen oder veralteten Funktionen. Beispiele für Demo-Apps findest du unter diesem Link. Es gibt zwei Ordner: einen mit einer vollständig in Java entwickelten Demo-App, einschließlich eines Wrappers für Java namens JavaCMPManager eine weitere, vollständig in Kotlin entwickelte.
Bitte beachten Sie, dass diese Version des CMP-SDK komplett neu entwickelt wurde und somit eine wesentliche Änderung darstellt, da alle Methoden umbenannt wurden, ebenso wie die Signaturen, und nun Callbacks für fast alle Methoden angeboten werden. In jedem Fall müssen Sie Ihren Code anpassen und Ihre Abhängigkeiten aktualisieren, um sicherzustellen, dass Ihre mobile App wie erwartet funktioniert. Darüber hinaus ist zu beachten, dass alle Daten, die von der vorherigen Version unseres SDK auf den Geräten der Nutzer gespeichert wurden, gelöscht werden, was die App dazu zwingt, die Einwilligungsseite erneut anzuzeigen.
Repositorien
Bitte beachten Sie, dass sich alle unsere Repositorys für das Android SDK geändert haben. Befolgen Sie die nachstehenden Anweisungen, um herauszufinden, wohin Sie Ihren Dependency Manager verweisen müssen.
Maven
Ersetze in deiner Gradle-Datei die vorherige Zeile durch die folgende:
implementation("net.consentmanager.sdkv3:cmsdkv3:3.2.0")
Synchronisieren Sie Ihr Projekt nach der Änderung.
Wichtige Punkte bei der Migration
-
Delegate-Muster: Anstelle einzelner Listener verwendet die neue Version ein einziges Delegate-Protokoll (
CMPManagerDelegate) zur Verarbeitung von Ereignissen. Es enthält 4 Hauptereignisse:-
didReceiveConsent(consent: String, jsonObject: Map<String, Any>)
Dies wird ausgelöst, wenn die Einwilligungsschicht geschlossen wurde, nachdem der Nutzer seine Einwilligungen aktualisiert hat, ODER beim Aufruf von Methoden, die Änderungen an den Einwilligungen bewirken, wie acceptAll, rejectAll, acceptVendors, rejectVendors usw. Das bedeutet, dass der Nutzer einige oder alle Einwilligungen akzeptiert oder abgelehnt hat und dass diese korrekt auf dem Gerät gespeichert wurden. -
didShowConsentLayer
Dies wird ausgelöst, wenn die Einwilligungsschicht tatsächlich angezeigt wurde. Das bedeutet, dass auf dem Gerät keine gültige Einwilligung vorhanden war, sodass eine neue eingeholt werden sollte. -
didCloseConsentLayer
Dies wird ausgelöst, wenn das SDK die Notwendigkeit einer Einwilligung geprüft hat, diese jedoch nicht erforderlich war und die Einwilligungsmaske nicht angezeigt wurde. Das bedeutet, dass bereits eine gültige Einwilligung auf dem Gerät vorhanden ist, sodass keine neue erforderlich ist und die Einwilligungsmaske nicht angezeigt wird. -
didReceiveError
Dies wird ausgelöst, wenn der SDK-Vorgang einen Fehler ausgelöst hat.
-
- Abschluss-Handler: Viele Methoden enthalten nun Abschluss-Handler für asynchrone Operationen. Aktualisieren Sie Ihren Code, um diese Callbacks entsprechend zu behandeln.
-
Einwilligungstext: Verwenden Sie
exportCMPInfo()anstelle vongetConsentString(), um die Einwilligungsinformationen abzurufen. - Einwilligungen zu Anbietern und Zwecken: Die Methoden zum Einholen von Einwilligungen zu Anbietern und Zwecken geben nun Arrays von IDs zurück. Möglicherweise müssen Sie Ihre Logik anpassen, um diese Arrays zu verarbeiten.
-
US-Datenschutz-String: Die
getUSPrivacyString()Methode wurde als veraltet markiert. Falls Sie diese zur Einhaltung der CCPA-Vorschriften verwendet haben, beachten Sie bitte, dass diese Methode nicht mehr verfügbar ist. -
Prüfung der Einwilligungsanforderungen: Verwenden Sie die neue
checkAndOpen(completion:)Methode, um automatisch festzustellen, ob eine Einwilligung erforderlich ist, bevor die Einwilligungsmaske angezeigt wird.
Änderungen bei Methoden und Signaturen
Initialisierung
- Alt:
CmpManager.initialize(context: Context, cmpConfig: CmpConfig) - Neu:
CmpManager.createInstance(context: Context, cmpConfig: CmpConfig)
UI-Konfiguration festlegen
- Alt:
.withCmpViewControllerConfigurationBlock { ... } - Neu: Die Option ist nicht vorhanden, aber du kannst eine Wrapper-Aktivität erstellen und den Lebenszyklus sowie das Erscheinungsbild auf deiner Seite des Codes steuern.
Überprüfung der Einwilligung
- Alt:
check({ ... }, isCached: Bool), - Neu:
checkAndOpen(completion: (Error?) -> Void)
Überprüfen und bei Bedarf die Einwilligungsschicht öffnen
- Alt:
checkAndOpenConsentLayer() - Neu:
checkAndOpen(completion: (Error?) -> Void)
Open Consent Layer
- Alt:
openConsentLayer() - Neu:
forceOpen(completion: (Result<Unit>) -> Unit)
Alle Einwilligungen akzeptieren
- Alt:
acceptAll(callback: ConsentCallback) - Neu:
cceptAll(completion: (Result<Unit>) -> Unit)
Alle Einwilligungen ablehnen
- Alt:
rejectAll(onFinish: () -> Unit) - Neu:
rejectAll(completion: (Result<Unit>) -> Unit)
Zwecke aktivieren
- Alt:
enablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?) - Neu:
acceptPurposes(purposes: List<String>, updatePurpose: Boolean, completion: (Result<Unit>) -> Unit)
Zweck deaktivieren
- Alt:
disablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?) - Neu:
rejectPurposes(purposes: List<String>, updateVendor: Boolean, completion: (Result<Unit>) -> Unit)
Anbieter aktivieren
- Alt:
enableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?) - Neu:
acceptVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Anbieter deaktivieren
- Alt:
disableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?) - Neu:
rejectVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Für alle Zwecke
- Alt:
getAllPurposes(): List<String> - Neu:
getAllPurposesIDs(): List<String>
Get Enabled Purposes
- Alt:
getEnabledPurposes(): List<String> - New:
getUserStatus(): UserConsentStatus
Alle Anbieter anzeigen
- Alt:
getAllVendors(): List<String> - New:
getUserStatus(): UserConsentStatus
Zugelassene Anbieter
- Alt:
getEnabledVendors(): List<String> - New:
getUserStatus(): UserConsentStatus
Zweck der Einwilligung prüfen
- Alt:
hasPurposeConsent(String): Boolean - Neu:
getStatusForPurpose(id: String): ConsentStatus
Zustimmung des Anbieters prüfen
- Alt:
hasVendorConsent(String): Boolean - Neu:
getStatusForVendor(id: String): ConsentStatus
CMP-String exportieren
- Alt:
exportCmpString() : String - Neu:
exportCMPInfo(): String
CMP-String importieren
- Alt:
importCmpString(consentString: String, completionHandler: ((Error?) -> Unit)?) - Neu:
importCMPInfo(cmpString: String, completion: (Result<Unit>) -> Unit)
Einwilligungsdaten zurücksetzen
- Alt:
reset() - Neu:
resetConsentManagementData(completion: (Result<Unit>) -> Unit)
Umgang mit dem Status des Google-Einwilligungsmodus
- Alt:
withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface) - Neu:
getGoogleConsentModeStatus
Umgang mit dem onLinkClick-Callback
- Alt: In Version 2 gab es eine Whitelist-Funktion. In der aktuellen Version wurde der Prozess vereinfacht, und der Benutzer hat die volle Kontrolle über das zu befolgende Verhalten entsprechend der URL, die von der Methode zurückgegeben wird.
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
})
- Neu: Der Nutzer hat die volle Kontrolle darüber, welchem Verhalten er entsprechend der URL folgen möchte. Daher sollten die bisherigen URLs auf der Whitelist in die Callback-Methode migriert werden,
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
}
}
Veraltete Methoden:
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)
Beispiele für die Migration
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) {
}
}