[Androide] 1. consentmanager Integración SDK
En este documento encontrará información general sobre cómo integrar nuestro SDK a su proyecto. Para obtener más detalles, consulte nuestra Referencia de la API documentación.
1. Instalación
consentmanager SDK es una solución integral para gestionar el consentimiento de los usuarios en aplicaciones móviles. Diseñado para gestionar el cumplimiento del RGPD, las preferencias de privacidad del usuario y la transparencia del seguimiento de anuncios, este SDK proporciona una integración perfecta para las plataformas iOS y Android. Además, ofrece complementos y puentes de contenedor para React Native, Flutter y Unity, lo que lo hace versátil en varios entornos de desarrollo.
Pasos: descripción de alto nivel
-
Integración y Configuración:
- Integre el SDK en su aplicación.
- Configure los ajustes del SDK según sus necesidades.
-
Creación de una instancia y visualización de la capa de consentimiento:
- Al iniciar la aplicación, cree una instancia de
CMPManager
clase. Esta instancia se encargará del proceso de consentimiento. - El SDK mostrará automáticamente la pantalla de consentimiento si es necesario.
- Al iniciar la aplicación, cree una instancia de
-
Tratamiento de los datos de consentimiento del usuario:
- Una vez que se recopilan los consentimientos, la información se almacena y está disponible para su consulta a través de diferentes propiedades y métodos expuestos por nuestro SDK. Tendrás información sobre consentimientos rechazados o aceptados, proveedores y propósitos.
1.1 Integración y configuración
Agregar dependencia a través de Gradle
Agregue la siguiente línea a su archivo build.gradle:
dependencies {
implementation "net.consentmanager.sdkv3:cmsdkv3:3.0.0"
}
Luego sincroniza tu proyecto.
1.2 Creación de una instancia y visualización de la capa de consentimiento
Dentro del inicio de la aplicación (su onCreate
función), debes crear una instancia de clase CMPManager
Necesitará configurar dos objetos que se pasarán al método getInstance: UrlConfig
, que maneja la configuración de su CMP, como el ID de código y el idioma predeterminado, y ConsentLayerUIConfig
. que configurará la apariencia de la vista web que mostrará la capa de consentimiento. Después de eso, pasará la capa actual Activity
usando el método setActivity
y atribuya el delegado, como se muestra a continuación. En el ejemplo siguiente, puede encontrar los dos objetos que se pasan. checkWithServerAndOpenIfNecessary()
La función obtendrá automáticamente los datos necesarios de nuestro servidor y determinará si es necesario mostrar la pantalla de consentimiento o no. Si es así, el SDK mostrará automáticamente la pantalla de consentimiento en este punto, a través de un WebView
creado por nuestro SDK, que mostrará la capa de consentimiento con el texto y los botones de acuerdo con sus configuraciones de CMP (elegidas a través del ID de código de su CMP), recopilará los datos y conservará la información de consentimiento en el área NSUserDefaults del dispositivo, para que la aplicación pueda mostrar los anuncios específicos en consecuencia.
Tenga en cuenta que es vital declarar e inicializar el CMPManager
SDK en el onCreate
método, de lo contrario, la vista podría no estar lista para usarse y el SDK podría fallar. Además, asegúrese de estar usando los datos de configuración correctos. Los datos de configuración se pueden encontrar en su consentmanager cuenta en Menú > CMP > Obtener código para aplicaciones > Código-ID
Además, tenga en cuenta que las funciones relacionadas con la determinación de si se necesita o no el consentimiento, así como la visualización de la capa de consentimiento, dependen de una conexión de red fiable. Si no hay conexión disponible o si el mecanismo de reintento no logra llegar a nuestro servidor, el evento didReceiveError devolverá un error de tiempo de espera, por lo que el SDK no podrá determinar la necesidad de un consentimiento, ya que no podrá mostrar la capa de consentimiento. Asegúrese de que su lógica tenga esto en cuenta.
Ejemplo:
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)
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")
}
}
1.3 Tratamiento de los datos de consentimiento de los usuarios
Comprobación de los consentimientos de los usuarios
Nuestro SDK ofrece distintos métodos para comprobar y recuperar información de consentimiento. Los métodos principales se muestran en el siguiente ejemplo:
// On the example below retrieved from our Demo App, we have some examples
// of how to check consents from the user, either accepted or rejected.
val hasConsent = cmpManager.hasUserChoice() // checks if the user has already accepted/rejected consents
val hasPurposeC53 = cmpManager.hasPurposeConsent(id: "c53") // checks if the user accepted the purpose "c53"
val hasVendorS2790 = cmpManager.hasVendorConsent(id: "s2790") // checks if the user accepted the vendor "s2790"
Para obtener más información sobre los otros métodos, consulte nuestra Documentación de la API.
Reapertura de la capa de consentimiento para verificar las opciones de los usuarios
Para permitir que el usuario verifique o cambie sus opciones, simplemente puede llamar openConsentLayer()
cmpManager.openConsentLayer()
Este método mostrará la capa de consentimiento a través de la misma instancia de WebView creada en los pasos anteriores.
Importación/exportación de información de consentimiento a otras fuentes
En algunos casos, una aplicación nativa puede contener vistas web para mostrar información, como publicidad o contenido. Para transmitir la información de consentimiento desde el SDK a la vista web, puede recuperar la cadena de consentimiento mediante:
consentData = cmpManager.exportCMPInfo()
Esto exportará la información de consentimiento y todos los demás datos que necesita la CMP. Luego, puede pasar esta información a la CMP que se encuentra en su vista web agregándola a la URL que se llama en la vista web.
Si, de lo contrario, necesita importar la cadena de consentimiento mediante el SDK, puede utilizar el siguiente ejemplo:
val consentStringToImport = "Q1FERkg3QVFERkg3QUFmR01CSVRCQkVnQUFBQUFBQUFBQWlnQUFBQUFBQUEjXzUxXzUyXzUzXzU0XzU1XzU2XyNfczI3ODlfczI3OTBfczI3OTFfczI2OTdfczk3MV9VXyMxLS0tIw"
cmpManager.importCMPInfo(consentStringToImport)
Crear un diseño personalizado
Para crear una vista personalizada de WKWebView, puede crear un contenedor para ComponentActivity que se debe pasar al SDK de CMP, de modo que tenga control total sobre la apariencia y el ciclo de vida de este. Para obtener más información, consulte la documentación oficial.
Inicio de sesión
Al utilizar nuestro SDK de iOS, es posible que necesite depurar o analizar información de registro para diversos fines. Los registros generados por nuestro SDK están etiquetados como "CMP", lo que le permite filtrar y ver fácilmente solo los registros relevantes. Para obtener más información, consulte esta sección de nuestra documentación.
Diagnóstico
Clase no encontrada o NoSuchMethodException:
A veces, ProGuard puede ofuscar nombres de clases o eliminar métodos a los que se hace referencia dinámicamente mediante reflexión. Para solucionar este problema, debe especificar las clases y métodos que deben mantenerse intactos en el archivo de configuración de ProGuard usando el -keep
Directiva.
Ejemplo de configuración de ProGuard para mantener una clase específica y sus métodos:
# 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;
#}