Informacia
Treść

[Android] 0. Przewodnik migracji

Ten przewodnik pomoże Ci przeprowadzić migrację z poprzedniej wersji CMP SDK do obecnej wersji. Omówimy zmiany w nazwach metod, parametrach i nowych lub wycofanych funkcjach. Przykłady aplikacji demonstracyjnych znajdziesz tutaj pod tym linkiem. Są dwa foldery, jeden z aplikacją demonstracyjną całkowicie opracowaną w Javie, zawierającą opakowanie dla Javy o nazwie JavaCMPManager inny całkowicie napisany w Kotlinie. 

Należy pamiętać, że ta wersja pakietu CMP SDK została całkowicie przebudowana od podstaw, dlatego stanowi ona istotna zmiana, ponieważ zmieniono nazwy wszystkich metod, zmieniono nazwy sygnatur, a teraz można też skorzystać z wywołań zwrotnych do niemal wszystkich metod. We wszystkich przypadkach, musisz zmodyfikować swój kod i zaktualizować zależności, aby mieć pewność, że Twoja aplikacja mobilna działa zgodnie z oczekiwaniami. My również zdecydowanie radzę aby poprosić użytkowników o odinstalowanie i ponowną instalację aplikacji mobilnej w celu uniknięcia problemów z danymi przechowywanymi na urządzeniu.

Repozytoria

Należy pamiętać, że wszystkie nasze repozytoria zostały zmienione dla Android SDK. Postępuj zgodnie z poniższymi instrukcjami, aby dowiedzieć się, gdzie skierować swojego menedżera zależności. 

Maven

W pliku Gradle zamień poprzedni wiersz na poniższy:

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

Po dokonaniu zmiany zsynchronizuj projekt. 

Kluczowe punkty migracji

  1. Wzór delegata: Zamiast pojedynczych słuchaczy nowa wersja wykorzystuje pojedynczy protokół delegata (CMPManagerDelegate) do obsługi zdarzeń. Zawiera 4 główne zdarzenia:
    1. didReceiveConsent(consent: String, jsonObject: [String : Any])
      Wyzwala się, gdy warstwa zgody została zamknięta po zaktualizowaniu przez użytkownika swoich zgód LUB podczas wywołania metod powodujących zmiany w zgodach, takich jak acceptAll, rejectAll, acceptVendors, rejectVendors itd. Oznacza to, że użytkownik zaakceptował lub odrzucił część lub wszystkie zgody, a także że zostały one prawidłowo zapisane na urządzeniu.
    2. didShowConsentLayer
      Wyzwala się, 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
      Wyzwalane jest, gdy SDK sprawdza potrzebę zgody, ale nie była ona potrzebna i warstwa nie była wyświetlana. Oznacza to, że w urządzeniu jest już prawidłowa, więc nowa nie jest konieczna i warstwa zgody nie zostanie wyświetlona.
    4. didReceiveError
      Wyzwalane jest to w przypadku, gdy operacja SDK zgłosi błąd.
  2. Osoby odpowiedzialne za realizację: Wiele metod obejmuje teraz obsługę ukończenia dla operacji asynchronicznych. Zaktualizuj swój kod, aby odpowiednio obsługiwać te wywołania zwrotne.
  3. Ciąg zgody: Zastosowanie exportCMPInfo() zamiast getConsentString() aby pobrać informacje o zgodzie.
  4. Zgody na dostawcę i cel: Metody uzyskiwania zgód dostawcy i celu zwracają teraz tablice identyfikatorów. Może być konieczne dostosowanie logiki do obsługi tych tablic.
  5. Łańcuch prywatności w USA: Kurs getUSPrivacyString() metoda została wycofana. Jeśli używałeś jej w celu zachowania zgodności z CCPA, pamiętaj, że ta metoda nie jest już dostępna.
  6. Weryfikacja wymogu zgody: Użyj nowego checkIfConsentIsRequired(completion:) metoda automatycznego określania, czy zgoda jest wymagana przed wyświetleniem warstwy zgody.

Zmiany metod i podpisów

1. Inicjalizacja
  • Stary: CmpManager.initialize(context: Context, cmpConfig: CmpConfig)
  • Nowość: CmpManager.createInstance(context: Context, cmpConfig: CmpConfig)
2. Ustaw konfigurację interfejsu użytkownika
  • Stary: .withCmpViewControllerConfigurationBlock { ... }
  • Nowość: Opcja ta nie jest dostępna, ale możesz utworzyć aktywność opakowującą i kontrolować cykl życia oraz wygląd kodu po swojej stronie.
3. Sprawdzanie zgody
  • Stary: check({ ... }, isCached: Bool),
  • Nowość: checkIfConsentIsRequired(completion: (Error?) -> Void)
3. Sprawdzanie i otwieranie warstwy zgody, jeśli to konieczne
  • Stary: checkAndOpenConsentLayer()
  • Nowość: checkWithServerAndOpenIfNecessary(completion: (Error?) -> Void)
  • Stary: openConsentLayer()
  • Nowość: openConsentLayer(completion: (Result<Unit>) -> Unit)
5. Zaakceptuj wszystkie zgody
  • Stary: acceptAll(callback: ConsentCallback)
  • Nowość: cceptAll(completion: (Result<Unit>) -> Unit)
6. Odrzuć wszystkie zgody
  • Stary: rejectAll(onFinish: () -> Unit)
  • Nowość: rejectAll(completion: (Result<Unit>) -> Unit)
7. Włącz cele
  • Stary: enablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nowość: acceptPurposes(purposes: List<String>, updatePurpose: Boolean, completion: (Result<Unit>) -> Unit)
8. Wyłącz cele
  • Stary: disablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nowość: rejectPurposes(purposes: List<String>, updateVendor: Boolean, completion: (Result<Unit>) -> Unit)
9. Włącz dostawców
  • Stary: enableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nowość: acceptVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
10. Wyłącz dostawców
  • Stary: disableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nowość: rejectVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
11. Zdobądź wszystko
  • Stary: getAllPurposes(): List<String>
  • Nowość: getAllPurposesIDs(): List<String>
12. Uzyskaj włączone cele
  • Stary: getEnabledPurposes(): List<String>
  • Nowość: getEnabledPurposesIDs(): List<String>
13. Pobierz wszystkich dostawców
  • Stary: getAllVendors(): List<String>
  • Nowość: getAllVendorsIDs(): List<String>
14. Uzyskaj włączonych dostawców
  • Stary: getEnabledVendors(): List<String>
  • Nowość: getEnabledVendorsIDs(): List<String>
15. Sprawdź cel zgody
  • Stary: hasPurposeConsent(String): Boolean
  • Nowość: hasPurposeConsent(id: String): Boolean
16. Sprawdź zgodę dostawcy
  • Stary: hasVendorConsent(String): Boolean
  • Nowość: hasVendorConsent(id: String): Boolean
17. Eksportuj ciąg CMP
  • Stary: exportCmpString() : String
  • Nowość: exportCMPInfo(): String
18. Importuj ciąg CMP
  • Stary: importCmpString(consentString: String, completionHandler: ((Error?) -> Unit)?)
  • Nowość: importCMPInfo(cmpString: String, completion: (Result<Unit>) -> Unit)
  • Stary: reset()
  • Nowość: resetConsentManagementData(completion: (Result<Unit>) -> Unit)

Metody przestarzałe:

 

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

        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")
    }
}

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.checkWithServerAndOpenIfNecessary(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 JsonObject 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) {

    }
}

 

Powrót do góry