I detta dokument hittar du allmän information om hur du integrerar vårt SDK i ditt projekt. För mer information, se vår API-referensdokumentation. Alla kodutdrag nedan är hämtade från vår demoapp.
1. Installation
consentmanager SDK är en heltäckande lösning för hantering av användarens samtycke i mobilapplikationer. Detta SDK är utformat för att hantera GDPR-efterlevnad, användarnas integritetsinställningar och transparens i annonsspårning, och erbjuder en smidig integration för iOS- och Android-plattformar. Dessutom erbjuder det wrapper-plugins/bryggor för React Native, Flutter och Unity, vilket gör det mångsidigt i olika utvecklingsmiljöer.
Steg – Översiktlig beskrivning
-
Integration och konfiguration:
- Integrera SDK i din app.
- Konfigurera SDK-inställningarna efter dina behov.
-
Skapa en instans och visa samtyckeslagret:
- När appen startas, skapa en instans av klassen
CMPManagerklassen. Denna instans hanterar samtyckesprocessen. - SDK:t visar automatiskt samtyckesskärmen om det behövs.
- När appen startas, skapa en instans av klassen
-
Behandling av användarnas samtyckesdata:
- När samtycken har samlats in lagras informationen och kan hämtas via olika egenskaper och metoder som tillhandahålls av vårt SDK. Du får information om avvisade eller godkända samtycken, leverantörer och syften.
1.1 Integration och konfiguration
Lägga till beroende via Gradle
Lägg till följande rad i din build.gradle-fil:
dependencies {
implementation "net.consentmanager.sdkv3:cmsdkv3:3.2.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 klassen CMPManager. Du måste konfigurera två objekt som kommer att skickas till metoden getInstance: UrlConfig, som hanterar din CMP-konfiguration, såsom Code-ID och standardspråk, och ConsentLayerUIConfig. som kommer att konfigurera utseendet på WebView som visar samtyckeslagret. Därefter skickar du den aktuella Activity med hjälp av metoden setActivityoch tilldela delegaten, som visas nedan. I exemplet nedan kan du se båda objekten som skickas. checkAndOpen() funktionen hämtar automatiskt nödvändiga data från vår server och avgör om samtyckesskärmen behöver visas eller inte. Om så är fallet visar SDK automatiskt samtyckesskärmen vid denna punkt, via en WebView skapad av vårt SDK, som visar samtyckeslagret med text och knappar enligt dina CMP-konfigurationer (valda via din CMP:s Code-ID), samlar in data och lagrar samtyckesinformationen i enhetens NSUserDefaults-område, så att appen kan visa riktade annonser därefter.
Observera att det är avgörande att deklarera och initialisera CMPManager SDK i onCreate metoden, annars kanske vyn inte är klar att användas och SDK kan misslyckas. Observera även singleton-mönstret, så att du endast har en instans av SDK. Se också till att du använder rätt konfigurationsdata. Konfigurationsdata finns i ditt ConsentManager-konto under Meny > CMP:er > Hämta kod för appar > Kod-ID
Observera också att funktionerna för att avgöra om samtycke krävs eller inte, liksom visningen av samtyckeslagret, är beroende av en pålitlig nätverksanslutning. Om det inte finns någon anslutning tillgänglig eller om mekanismen för omförsök inte når vår server, kommer händelsen didReceiveError att returnera ett timeout-fel, och därmed kommer SDK:t att vara helt oförmöget att avgöra behovet av samtycke, eftersom det kommer att vara helt oförmöget att visa samtyckeslagret. Se till att din logik tar hänsyn till detta.
Exempel:
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)
checkAndOpen()
}
private fun checkAndOpenConsentLayer() {
cmpManager.checkAndOpen { 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")
}
}
1.3 Behandling av användarnas samtyckesuppgifter
Kontrollera användarnas samtycke
Our SDK offer a unified method to check and retrieve consent information,getUserStatus()
:
val status = cmpManager.getUserStatus()
Log.d("CMPDemo", "User Status: ${status.hasUserChoice}")
Log.d("CMPDemo", "TCF: ${status.tcf}")
Log.d("CMPDemo", "Additional Consent: ${status.addtlConsent}")
Log.d("CMPDemo", "Regulation: ${status.regulation}")
Log.d("CMPDemo", "---- Vendors Status ----")
status.vendors.forEach { (vendorId, choice) ->
Log.d("CMPDemo", "Vendor $vendorId: $choice")
}
Log.d("CMPDemo", "---- Purposes Status ----")
status.purposes.forEach { (purposeId, choice) ->
Log.d("CMPDemo", "Purpose $purposeId: $choice")
}
För mer information om de andra metoderna, se vår fullständiga API-dokumentation.
Öppna Consent Layer igen för att kontrollera användarnas val
För att användaren ska kunna kontrollera eller ändra sina val kan du helt enkelt anropa openConsentLayer()
cmpManager.forceOpen()
Denna metod visar 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 native-app innehålla webbvyer för att visa information, såsom reklam eller innehåll. För att överföra samtyckesinformationen från SDK till webbvyn kan du hämta samtyckessträngen med hjälp av:
consentData = cmpManager.exportCMPInfo()
Detta exporterar samtyckesinformationen och all ytterligare data som behövs av CMP. Du kan sedan vidarebefordra denna information till CMP som finns i din webbvy genom att lägga till den i den URL som anropas i webbvyn.
Om du istället behöver importera samtyckestexten med hjälp av SDK 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 dess utseende och livscykel. För mer information, se den officiella dokumentationen.
Inloggning
När du använder vårt iOS SDK kan du behöva felsöka eller analysera logginformation för olika ändamål. Loggarna som genereras av vårt SDK är taggade under "CMP", vilket gör att du enkelt kan filtrera och visa endast de relevanta loggarna. För mer information, se detta avsnitt i vår dokumentation.
Felsökning
Class Not Found eller NoSuchMethodException:
ProGuard kan ibland dölja klassnamn eller ta bort metoder som refereras dynamiskt via reflektion. För att åtgärda detta måste du ange de klasser och metoder som ska behållas intakta i ProGuard-konfigurationsfilen med hjälp av -keep direktivet.
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;
#}