[Android] 0. Przewodnik po migracji

Ten przewodnik pomoże Ci przejść z poprzedniej wersji CMP SDK na aktualną. Omówimy zmiany w nazwach metod, parametrach oraz nowych lub wycofanych funkcjach. Przykłady aplikacji demonstracyjnych znajdziesz pod tym linkiem. Są tam dwa foldery: jeden z aplikacją demonstracyjną w całości napisaną w Javie, zawierającą nakładkę na Javę o nazwie JavaCMPManager druga, w całości napisana w Kotlinie. 

Należy pamiętać, że ta wersja CMP SDK została całkowicie przebudowana od podstaw, co stanowi znaczącą zmianę, ponieważ wszystkie metody zostały przemianowane, podobnie jak sygnatury, a obecnie oferują one również wywołania zwrotne dla prawie wszystkich metod. We wszystkich przypadkach konieczne będzie zmodyfikowanie kodu i aktualizacja zależności, aby zapewnić oczekiwane działanie aplikacji mobilnej. Ponadto warto wspomnieć, że wszystkie dane zapisane przez poprzednią wersję naszego SDK na urządzeniach użytkowników zostaną usunięte, co spowoduje, że aplikacja ponownie wyświetli warstwę zgody.

Repozytoria

Pamiętaj, że wszystkie nasze repozytoria uległy zmianie w przypadku SDK dla Androida. Postępuj zgodnie z poniższymi instrukcjami, aby dowiedzieć się, gdzie skierować menedżera zależności. 

Maven

W pliku Gradle zastąp poprzednią linię poniższą:

implementation("net.consentmanager.sdkv3:cmsdkv3:3.2.0")

Po wprowadzeniu zmian zsynchronizuj projekt. 

Kluczowe punkty migracji

  1. Wzorzec delegata: Zamiast indywidualnych słuchaczy, nowa wersja wykorzystuje pojedynczy protokół delegata (CMPManagerDelegate) do obsługi zdarzeń. Zawiera 4 główne zdarzenia:
    1. didReceiveConsent(consent: String, jsonObject: Map<String, Any>)
      Jest to wyzwalane, gdy warstwa zgody została zamknięta po zaktualizowaniu przez użytkownika swoich zgód LUB podczas wywoływania metod powodujących zmiany w zgodach, takich jak acceptAll, rejectAll, acceptVendors, rejectVendors itp. Oznacza to, że użytkownik zaakceptował lub odrzucił część lub wszystkie zgody i że zostały one poprawnie zapisane w urządzeniu.
    2. didShowConsentLayer
      Zostaje to wywołane, gdy warstwa zgody została faktycznie wyświetlona. Oznacza to, że w urządzeniu nie było ważnej zgody, więc należy zebrać nową.
    3. didCloseConsentLayer
      Zostaje to wywołane, gdy SDK sprawdziło potrzebę uzyskania zgody, ale nie była ona wymagana i warstwa nie została wyświetlona. Oznacza to, że w urządzeniu istnieje już ważna zgoda, więc nowa nie jest konieczna, a warstwa zgody nie zostanie wyświetlona.
    4. didReceiveError
      Zostaje to wywołane, gdy operacja SDK wygenerowała jakikolwiek błąd.
  2. Obsługa zakończenia: Wiele metod zawiera teraz procedury obsługi zakończenia dla operacji asynchronicznych. Zaktualizuj swój kod, aby odpowiednio obsługiwać te wywołania zwrotne.
  3. Tekst zgody: Użyj exportCMPInfo() zamiast getConsentString() , aby pobrać informacje dotyczące zgody.
  4. Zgody dostawców i zgody na cele: Metody uzyskiwania zgód dostawców i zgód na cele zwracają teraz tablice identyfikatorów. Być może konieczne będzie dostosowanie logiki w celu obsługi tych tablic.
  5. Ciąg dotyczący prywatności w USA: getUSPrivacyString() metoda została wycofana. Jeśli korzystałeś z niej w celu zapewnienia zgodności z CCPA, pamiętaj, że ta metoda nie jest już dostępna.
  6. Sprawdzenie wymogu zgody: Użyj nowej checkAndOpen(completion:) metody, aby automatycznie ustalić, czy wymagana jest zgoda, zanim wyświetlisz okienko z prośbą o zgodę.

Zmiany metod i podpisów

Inicjalizacja
  • Stare: CmpManager.initialize(context: Context, cmpConfig: CmpConfig)
  • Nowość: CmpManager.createInstance(context: Context, cmpConfig: CmpConfig)
Ustaw konfigurację interfejsu użytkownika
  • Stare: .withCmpViewControllerConfigurationBlock { ... }
  • Nowość: Opcja ta nie jest dostępna, ale możesz utworzyć aktywność typu wrapper i kontrolować cykl życia oraz wygląd po swojej stronie kodu.
Sprawdzanie zgody
  • Stare: check({ ... }, isCached: Bool),
  • Nowość: checkAndOpen(completion: (Error?) -> Void)
Sprawdzanie i otwieranie warstwy zgody w razie potrzeby
  • Poprzednio: checkAndOpenConsentLayer()
  • Nowość: checkAndOpen(completion: (Error?) -> Void)
Otwarta warstwa zgody
  • Stare: openConsentLayer()
  • Nowość: forceOpen(completion: (Result<Unit>) -> Unit)
Zaakceptuj wszystkie zgody
  • Stare: acceptAll(callback: ConsentCallback)
  • Nowość: cceptAll(completion: (Result<Unit>) -> Unit)
Odrzuć wszystkie zgody
  • Stare: rejectAll(onFinish: () -> Unit)
  • Nowość: rejectAll(completion: (Result<Unit>) -> Unit)
Włącz cele
  • Stare: enablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nowość: acceptPurposes(purposes: List<String>, updatePurpose: Boolean, completion: (Result<Unit>) -> Unit)
Wyłącz cele
  • Stare: disablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nowość: rejectPurposes(purposes: List<String>, updateVendor: Boolean, completion: (Result<Unit>) -> Unit)
Włącz dostawców
  • Stare: enableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nowość: acceptVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Wyłącz dostawców
  • Stare: disableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nowość: rejectVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Uzyskaj wszystkie cele
  • Stare: getAllPurposes(): List<String>
  • Nowość: getAllPurposesIDs(): List<String>
Cele wdrożenia
  • Stare: getEnabledPurposes(): List<String>
  • Nowość: getUserStatus(): UserConsentStatus
Pobierz wszystkich dostawców
  • Stare: getAllVendors(): List<String>
  • Nowość: getUserStatus(): UserConsentStatus
Znajdź zatwierdzonych dostawców
  • Stare: getEnabledVendors(): List<String>
  • Nowość: getUserStatus(): UserConsentStatus
Sprawdź cel zgody
  • Stare: hasPurposeConsent(String): Boolean
  • Nowość: getStatusForPurpose(id: String): ConsentStatus
Sprawdź zgodę dostawcy
  • Stare: hasVendorConsent(String): Boolean
  • Nowość: getStatusForVendor(id: String): ConsentStatus
Eksportuj ciąg CMP
  • Stare: exportCmpString() : String
  • Nowość: exportCMPInfo(): String
Importuj ciąg CMP
  • Stare: importCmpString(consentString: String, completionHandler: ((Error?) -> Unit)?)
  • Nowość: importCMPInfo(cmpString: String, completion: (Result<Unit>) -> Unit)
Zresetuj dane dotyczące zgody
  • Stare: reset()
  • Nowość: resetConsentManagementData(completion: (Result<Unit>) -> Unit)
Postępowanie w trybie zgody Google
  • Poprzednio: withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface)
  • Nowość: getGoogleConsentModeStatus
Obsługa wywołania zwrotnego onLinkClick
  • Stara wersja: w wersji 2 dostępna była funkcja białej listy. W obecnej wersji proces został uproszczony, a użytkownik ma pełną kontrolę nad zachowaniem, które ma zostać zastosowane w zależności od adresu URL zwracanego przez metodę.
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
})
  • Nowość: Użytkownik ma pełną kontrolę nad tym, jakie zachowanie zastosować w zależności od adresu URL. W związku z tym poprzednie adresy URL z białej listy powinny zostać przeniesione do metody wywołania zwrotnego,
        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
            }
        }

 

Metody przestarzałe:

  • 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)

Przykłady migracji

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) {

    }
}

 

We do our best to keep this purely informative documentation up to date. However, if you notice that any of these guides need a little touch-up, let us know!