[Android] 0. Migrationsleitfaden
Dieser Leitfaden hilft Ihnen bei der Migration von der vorherigen Version des CMP SDK zur aktuellen Version. Wir behandeln die Änderungen bei Methodennamen, Parametern und neuen oder veralteten Funktionen. Beispiele für Demo-Apps finden Sie unter diesen Link. Es gibt zwei Ordner, einen mit einer Demo-App, die vollständig in Java entwickelt wurde, einschließlich eines Wrappers für Java namens JavaCMPManager
ein anderes, das vollständig in Kotlin entwickelt wurde.
Bitte beachten Sie, dass diese Version des CMP SDK von Grund auf neu erstellt wurde und daher eine Wichtige bahnbrechende Änderungen, da alle Methoden umbenannt wurden, ebenso wie die Signaturen, und jetzt auch Rückrufe für fast alle Methoden angeboten werden. Auf alle Fällemüssen Sie Ihren Code ändern und Ihre Abhängigkeiten aktualisieren, um sicherzustellen, dass Ihre mobile App wie erwartet funktioniert. Darüber hinaus ist zu erwähnen, dass Alle Daten, die von der vorherigen Version unseres SDK auf den Geräten der Benutzer gespeichert wurden, werden gelöscht., wodurch die App gezwungen wird, Erneutes Anzeigen der Einwilligungsebene.
Aufbewahrungsorte
Bitte beachten Sie, dass sich alle unsere Repositories für das Android SDK geändert haben. Befolgen Sie die nachstehenden Anweisungen, um herauszufinden, wohin Sie Ihren Abhängigkeitsmanager verweisen müssen.
Maven
Ersetzen Sie in Ihrer Gradle-Datei die vorherige Zeile durch die folgende:
implementation("net.consentmanager.sdkv3:cmsdkv3:3.2.0")
Synchronisieren Sie Ihr Projekt nach der Änderung.
Wichtige Migrationspunkte
-
Delegiertenmuster: Anstelle einzelner Listener verwendet die neue Version ein einzelnes Delegate-Protokoll (
CMPManagerDelegate
) zur Behandlung von Ereignissen. Es enthält 4 Hauptereignisse:-
didReceiveConsent(consent: String, jsonObject: Map<String, Any>)
Dies wird ausgelöst, wenn die Zustimmungsebene geschlossen wurde, nachdem der Benutzer seine Zustimmungen aktualisiert hatte, ODER wenn Methoden aufgerufen werden, die Änderungen an den Zustimmungen bewirken, wie „acceptAll“, „rejectAll“, „acceptVendors“, „rejectVendors“ usw. Dies bedeutet, dass der Benutzer einige oder alle Zustimmungen akzeptiert oder abgelehnt hat und dass diese korrekt auf dem Gerät gespeichert wurden. -
didShowConsentLayer
Dies wird ausgelöst, wenn die Zustimmungsebene tatsächlich angezeigt wurde. Es bedeutet, dass auf dem Gerät keine gültige Zustimmung vorhanden war und daher eine neue eingeholt werden muss. -
didCloseConsentLayer
Dies wird ausgelöst, wenn das SDK die Notwendigkeit einer Zustimmung überprüft hat, diese aber nicht erforderlich war und die Ebene nicht angezeigt wurde. Das bedeutet, dass bereits eine gültige Zustimmung im Gerät vorhanden ist, sodass keine neue Zustimmung erforderlich ist und die Zustimmungsebene nicht angezeigt wird. -
didReceiveError
Dies wird ausgelöst, wenn der SDK-Vorgang einen Fehler verursacht hat.
-
- Vervollständigungshandler: Viele Methoden enthalten jetzt Abschlusshandler für asynchrone Vorgänge. Aktualisieren Sie Ihren Code, um diese Rückrufe entsprechend zu verarbeiten.
-
Zustimmungszeichenfolge: Wasser
exportCMPInfo()
stattgetConsentString()
um die Einwilligungsinformationen abzurufen. - Einwilligungen von Anbietern und Zwecken: Die Methoden zum Einholen von Anbieter- und Zweckzustimmungen geben jetzt ID-Arrays zurück. Möglicherweise müssen Sie Ihre Logik anpassen, um diese Arrays verarbeiten zu können.
-
US-Datenschutzzeichenfolge: Der
getUSPrivacyString()
Methode ist veraltet. Wenn Sie dies zur Einhaltung des CCPA verwendet haben, beachten Sie bitte, dass diese Methode nicht mehr verfügbar ist. -
Einwilligungspflichtprüfung: Verwenden Sie das Neue
checkAndOpen(completion:)
Methode, um automatisch zu bestimmen, ob eine Zustimmung erforderlich ist, bevor die Zustimmungsebene angezeigt wird.
Änderungen an Methoden und Signaturen
Initialisierung
- Old:
CmpManager.initialize(context: Context, cmpConfig: CmpConfig)
- Neu:
CmpManager.createInstance(context: Context, cmpConfig: CmpConfig)
UI-Konfiguration festlegen
- Old:
.withCmpViewControllerConfigurationBlock { ... }
- Neu: Die Option wird nicht bereitgestellt, aber Sie können eine Wrapper-Aktivität erstellen und den Lebenszyklus und das Erscheinungsbild auf Ihrer Seite des Codes steuern.
Überprüfung der Einwilligung
- Old:
check({ ... }, isCached: Bool)
, - Neu:
checkAndOpen(completion: (Error?) -> Void)
Überprüfen und Öffnen der Einwilligungsebene bei Bedarf
- Old:
checkAndOpenConsentLayer()
- Neu:
checkAndOpen(completion: (Error?) -> Void)
Öffnen Sie die Einwilligungsebene
- Old:
openConsentLayer()
- Neu:
forceOpen(completion: (Result<Unit>) -> Unit)
Alle Einwilligungen akzeptieren
- Old:
acceptAll(callback: ConsentCallback)
- Neu:
cceptAll(completion: (Result<Unit>) -> Unit)
Alle Zustimmungen ablehnen
- Old:
rejectAll(onFinish: () -> Unit)
- Neu:
rejectAll(completion: (Result<Unit>) -> Unit)
Zwecke aktivieren
- Old:
enablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
- Neu:
acceptPurposes(purposes: List<String>, updatePurpose: Boolean, completion: (Result<Unit>) -> Unit)
Zwecke deaktivieren
- Old:
disablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
- Neu:
rejectPurposes(purposes: List<String>, updateVendor: Boolean, completion: (Result<Unit>) -> Unit)
Anbieter aktivieren
- Old:
enableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
- Neu:
acceptVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Anbieter deaktivieren
- Old:
disableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
- Neu:
rejectVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Holen Sie sich alle Zwecke
- Old:
getAllPurposes(): List<String>
- Neu:
getAllPurposesIDs(): List<String>
Aktivieren Sie die Zwecke
- Old:
getEnabledPurposes(): List<String>
- Neu:
getUserStatus(): UserConsentStatus
Alle Anbieter abrufen
- Old:
getAllVendors(): List<String>
- Neu:
getUserStatus(): UserConsentStatus
Aktivierte Anbieter erhalten
- Old:
getEnabledVendors(): List<String>
- Neu:
getUserStatus(): UserConsentStatus
Zweckzustimmung prüfen
- Old:
hasPurposeConsent(String): Boolean
- Neu:
getStatusForPurpose(id: String): ConsentStatus
Zustimmung des Anbieters prüfen
- Old:
hasVendorConsent(String): Boolean
- Neu:
getStatusForVendor(id: String): ConsentStatus
CMP-Zeichenfolge exportieren
- Old:
exportCmpString() : String
- Neu:
exportCMPInfo(): String
CMP-Zeichenfolge importieren
- Old:
importCmpString(consentString: String, completionHandler: ((Error?) -> Unit)?)
- Neu:
importCMPInfo(cmpString: String, completion: (Result<Unit>) -> Unit)
Einwilligungsdaten zurücksetzen
- Old:
reset()
- Neu:
resetConsentManagementData(completion: (Result<Unit>) -> Unit)
Umgang mit dem Google Consent Mode-Status
- Old:
withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface)
- Neu:
getGoogleConsentModeStatus
Umgang mit dem onLinkClick-Rückruf
- Alt: Version 2 verfügte über eine Whitelist-Funktion. In der aktuellen Version wurde der Prozess vereinfacht, und der Benutzer hat die volle Kontrolle über das Verhalten, das gemäß der von der Methode zurückgegebenen URL ausgeführt 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 Benutzer hat die volle Kontrolle darüber, welches Verhalten je nach URL angewendet wird. Daher sollten die zuvor auf der Whitelist stehenden URLs 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(): Boolean
getConsentstring(): String
getGoogleACString(): String
getUSPrivacyString(): String
initialize(context: Context, cmpConfig: CmpConfig)
setCallbacks(...)
withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface)
Migrationsbeispiele
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")
}
}
Javac
// ===================================================
// 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) {
}
}