[Android] 0. Guía de migración

Esta guía te ayudará a migrar de la versión anterior del SDK de CMP a la versión actual. Trataremos los cambios en los nombres de los métodos, los parámetros y las funcionalidades nuevas o obsoletas. Para ver ejemplos de aplicaciones de demostración, consulta este enlace. Hay dos carpetas: una con una aplicación de demostración desarrollada íntegramente en Java, que incluye un envoltorio para Java llamado JavaCMPManager otra desarrollada completamente en Kotlin. 

Ten en cuenta que esta versión del SDK de CMP se ha reconstruido completamente desde cero, por lo que supone un cambio importante, ya que se han renombrado todos los métodos, al igual que las firmas, y ahora también ofrece callbacks para casi todos los métodos. En todos los casos, tendrás que modificar tu código y actualizar tus dependencias para garantizar que tu aplicación móvil funcione según lo esperado. Además, cabe mencionar que todos los datos almacenados por la versión anterior de nuestro SDK en los dispositivos de los usuarios se borrarán, lo que obligará a la aplicación a volver a mostrar la capa de consentimiento.

Repositorios

Ten en cuenta que todos nuestros repositorios han cambiado para el SDK de Android. Sigue las instrucciones que aparecen a continuación para saber dónde dirigir tu gestor de dependencias. 

Maven

En tu archivo Gradle, sustituye la línea anterior por la siguiente:

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

Después de realizar los cambios, sincroniza tu proyecto. 

Puntos clave de la migración

  1. Patrón de delegado: en lugar de oyentes individuales, la nueva versión utiliza un único protocolo de delegado (CMPManagerDelegate) para gestionar eventos. Contiene 4 eventos principales:
    1. didReceiveConsent(consent: String, jsonObject: Map<String, Any>)
      Esto se activa cuando se cierra la capa de consentimiento después de que el usuario haya actualizado sus consentimientos O al invocar métodos que provocan cambios en los consentimientos, como acceptAll, rejectAll, acceptVendors, rejectVendors, etc. Significa que el usuario ha aceptado o rechazado algunos o todos los consentimientos, y que estos se han guardado correctamente en el dispositivo.
    2. didShowConsentLayer
      Esto se activa cuando la capa de consentimiento se ha mostrado realmente. Significa que no había un consentimiento válido en el dispositivo, por lo que se debe recabar uno nuevo.
    3. didCloseConsentLayer
      Esto se activa cuando el SDK comprobó la necesidad de un consentimiento, pero no era necesario y la capa no se mostró. Significa que ya hay uno válido en el dispositivo, por lo que no es necesario uno nuevo y la capa de consentimiento no se mostrará.
    4. didReceiveError
      Esto se activa cuando la operación del SDK ha generado algún error.
  2. Manipuladores de finalización: muchos métodos incluyen ahora manipuladores de finalización para operaciones asíncronas. Actualiza tu código para gestionar estas devoluciones de llamada de forma adecuada.
  3. Cadena de consentimiento: Utiliza exportCMPInfo() en lugar de getConsentString() para recuperar la información de consentimiento.
  4. Consentimientos de proveedor y finalidad: Los métodos para obtener los consentimientos de proveedor y finalidad ahora devuelven matrices de ID. Es posible que tengas que ajustar tu lógica para gestionar estas matrices.
  5. Cadena de privacidad de EE. UU.: El getUSPrivacyString() método ha quedado obsoleto. Si lo utilizabas para el cumplimiento de la CCPA, ten en cuenta que este método ya no está disponible.
  6. Comprobación de requisitos de consentimiento: utiliza el nuevo checkAndOpen(completion:) método para determinar automáticamente si se necesita el consentimiento antes de mostrar la capa de consentimiento.

Cambios en los métodos y las firmas

Inicialización
  • Antiguo: CmpManager.initialize(context: Context, cmpConfig: CmpConfig)
  • Nuevo: CmpManager.createInstance(context: Context, cmpConfig: CmpConfig)
Establecer la configuración de la interfaz de usuario
  • Antiguo: .withCmpViewControllerConfigurationBlock { ... }
  • Novedad: La opción no está disponible, pero puedes crear una actividad envolvente y controlar el ciclo de vida y la apariencia en tu parte del código.
Verificación del consentimiento
  • Antiguo: check({ ... }, isCached: Bool),
  • Nuevo: checkAndOpen(completion: (Error?) -> Void)
Comprobar y abrir la capa de consentimiento si es necesario
  • Antiguo: checkAndOpenConsentLayer()
  • Nuevo: checkAndOpen(completion: (Error?) -> Void)
Capa de consentimiento abierta
  • Antiguo: openConsentLayer()
  • Nuevo: forceOpen(completion: (Result<Unit>) -> Unit)
Aceptar todos los consentimientos
  • Antiguo: acceptAll(callback: ConsentCallback)
  • Nuevo: cceptAll(completion: (Result<Unit>) -> Unit)
Rechazar todos los consentimientos
  • Antiguo: rejectAll(onFinish: () -> Unit)
  • Nuevo: rejectAll(completion: (Result<Unit>) -> Unit)
Habilitar fines
  • Antiguo: enablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nuevo: acceptPurposes(purposes: List<String>, updatePurpose: Boolean, completion: (Result<Unit>) -> Unit)
Desactivar fines
  • Antiguo: disablePurposeList(purposes: List<String>, updateVendor: Boolean, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nuevo: rejectPurposes(purposes: List<String>, updateVendor: Boolean, completion: (Result<Unit>) -> Unit)
Habilitar proveedores
  • Antiguo: enableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Novedades: acceptVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Desactivar proveedores
  • Antiguo: disableVendorList(vendors: List<String>, onConsentReceivedCallback: OnConsentReceivedCallback?)
  • Nuevo: rejectVendors(vendors: List<String>, completion: (Result<Unit>) -> Unit)
Obtener todos los fines
  • Antiguo: getAllPurposes(): List<String>
  • Novedades: getAllPurposesIDs(): List<String>
Obtener fines habilitados
  • Antiguo: getEnabledPurposes(): List<String>
  • Novedades: getUserStatus(): UserConsentStatus
Obtener todos los proveedores
  • Antiguo: getAllVendors(): List<String>
  • Novedades: getUserStatus(): UserConsentStatus
Consigue proveedores autorizados
  • Antiguo: getEnabledVendors(): List<String>
  • Novedades: getUserStatus(): UserConsentStatus
Comprueba el consentimiento de finalidad
  • Antiguo: hasPurposeConsent(String): Boolean
  • Nuevo: getStatusForPurpose(id: String): ConsentStatus
Comprueba el consentimiento del proveedor
  • Antiguo: hasVendorConsent(String): Boolean
  • Nuevo: getStatusForVendor(id: String): ConsentStatus
Exportar cadena CMP
  • Antiguo: exportCmpString() : String
  • Novedades: exportCMPInfo(): String
Importar cadena CMP
  • Antiguo: importCmpString(consentString: String, completionHandler: ((Error?) -> Unit)?)
  • Nuevo: importCMPInfo(cmpString: String, completion: (Result<Unit>) -> Unit)
Restablecer datos de consentimiento
  • Antiguo: reset()
  • Nuevo: resetConsentManagementData(completion: (Result<Unit>) -> Unit)
Gestión del estado del modo de consentimiento de Google
  • Antiguo: withGoogleAnalyticsCallback(analyticsListener: CmpGoogleAnalyticsInterface)
  • Novedades: getGoogleConsentModeStatus
Gestión de la llamada de retorno onLinkClick
  • Antiguo: la v2 solía tener una función de lista blanca. En la versión actual, el proceso se ha simplificado y el usuario tiene control total sobre el comportamiento a seguir según la URL que devuelve el método.
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
})
  • Novedad: El usuario tiene control total sobre qué comportamiento seguir según la URL. Por lo tanto, las URL de la lista blanca anterior deben migrarse al interior del método de callback,
        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
            }
        }

 

Métodos obsoletos:

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

Ejemplos de migración

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!