[Android] 0. Migrationsguide
Den här guiden hjälper dig att migrera från den tidigare versionen av CMP SDK till den nuvarande versionen. Vi kommer att täcka ändringar i metodnamn, parametrar och ny eller föråldrad funktionalitet. För exempel på demoappar, kolla denna länk. Det finns två mappar, en med en demo-app helt utvecklad i Java, inklusive ett omslag för Java som heter JavaCMPManager
en annan helt utvecklad i Kotlin.
Var medveten om att den här versionen av CMP SDK byggdes om helt från grunden, och därför representerar den en stor brytande förändring, eftersom alla metoder döptes om, liksom signaturerna, och erbjuder nu återuppringningar till nästan alla metoder. I samtliga fall, måste du ändra din kod och uppdatera dina beroenden för att säkerställa att din mobilapp fungerar som förväntat. Dessutom är det värt att nämna det all data som finns kvar av den tidigare versionen av vår SDK på användarnas enheter kommer att raderas, vilket kommer att tvinga appen att visa samtyckesskiktet igen.
arkiv
Observera att alla våra arkiv har ändrats för Android SDK. Följ instruktionerna nedan för att ta reda på var du ska peka din beroendehanterare.
Maven
På din Gradle-fil, ersätt den föregående raden med den nedan:
implementation("net.consentmanager.sdkv3:cmsdkv3:3.2.0")
Synkronisera ditt projekt när du har ändrat.
Viktiga migrationspunkter
-
Delegatmönster: Istället för enskilda lyssnare använder den nya versionen ett enda delegatprotokoll (
CMPManagerDelegate
) för att hantera händelser. Den innehåller 4 huvudhändelser:-
didReceiveConsent(consent: String, jsonObject: Map<String, Any>)
Detta utlöses när samtyckeslagret stängdes efter att användaren uppdaterat sina samtycken ELLER när man åberopar metoder som orsakar ändringar i samtyckena, som acceptAll, rejectAll, acceptVendors, rejectVendors, etc. Det betyder att användaren accepterade eller avvisade några av alla. av samtyckena och att dessa sparades korrekt i enheten. -
didShowConsentLayer
Detta utlöses när samtyckeslagret faktiskt visades. Det betyder att det inte fanns ett giltigt samtycke i enheten, så ett nytt bör hämtas. -
didCloseConsentLayer
Detta utlöses när SDK:n kontrollerade behovet av ett samtycke, men det behövdes inte och lagret visades inte. Det betyder att det redan finns en giltig i enheten, så en ny är inte nödvändig och tue samtyckeslager kommer inte att visas. -
didReceiveError
Detta utlöses när SDK-operationen har orsakat något fel.
-
- Kompletteringshanterare: Många metoder inkluderar nu kompletteringshanterare för asynkrona operationer. Uppdatera din kod för att hantera dessa återuppringningar på rätt sätt.
-
Samtyckessträng: Använda
exportCMPInfo()
istället förgetConsentString()
för att hämta samtyckesinformationen. - Säljarens samtycke: Metoderna för att få tillstånd från leverantörer och ändamål returnerar nu arrayer av ID:n. Du kan behöva justera din logik för att hantera dessa arrayer.
-
USA:s sekretesssträng: Ocuco-landskapet
getUSPrivacyString()
metoden har fasats ut. Om du använde detta för CCPA-efterlevnad, observera att den här metoden inte är tillgänglig längre. -
Kontroll av samtyckeskrav: Använd det nya
checkAndOpen(completion:)
metod för att automatiskt avgöra om samtycke behövs innan samtyckesskiktet visas.
Metoder och signaturer ändras
Initieringen
- Old:
CmpManager.initialize(context: Context, cmpConfig: CmpConfig)
- Ny:
CmpManager.createInstance(context: Context, cmpConfig: CmpConfig)
Ställ in UI-konfiguration
- Old:
.withCmpViewControllerConfigurationBlock { ... }
- Nytt: Alternativet tillhandahålls inte, men du kan skapa en omslagsaktivitet och kontrollera livscykeln och utseendet i slutet av koden.
Kontrollera samtycke
- Old:
check({ ... }, isCached: Bool)
, - Ny:
checkAndOpen(completion: (Error?) -> Void)
Kontrollera och öppna samtyckeslagret vid behov
- Old:
checkAndOpenConsentLayer()
- Ny:
checkAndOpen(completion: (Error?) -> Void)
Öppna samtyckeslager
- Old:
openConsentLayer()
- Ny:
forceOpen(completion: (Result<Unit>) -> Unit)
Godkänn alla samtycken
- Old:
acceptAll(callback: ConsentCallback)
- Ny:
cceptAll(completion: (Result<Unit>) -> Unit)
Avvisa alla samtycken
- Old:
rejectAll(onFinish: () -> Unit)
- Ny:
rejectAll(completion: (Result<Unit>) -> Unit)
Aktivera syften
- Old:
enablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
- Ny:
acceptPurposes(purposes: List<String>, updatePurpose: Boolean, completion: (Result<Unit>) -> Unit)
Inaktivera syften
- Old:
disablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
- Ny:
rejectPurposes(purposes: List<String>, updateVendor: Boolean, completion: (Result<Unit>) -> Unit)
Aktivera leverantörer
- Old:
enableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
- Ny:
acceptVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Inaktivera leverantörer
- Old:
disableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
- Ny:
rejectVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Få alla syften
- Old:
getAllPurposes(): List<String>
- Ny:
getAllPurposesIDs(): List<String>
Få aktiverade syften
- Old:
getEnabledPurposes(): List<String>
- Ny:
getUserStatus(): UserConsentStatus
Hämta alla leverantörer
- Old:
getAllVendors(): List<String>
- Ny:
getUserStatus(): UserConsentStatus
Få aktiverade leverantörer
- Old:
getEnabledVendors(): List<String>
- Ny:
getUserStatus(): UserConsentStatus
Kontrollera Syfte Samtycke
- Old:
hasPurposeConsent(String): Boolean
- Ny:
getStatusForPurpose(id: String): ConsentStatus
Kontrollera leverantörens samtycke
- Old:
hasVendorConsent(String): Boolean
- Ny:
getStatusForVendor(id: String): ConsentStatus
Exportera CMP-sträng
- Old:
exportCmpString() : String
- Ny:
exportCMPInfo(): String
Importera CMP-sträng
- Old:
importCmpString(consentString: String, completionHandler: ((Error?) -> Unit)?)
- Ny:
importCMPInfo(cmpString: String, completion: (Result<Unit>) -> Unit)
Återställ samtyckesdata
- Old:
reset()
- Ny:
resetConsentManagementData(completion: (Result<Unit>) -> Unit)
Hanterar status för Googles samtyckesläge
- Old:
withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface)
- Ny:
getGoogleConsentModeStatus
Hantera onLinkClick-återanropet
- Gammal: v2 hade tidigare en funktion för vitlistning. I den nuvarande versionen har processen förenklats och användaren har full kontroll över beteendet som ska följas enligt URL:en som returneras från metoden.
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
})
- Nytt: Användaren har full kontroll över vilket beteende som ska följas enligt URL:en. Därför bör de tidigare vitlistade URL:erna migreras till insidan av callback-metoden.
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
}
}
Föråldrade metoder:
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)
Migrationsexempel
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")
}
}
java
// ===================================================
// 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) {
}
}