[Android] 1. consentmanager SDK-Integration
Der consentmanager SDK für Android-Apps implementiert und bietet Funktionen, um den Benutzer über den Datenschutz zu informieren und die Zustimmung des Benutzers einzuholen und einzuholen. Es ermöglicht App-Entwicklern, das einfach zu integrieren consentmanager Service in ihre App.
So funktioniert's
- Integrieren Sie das SDK in die App und konfigurieren Sie die SDK-Einstellungen
- Sobald das SDK in eine App eingebunden ist, stellt das SDK Funktionen für den App-Entwickler bereit, um Zustimmungsdaten abzurufen
- Sobald die App gestartet wird, ruft das SDK automatisch Informationen von der ab consentmanager Server, um das SDK für die Verwendung vorzubereiten.
- Es wird empfohlen, dass die App beim Start der App eine Klasseninstanz erstellt
CMPConsentTool
. Sobald dies erstellt wurde, zeigt das SDK bei Bedarf automatisch den Zustimmungsbildschirm an. - Wenn die App personenbezogene Daten verarbeiten möchte, sollte sie das SDK "fragen", ob die Zustimmung für den jeweiligen Zweck und Anbieter erteilt wurde.
Installation
Seit Version 1.7.0 wurde das SDK-Repository in das offizielle Maven-Repository verschoben. Den Migrationsleitfaden finden Sie hier hier
Gradle
Fügen Sie die Abhängigkeit zu build.gradle Ihrer App hinzu. (Um immer die neueste Version zu erhalten, verwenden Sie das +-Symbol, um die neuesten Updates zu erhalten. Sie können beispielsweise immer die neuesten Versionen für kleinere Updates bis 1.x.+ erhalten.)
dependencies {
implementation 'net.consentmanager.sdk:android:1.7.32'
}
Maven
Fügen Sie die Abhängigkeit zu build.gradle Ihrer App hinzu. (Um immer die neueste Version in Maven zu erhalten, können Sie verschiedene Methoden verwenden, um den Versionsbereich abzulehnen. Sie können sie nachschlagen hier )
<dependency>
<groupId>net.consentmanager.sdk</groupId>
<artifactId>android</artifactId>
<version>1.7.32</version>
</dependency>
Verwenden der Bibliothek
Berechtigungen
Für dieses SDK sind die folgenden Berechtigungen erforderlich. Stellen Sie sicher, dass Sie diese zu Ihrer AndroidManifest.xml hinzufügen:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Initiieren Sie ConsentTool
Mit dem App-Start (normalerweise Ihrer viewDidAppear-Funktion) müssen Sie eine Instanz der Klasse CMPConsentTool erstellen. Dadurch werden automatisch die erforderlichen Daten von unserem Server abgerufen und festgestellt, ob der Zustimmungsbildschirm angezeigt werden muss oder nicht. In diesem Fall zeigt das SDK an dieser Stelle automatisch den Zustimmungsbildschirm an, sammelt die Daten und stellt die Daten der App zur Verfügung. Die Instanz kann dann verwendet werden, um Zustimmungsdetails vom SDK abzurufen und in der App zu verwenden.
Um das ConsentTool zu initiieren, wechseln Sie zu Ihrer Zielklasse und erstellen Sie eine Instanz von CMPConsentTool wie unten gezeigt:
//...
import net.consentmanager.sdk.CMPConsentTool;
//...
public class MainActivity extends AppCompatActivity {
private CMPConsentTool consentTool;
//...
@Override
protected void onCreate(Bundle savedInstanceState) {
//..
consentTool = CMPConsentTool.createInstance(this, "D3M01D4A2B3C5", "delivery.consentmanager.net", "MyFavouriteApp", "");
}
//...
}
Um die Instanz von CMPConsentTool zu erstellen, müssen Sie die Instanz konfigurieren. Sie müssen die CODE-ID, die Serverdomäne, einen App-Namen und eine Sprache angeben. Die CODE-ID und die Serverdomäne finden Sie in Ihrem consentmanager Konto unter Menü> Code abrufen. Der App-Name kann verwendet werden, um verschiedene Apps in der zu unterscheiden consentmanager Berichterstattung. Für die Sprache können Sie entweder eine leere Zeichenfolge ("") zur automatischen Erkennung oder einen aus zwei Buchstaben bestehenden Sprachcode ("EN", "DE", "FR" usw.) verwenden.
Die Konfigurationswerte können auf verschiedene Arten eingefügt werden:
a) SDK-Konfiguration über CMPConfig
Fügen Sie Ihrem Code die folgenden Zeilen hinzu:
val config = CMPConfig.apply {
serverDomain = CMP_DOMAIN
appName = CMP_APP_NAME
language = LANG
id = CODE_ID
}
val consentTool = CMPConsentTool.createInstance(this, config);
b) SDK-Konfiguration über createInstance()
Fügen Sie Ihrem Code die folgende Zeile hinzu:
consentTool = CMPConsentTool.createInstance(this, "D3M01D4A2B3C5", "delivery.consentmanager.net", "MyFavouriteApp", "EN");
Verwenden des SDK
Auf Zustimmung prüfen
Um zu überprüfen, ob ein Anbieter oder ein Zweck eine Einwilligung hat, können Sie die beiden folgenden Methoden verwenden:
if(consentTool.hasPurposeConsent(this,"52",false))
{
if(consentTool.hasVendorConsent(this,"s26", false))
{
//do something with data
}
}
Beide Methoden hasPurposeConsent
und hasVendorConsent
erfordern zwei Parameter:
- id - Zeichenfolge der Hersteller- oder Zweck-ID. Bitte beachten Sie, dass Hersteller-IDs unterschiedliche Formate haben können ("123", "s123" und "c123") Menü> Anbieter und Menü> Zwecke in Ihrem consentmanager Konto.
- isIABVendor / isIABPurpose - Wenn der Anbieter oder Zweck ein Anbieter / Zweck ist, der dem IAB-TCF-Standard entspricht, müssen Sie ein true festlegen, andernfalls ein false.
Denken Sie daran: Alle Anbieter, die nicht zum IAB gehören, haben IDs, die mit einem "s" oder "c" beginnen (z. B. "s123"). Anbieter, die zum IAB gehören, haben IDs, die nicht mit einem "s" oder "c" beginnen.
Öffnen Sie den Zustimmungsbildschirm erneut
Damit der Benutzer die Auswahl ändern kann, können Sie einfach anrufen openCmpConsentToolView()
:
consentTool.openCmpConsentToolView(this);
Weitergabe von Zustimmungsinformationen an andere Quellen
In einigen Fällen kann eine native App Webansichten enthalten, um bestimmte Dinge wie Werbung oder Inhalte anzuzeigen. Verwenden Sie die folgende Funktion, um die Einwilligungsinformationen vom SDK an die Webansicht zu übertragen:
String consentData = CMPConsentTool.exportCMPData(this);
Dadurch werden die Zustimmungsinformationen und alle weiteren Daten exportiert, die vom CMP benötigt werden. Sie können diese Informationen dann an das CMP in Ihrer Webansicht übergeben, indem Sie sie der in der Webansicht aufgerufenen URL hinzufügen:
myWebView.loadURL("https://mywebsite.com/....#cmpimport=" + consentData);
Benutzerdefinierte Ereignislistener
Um zusätzliche Prozesslogik hinzuzufügen, können Sie Event Listener verwenden. Folgende Ereignis-Listener sind verfügbar:
Name |
Tritt auf
|
OnOpenCallback |
Listener für Ereignis beim Öffnen von CMP |
OnCMPCloseCallback |
Listener für Ereignis, wenn CMP geschlossen ist |
OnCMPNotOpenedCallback |
Listener für Ereignis, wenn CMP nicht geöffnet werden muss |
OnErrorCallback |
Listener für Event, wenn ein Fehler im Consent Management-Prozess auftritt. |
Zustimmung zum Importieren/Exportieren
Um die Einwilligung zu importieren oder zu exportieren, können Sie die Funktion verwenden exportCMPData(Kontextkontext) und importCMPData(Kontextkontext, String cmpData). Überprüfen Sie das folgende Beispiel:
// Importing consent data if you like
CMPConsentTool.importCMPData(this, "${your consentString}");
// Instantiate CMPConsentTool()
consentTool = CMPConsentTool.createInstance(...)
// ... Your code here ...
// Exporting Consent data
String consentString = CMPConsentTool.exportCMPData(this);
Der zu übergebende ConsentString sollte base64-codiert sein.
CMP SDK-Sequenzdiagramm
Gemeinsame Einstellungen
Das SDK legt die gemeinsamen Einstellungswerte für IAB TCF v1, IAB TCF v2, IAB USPrivacy und Google AC String fest. Diese Werte können mit dem folgenden Code gelesen werden:
Context mContext = getApplicationContext();
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
SharedPreferences.OnSharedPreferenceChangeListener mListener;
mListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
if (key.equals([Specific Consent Key])) {
// Update Consent settings
}
}
};
mPreferences.registerOnSharedPreferenceChangeListener(mListener);
Folgende Schlüssel sind definiert:
IAB-TCF v1 | |
IABConsent_CMPPresent |
Boolean : Auf true setzen, wenn in der Anwendung ein CMP vorhanden ist, das diese Spezifikation implementiert. Idealerweise so schnell wie möglich vom Publisher festgelegt, kann aber auch alternativ vom CMP festgelegt werden. |
IABConsent_SubjectToGDPR |
String 1 - (vorbehaltlich der DSGVO), 0 - (nicht vorbehaltlich der DSGVO), Null - unbestimmt (Standard vor der Initialisierung). Stimmt mit IAB OpenRTB GDPR Advisory überein. Beschlossen, String zu sein, um den Status "Nicht initialisiert" zu haben. |
IABConsent_ConsentString |
String : Zustimmungszeichenfolge |
IABConsent_ParsedPurposeConsents |
String (von "0" und "1") wobei das Zeichen an Position N den Zustimmungsstatus für die Zweck-ID N angibt, wie in der globalen Lieferantenliste definiert. Einverständniserklärung zur einfachen Überprüfung. Das erste Zeichen von links ist Zweck 1, ... |
IABConsent_ParsedVendorConsents |
String (von "0" und "1") wobei das Zeichen an Position N den Zustimmungsstatus für die Lieferanten-ID N angibt, wie in der globalen Lieferantenliste definiert. Einverständniserklärung zur einfachen Überprüfung. Das erste Zeichen von links ist Anbieter 1, ... |
IAB-TCF v2 | |
IABTCF_CmpSdkID |
Number : Die vorzeichenlose Ganzzahl-ID des CMP-SDK |
IABTCF_CmpSdkVersion |
Number : Die vorzeichenlose Ganzzahl-Versionsnummer des CMP SDK |
IABTCF_PolicyVersion |
Number : Die vorzeichenlose Ganzzahl, die die Version der TCF darstellt, an die sich diese Zustimmungen halten. |
IABTCF_gdprApplies |
Number :
Nicht gesetzt - unbestimmt (Standard vor der Initialisierung) |
IABTCF_PublisherCC |
String : Zweistelliger Alpha-3166-Code nach ISO 1-2 - Standard: AA (unbekannt) |
IABTCF_PurposeOneTreatment |
Number :
Standardeinstellung deaktivieren - Anbieter können diesen Wert verwenden, um zu bestimmen, ob eine Einwilligung für den Zweck erforderlich ist. |
IABTCF_UseNonStandardStacks |
Number :
|
IABTCF_TCString |
String : Vollständig codierter TC-String |
IABTCF_VendorConsents |
Binary String : Das '0' or '1' an Position n - woher nDie Indizierung beginnt um 0 - Gibt den Zustimmungsstatus für die Lieferanten-ID an n + 1; false und true beziehungsweise. z.B. '1' am Index 0 ist Zustimmung true für Lieferanten-ID 1
|
IABTCF_VendorLegitimateInterests |
Binary String : Das '0' or '1' an Position n - woher nDie Indizierung beginnt um 0 - Gibt den Status des berechtigten Interesses für die Lieferanten-ID an n + 1; false und true beziehungsweise. z.B. '1' am Index 0 ist berechtigtes Interesse festgestellt true für Lieferanten-ID 1
|
IABTCF_PurposeConsents |
Binary String : Das '0' or '1' an Position n - woher nDie Indizierung beginnt um 0 - gibt den Zustimmungsstatus für die Zweck-ID an n + 1; false und true beziehungsweise. z.B. '1' am Index 0 ist Zustimmung true für Zweck ID 1
|
IABTCF_PurposeLegitimateInterests |
Binary String : Das '0' or '1' an Position n - woher nDie Indizierung beginnt um 0 - gibt den Status des berechtigten Interesses für die Zweck-ID an n + 1; false und true beziehungsweise. z.B. '1' am Index 0 ist berechtigtes Interesse festgestellt true für Zweck ID 1
|
IABTCF_SpecialFeaturesOptIns |
Binary String : Das '0' or '1' an Position n - woher nDie Indizierung beginnt um 0 - Zeigt den Anmeldestatus für die ID der Sonderfunktion an n + 1; false und true beziehungsweise. z.B. '1' am Index 0 ist opt-in true für spezielle Feature-ID 1
|
IABTCF_PublisherRestrictions{ID} |
String ['0','1', or '2'] : Der Wert an der Position n - woher nDie Indizierung beginnt um 0 - Gibt den Publisher-Einschränkungstyp (0-2) für den Anbieter an n + 1;; (Siehe Publisher-Einschränkungstypen). z.B. '2' am Index 0 ist restriktionsart 2 für Lieferanten-ID 1 . {ID} bezieht sich auf die Zweck-ID. |
IABTCF_PublisherConsent |
Binary String : Das '0' or '1' an Position n - woher nDie Indizierung beginnt um 0 - Gibt den Status der Zweckgenehmigung für die Zweck-ID an n + 1 für den Verlag, da sie den Zwecken der globalen Lieferantenliste entsprechen; false und true beziehungsweise. z.B. '1' am Index 0 ist Zustimmung true für Zweck ID 1
|
IABTCF_PublisherLegitimateInterests |
Binary String : Das '0' or '1' an Position n - woher nDie Indizierung beginnt um 0 - Gibt den Status des berechtigten Zwecks des Zwecks für die Zweck-ID an n + 1 für den Verlag, da sie den Zwecken der globalen Lieferantenliste entsprechen; false und true beziehungsweise. z.B. '1' am Index 0 ist berechtigtes Interesse festgestellt true für Zweck ID 1
|
IABTCF_PublisherCustomPurposesConsents |
Binary String : Das '0' or '1' an Position n - woher nDie Indizierung beginnt um 0 - Gibt den Status der Zweckgenehmigung für die benutzerdefinierte Zweck-ID des Herausgebers an n + 1 für den Verlag; false und true beziehungsweise. z.B. '1' am Index 0 ist Zustimmung true für benutzerdefinierte Zweck ID 1
|
IABTCF_PublisherCustomPurposesLegitimateInterests |
Binary String : Das '0' or '1' an Position n - woher nDie Indizierung beginnt um 0 - Gibt den Status des berechtigten Zwecks des Zwecks für die benutzerdefinierte Zweck-ID des Herausgebers an n + 1 für den Verlag; false und true beziehungsweise. z.B. '1' am Index 0 ist berechtigtes Interesse festgestellt true für benutzerdefinierte Zweck ID 1
|
IAB USDatenschutz | |
IABUSPrivacy_String |
String : Stimmt mit IAB OpenRTB CCPA Advisory überein. Der String codiert alle Auswahlmöglichkeiten und Informationen. |
Google AC-String | |
IABTCF_AddtlConsent |
|
(Veraltet) Dynamische Inhaltsblockierung mit Platzhalter-WebView
Diese Funktion ist veraltet und wird in Zukunft entfernt. Der Grund für die Verwerfung ist, dass mit dem Aktivieren und Deaktivieren von Anbieter- und Zweck-APIs kein Platzhalter mehr erstellt werden muss. Sie können Ihre eigene Benutzeroberfläche und Ihre eigene Geschäftslogik hinzufügen und Anbieter dynamisch aktivieren und deaktivieren. Anstatt diese Funktion zu verwenden, sollten Sie die verwenden enableVendorList() und disableVendorList() Funktionen, um zu verwalten, welche Anbieter aktiviert oder deaktiviert sind, und erstellen Sie Ihre eigene Benutzeroberfläche, um diese Informationen dem Benutzer anzuzeigen.
Der Platzhalter viewObject kann implementiert werden, um die Funktionalität der dynamischen Inhaltsblockierung zu erhalten hier.Sie können die Ansicht mit der folgenden Methode erstellen:
CMPPlaceholder placeholderView = CMPConsentTool.createPlaceholder(getApplicationContext(),CMPPlaceholderParams
.ofVendor("${vendorId}"), new CMPPlaceholderEventListener() {
@Override
public void vendorAccepted(WebView view) {
//... Actions to trigger if Consent is accepted
// Like showing Youtube Video View
}
});
Mit dem Wrapper-Objekt CMPPlaceholderParams
Sie können auch optionale Parameter wie benutzerdefinierte Texte oder ein optionales Vorschaubild übergeben. Die Builder-Funktionen heißen setCustomplaceholder(String headline, String mainText, String checkboxText, String buttonText)
und setOptionalImageUrl(String imageUrl)
.
Die erforderliche Geschäftslogik, wenn Sie die Ansicht anzeigen möchten und wenn sie nicht vom Entwickler angewendet werden muss. Sie können erforderliche Bedingungen und Aktionen übergeben, indem Sie die EvenListener-Callbacks aus dem CMPPlaceholderEventlistener
. Die folgenden erforderlichen Ereignisse müssen implementiert werden:
Erforderlich: vendorAccepted(CMPPlaceholderView view) { // Your logic }
Optional: errorOccurred(String message) { // Error handling }
Protokollierung
Wenn Sie unser Android SDK verwenden, müssen Sie möglicherweise für verschiedene Zwecke Protokollinformationen debuggen oder analysieren. Die von unserem SDK generierten Protokolle sind mit „CMP“ gekennzeichnet, sodass Sie einfach nur die relevanten Protokolle filtern und anzeigen können. Diese Anleitung enthält Schritt-für-Schritt-Anleitungen für den Zugriff auf diese Protokolle mit Logcat in Android Studio.
Suchen Sie nach dem Tag: Geben Sie in die Suchleiste über den Protokollanweisungen ein CMP
um die mit „CMP“ gekennzeichneten Protokolle herauszufiltern.
Optional: Aktivieren Sie den Debug-Modus
In CMPConfig
, einstellen isDebugMode = true
.
val config = CMPConfig.apply {
// ... other settings
isDebugMode = true
}
- Ermöglicht detailliertere Protokolle mit dem Tag „CMP“.
- Nützlich zum Debuggen und Analysieren.
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;
#}