[Android] 1. consentmanager SDK-integration
I det här dokumentet hittar du allmän information om hur du integrerar vår SDK i ditt projekt. För ytterligare information, se vår API-referens dokumentation.
1. Installation
consentmanager SDK är en heltäckande lösning för att hantera användarsamtycke i mobilapplikationer. Designad för att hantera GDPR-efterlevnad, användarnas integritetspreferenser och insyn i annonsspårning, ger denna SDK en sömlös integration för iOS- och Android-plattformar. Dessutom erbjuder den omslagsplugins/bryggor för React Native, Flutter och Unity, vilket gör den mångsidig i olika utvecklingsmiljöer.
Steg - Beskrivning på hög nivå
-
Integration och konfiguration:
- Integrera SDK:n i din app.
- Konfigurera SDK-inställningarna efter dina behov.
-
Skapa en instans och visa samtyckeslagret:
- Vid appstart skapar du en instans av
CMPManager
klass. Denna instans kommer att hantera samtyckesprocessen. - SDK:n visar automatiskt samtyckesskärmen vid behov.
- Vid appstart skapar du en instans av
-
Bearbetar användarens samtyckesdata:
- När samtycken har samlats in lagras informationen och är tillgänglig för frågor genom olika egenskaper och metoder som exponeras av vår SDK. Du kommer att ha information om avvisade eller accepterade samtycken, leverantörer och syften.
1.1 Integration och konfiguration
Lägger till beroende via Gradle
Lägg till följande rad i din build.gradle-fil:
dependencies {
implementation "net.consentmanager.sdkv3:cmsdkv3:3.0.0"
}
Synkronisera sedan ditt projekt.
1.2 Skapa en instans och visa samtyckeslager
Inom app-start (din onCreate
funktion), måste du skapa en instans av klass CMPManager
. Du måste ställa in två objekt som skickas till getInstance-metoden: UrlConfig
, som hanterar din CMP-konfiguration, som kod-ID och standardspråk, och ConsentLayerUIConfig
. som kommer att konfigurera utseendet på WebView som visar samtyckeslagret. Efter det kommer du att passera strömmen Activity
använda metoden setActivity
, och tillskriv delegaten, som visas nedan. I exemplet nedan kan du hitta båda objekten som passeras. De checkWithServerAndOpenIfNecessary()
funktionen hämtar automatiskt nödvändig information från vår server och avgör om samtyckesskärmen måste visas eller inte. Om så är fallet kommer SDK automatiskt att visa samtyckesskärmen vid denna tidpunkt, via en WebView
skapad av vår SDK, som kommer att visa samtyckeslagret med text och knappar enligt dina CMP-konfigurationer (valda via kod-ID för din CMP), samla in data och bevara samtyckesinformationen i NSUserDefaults-området på enheten, så appen kan visa de riktade annonserna därefter.
Observera att det är viktigt att deklarera och initiera CMPManager
SDK i onCreate
metod, annars kanske vyn inte är redo att användas och SDK:n kan misslyckas. Se också till att du använder rätt konfigurationsdata. Konfigurationsdata finns i din consentmanager konto på Meny > CMPs > Hämta kod för appar > Kod-ID
Observera också att funktionerna för att avgöra om samtycke behövs eller inte, liksom visningen av samtyckesskiktet, beror på en tillförlitlig nätverksanslutning. Om det inte finns någon tillgänglig anslutning eller om mekanismen för ett nytt försök misslyckas med att nå vår server, kommer didReceiveError-händelsen att returnera ett timeout-fel, och så SDK:n kommer att vara helt oförmögen att avgöra behovet av ett samtycke, eftersom det kommer att vara helt oförmöget att visa samtyckeslagret. Se till att din logik tar hänsyn till detta.
Exempelvis:
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 Behandling av användarnas samtyckesdata
Kontrollera användarnas samtycke
Vår SDK erbjuder olika metoder för att kontrollera och hämta samtyckesinformation. De viktigaste metoderna visas i exemplet nedan:
// 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"
För ytterligare information om de andra metoderna, se vår fullständiga API-dokumentation.
Öppna samtyckeslagret igen för att kontrollera användarnas val
För att tillåta användaren att verifiera eller ändra sina val kan du helt enkelt ringa openConsentLayer()
cmpManager.openConsentLayer()
Den här metoden kommer att visa samtyckeslagret via samma WebView-instans som skapades i de föregående stegen.
Importera/exportera samtyckesinformation till andra källor
I vissa fall kan en inbyggd app innehålla webbvisningar för att visa information, som reklam eller innehåll. För att överföra samtyckesinformationen från SDK till webbvyn kan du hämta samtyckessträngen med:
consentData = cmpManager.exportCMPInfo()
Detta kommer att exportera samtyckesinformationen och all ytterligare data som behövs av CMP. Du kan sedan skicka denna information till den CMP som finns i din webbvy genom att lägga till den i den URL som anropas i webbvyn.
Om du annars behöver importera samtyckessträngen med SDK:n kan du använda exemplet nedan:
val consentStringToImport = "Q1FERkg3QVFERkg3QUFmR01CSVRCQkVnQUFBQUFBQUFBQWlnQUFBQUFBQUEjXzUxXzUyXzUzXzU0XzU1XzU2XyNfczI3ODlfczI3OTBfczI3OTFfczI2OTdfczk3MV9VXyMxLS0tIw"
cmpManager.importCMPInfo(consentStringToImport)
Skapa en anpassad layout
För att skapa en anpassad vy av WKWebView kan du skapa en wrapper för ComponentActivity som måste skickas till CMP SDK, så att du har full kontroll över utseendet och livscykeln för den. För ytterligare information, se officiell dokumentation.
Loggning
När du använder vår iOS SDK kan du behöva felsöka eller analysera logginformation för olika ändamål. Loggarna som genereras av vår SDK är taggade under "CMP", vilket gör att du enkelt kan filtrera och bara visa relevanta loggar. För ytterligare information, se Den här delen av vår dokumentation.
Felsökning
Class Not Found eller NoSuchMethodException:
ProGuard kan ibland fördunkla klassnamn eller ta bort metoder som refereras dynamiskt via reflektion. För att fixa detta måste du ange klasserna och metoderna som ska hållas intakta i ProGuard-konfigurationsfilen med -keep
Direktiv.
Exempel på ProGuard-konfiguration för att behålla en specifik klass och dess metoder:
# 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;
#}