Info
Inhalt

[Android] 1. consentmanager SDK-Integration

In diesem Dokument finden Sie allgemeine Informationen zur Integration unseres SDK in Ihr Projekt. Weitere Einzelheiten entnehmen Sie bitte unserer API-Referenz Dokumentation. 

1. Installation

consentmanager SDK ist eine umfassende Lösung für die Verwaltung der Benutzereinwilligung in mobilen Anwendungen. Dieses SDK wurde für die Einhaltung der DSGVO, die Berücksichtigung von Benutzerdatenschutzeinstellungen und die Transparenz der Anzeigenverfolgung entwickelt und bietet eine nahtlose Integration für iOS- und Android-Plattformen. Darüber hinaus bietet es Wrapper-Plugins/Bridges für React Native, Flutter und Unity, wodurch es in verschiedenen Entwicklungsumgebungen vielseitig einsetzbar ist.

Schritte – Beschreibung auf hoher Ebene

  1. Integration und Konfiguration:

    • Integrieren Sie das SDK in Ihre App.
    • Konfigurieren Sie die SDK-Einstellungen entsprechend Ihren Anforderungen.
  2. Erstellen einer Instanz und Anzeigen des Consent Layers:

    • Erstellen Sie beim Start der App eine Instanz von CMPManager Klasse. Diese Instanz übernimmt den Einwilligungsprozess.
    • Das SDK zeigt bei Bedarf automatisch den Zustimmungsbildschirm an.
  3. Verarbeitung der Einwilligungsdaten des Benutzers:

    • Sobald die Einwilligungen eingeholt wurden, werden die Informationen gespeichert und stehen für Abfragen über verschiedene Eigenschaften und Methoden zur Verfügung, die unser SDK bereitstellt. Sie erhalten Informationen über abgelehnte oder akzeptierte Einwilligungen, Anbieter und Zwecke.

1.1 Integration und Konfiguration

Abhängigkeit über Gradle hinzufügen

Fügen Sie Ihrer Datei build.gradle die folgende Zeile hinzu:

dependencies {
    implementation "net.consentmanager.sdkv3:cmsdkv3:3.0.0"
}

Synchronisieren Sie dann Ihr Projekt. 

1.2 Erstellen einer Instanz und Anzeigen der Zustimmungsebene

Innerhalb des App-Starts (Ihre onCreate Funktion), müssen Sie eine Instanz der Klasse erstellen CMPManagerSie müssen zwei Objekte einrichten, die an die Methode getInstance übergeben werden: UrlConfig, das Ihre CMP-Konfiguration verwaltet, wie Code-ID und Standardsprache, und ConsentLayerUIConfig. Dadurch wird das Aussehen der WebView konfiguriert, die die Zustimmungsebene anzeigt. Danach übergeben Sie die aktuelle Activity mit der Methode setActivity, und ordnen Sie den Delegaten zu, wie unten gezeigt. Im folgenden Beispiel finden Sie beide übergebenen Objekte. Die checkWithServerAndOpenIfNecessary() Funktion holt automatisch die erforderlichen Daten von unserem Server ab und bestimmt, ob der Zustimmungsbildschirm angezeigt werden muss oder nicht. Wenn ja, zeigt das SDK an dieser Stelle automatisch den Zustimmungsbildschirm an, über eine WebView Erstellt durch unser SDK, das die Zustimmungsebene mit dem Text und den Schaltflächen entsprechend Ihren CMP-Konfigurationen anzeigt (ausgewählt über die Code-ID Ihres CMP), die Daten sammelt und die Zustimmungsinformationen im Bereich NSUserDefaults des Geräts speichert, damit die App die zielgerichteten Anzeigen entsprechend anzeigen kann. 

Bitte beachten Sie, dass es wichtig ist, die CMPManager SDK im onCreate Methode, da die Ansicht sonst möglicherweise nicht einsatzbereit ist und das SDK fehlschlägt. Stellen Sie außerdem sicher, dass Sie die richtigen Konfigurationsdaten verwenden. Die Konfigurationsdaten finden Sie in Ihrem consentmanager Konto bei Menü > CMPs > Code für Apps abrufen > Code-ID

Beachten Sie außerdem, dass die Funktionen zur Feststellung, ob eine Zustimmung erforderlich ist oder nicht, sowie die Anzeige der Zustimmungsebene von einer zuverlässigen Netzwerkverbindung abhängen. Wenn keine Verbindung verfügbar ist oder der Wiederholungsmechanismus unseren Server nicht erreichen kann, gibt das Ereignis „didReceiveError“ einen Timeout-Fehler zurück. Das SDK kann daher überhaupt nicht feststellen, ob eine Zustimmung erforderlich ist, da es die Zustimmungsebene überhaupt nicht anzeigen kann. Bitte stellen Sie sicher, dass Ihre Logik dies berücksichtigt.

Ejemplo:

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)

        checkAndOpenConsentLayer()
    }

    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: JsonObject) {
        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 Verarbeitung von Einwilligungsdaten der Nutzer

Überprüfung der Einwilligungen der Benutzer

Unser SDK bietet verschiedene Methoden zum Überprüfen und Abrufen von Einwilligungsinformationen. Die wichtigsten Methoden werden im folgenden Beispiel angezeigt:

// On the example below retrieved from our Demo App, we have some examples 
// of how to check consents from the user, either accepted or rejected. 

val hasConsent = cmpManager.hasUserChoice()     				// checks if the user has already accepted/rejected consents
val hasPurposeC53 = cmpManager.hasPurposeConsent(id: "c53")		// checks if the user accepted the purpose "c53"
val hasVendorS2790 = cmpManager.hasVendorConsent(id: "s2790")	// checks if the user accepted the vendor "s2790"

Weitere Informationen zu den anderen Methoden finden Sie in unserer vollständigen API-Dokumentation

Erneutes Öffnen des Consent Layers, um die Auswahl der Benutzer zu überprüfen

Um dem Benutzer die Möglichkeit zu geben, seine Auswahl zu überprüfen oder zu ändern, können Sie einfach anrufen openConsentLayer()

cmpManager.openConsentLayer()

Diese Methode zeigt die Zustimmungsebene über dieselbe WebView-Instanz an, die in den vorherigen Schritten erstellt wurde. 

In einigen Fällen kann eine native App Webviews enthalten, um Informationen wie Werbung oder Inhalte anzuzeigen. Um die Zustimmungsinformationen vom SDK an die Webview zu übertragen, können Sie die Zustimmungszeichenfolge wie folgt abrufen:

consentData = cmpManager.exportCMPInfo()

Dadurch werden die Einwilligungsinformationen und alle weiteren Daten exportiert, die das CMP benötigt. Sie können diese Informationen dann an das CMP weitergeben, das sich in Ihrer Webansicht befindet, indem Sie sie der URL hinzufügen, die in der Webansicht aufgerufen wird.

Wenn Sie die Zustimmungszeichenfolge andernfalls mithilfe des SDK importieren müssen, können Sie das folgende Beispiel verwenden:

val consentStringToImport = "Q1FERkg3QVFERkg3QUFmR01CSVRCQkVnQUFBQUFBQUFBQWlnQUFBQUFBQUEjXzUxXzUyXzUzXzU0XzU1XzU2XyNfczI3ODlfczI3OTBfczI3OTFfczI2OTdfczk3MV9VXyMxLS0tIw"
cmpManager.importCMPInfo(consentStringToImport)

Erstellen eines benutzerdefinierten Layouts

Um eine angepasste Ansicht der WKWebView zu erstellen, können Sie einen Wrapper für die ComponentActivity erstellen, der an das CMP SDK übergeben werden muss, damit Sie die volle Kontrolle über das Erscheinungsbild und den Lebenszyklus haben. Weitere Informationen finden Sie im offizielle Dokumentation.

Protokollierung

Wenn Sie unser iOS SDK verwenden, müssen Sie möglicherweise Protokollinformationen für verschiedene Zwecke debuggen oder analysieren. Die von unserem SDK generierten Protokolle sind unter „CMP“ gekennzeichnet, sodass Sie einfach nur die relevanten Protokolle filtern und anzeigen können. Weitere Informationen finden Sie unter In diesem Abschnitt unserer Dokumentation.

Problemlösung

Klasse nicht gefunden oder NoSuchMethodException:

ProGuard kann manchmal Klassennamen verschleiern oder Methoden entfernen, auf die dynamisch über Reflektion verwiesen wird. Um dies zu beheben, müssen Sie mithilfe von die Klassen und Methoden angeben, die in der ProGuard-Konfigurationsdatei intakt bleiben sollen -keep Richtlinie.

Beispielhafte ProGuard-Konfiguration zum Beibehalten einer bestimmten Klasse und ihrer Methoden:

# 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;
#}

 

Nach oben