[Androide] 1. consentmanager Integración SDK
La consentmanager SDK para aplicaciones de Android implementa y proporciona funcionalidad para informar al usuario sobre la protección de datos y solicitar y obtener el consentimiento del usuario. Permite a los desarrolladores de aplicaciones integrar fácilmente consentmanager servicio en su aplicación.
Cómo funciona
- Integre el SDK en la aplicación y configure los ajustes del SDK
- Una vez que el SDK se integre en una aplicación, el SDK proporcionará funciones para el desarrollador de la aplicación con el fin de recuperar los datos de consentimiento
- Tan pronto como se inicie la aplicación, el SDK recuperará automáticamente la información del consentmanager servidores para preparar el SDK para su uso.
- Se recomienda que, al iniciar la aplicación, la aplicación cree una instancia de clase
CMPConsentTool
. Una vez que se crea esto, el SDK mostrará automáticamente la pantalla de consentimiento si es necesario. - Cuando la aplicación quiere procesar datos personales, debe "preguntar" al SDK si se dio el consentimiento para el propósito específico y el proveedor.
Instalación
Desde la versión 1.7.0, el repositorio del SDK se ha trasladado al repositorio oficial de Maven. La guía de migración se puede encontrar Haga clic aquí para entrar.
Gradle
Agregue la dependencia a sus aplicaciones build.gradle. (Para obtener siempre la última versión, utilice el símbolo + para obtener las actualizaciones más recientes. Por ejemplo, siempre puede obtener las versiones más recientes para actualizaciones menores hasta 1.x.+)
dependencies {
implementation 'net.consentmanager.sdk:android:1.7.32'
}
Maven
Agregue la dependencia a sus aplicaciones build.gradle. (Para obtener siempre la última versión en maven, puede utilizar diferentes métodos para rechazar el rango de versiones. Puede buscarlos Haga clic aquí para entrar. )
<dependency>
<groupId>net.consentmanager.sdk</groupId>
<artifactId>android</artifactId>
<version>1.7.32</version>
</dependency>
Usando la biblioteca
Permisos
Este SDK requiere los siguientes permisos, asegúrese de agregarlos a su AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Iniciar herramienta de consentimiento
Con el inicio de la aplicación (generalmente su función viewDidAppear) debe crear una instancia de la clase CMPConsentTool. Esto obtendrá automáticamente los datos necesarios de nuestro servidor y determinará si la pantalla de consentimiento debe mostrarse o no. Si es así, el SDK mostrará automáticamente la pantalla de consentimiento en este punto, recopilará los datos y proporcionará los datos a la aplicación. Luego, la instancia se puede usar para obtener detalles de consentimiento del SDK para usarlo en la aplicación.
Para iniciar ConsentTool, vaya a su clase de destino y cree una instancia de CMPConsentTool como se muestra a continuación:
//...
import net.consentmanager.sdk.CMPConsentTool;
//...
public class MainActivity extends AppCompatActivity {
private CMPConsentTool consentTool;
//...
@Override
protected void onCreate(Bundle savedInstanceState) {
//..
consentTool = CMPConsentTool.createInstance(this, "D3M01D4A2B3C5", "delivery.consentmanager.net", "MyFavouriteApp", "");
}
//...
}
Para crear la instancia de CMPConsentTool, necesita configurar la instancia. Deberá proporcionar el CODE-ID, el dominio del servidor, el nombre de la aplicación y el idioma. El CODE-ID y el dominio del servidor se pueden encontrar en su consentmanager cuenta bajo Menú> Obtener código. El nombre de la aplicación se puede usar para distinguir diferentes aplicaciones en consentmanager informes Para el idioma, puede usar una cadena vacía ("") para la detección automática o un código de idioma de 2 letras ("EN", "DE", "FR", etc.).
Los valores de configuración se pueden insertar de diferentes maneras:
a) Configuración de SDK a través de CMPConfig
Agregue las siguientes líneas a su código:
val config = CMPConfig.apply {
serverDomain = CMP_DOMAIN
appName = CMP_APP_NAME
language = LANG
id = CODE_ID
}
val consentTool = CMPConsentTool.createInstance(this, config);
b) Configuración de SDK a través de createInstance()
Agregue la siguiente línea a su código:
consentTool = CMPConsentTool.createInstance(this, "D3M01D4A2B3C5", "delivery.consentmanager.net", "MyFavouriteApp", "EN");
Usando el SDK
Verificar consentimiento
Para verificar si un proveedor o propósito tiene consentimiento, puede usar los dos métodos:
if(consentTool.hasPurposeConsent(this,"52",false))
{
if(consentTool.hasVendorConsent(this,"s26", false))
{
//do something with data
}
}
Ambos métodos hasPurposeConsent
y hasVendorConsent
requiere dos parámetros:
- id: cadena del proveedor o ID de propósito. Tenga en cuenta que las ID de proveedor pueden tener diferentes formatos ("123", "s123" y "c123"), verifique nuevamente con Menú> Proveedores y Menú> Propósitos en tu consentmanager .
- isIABVendor / isIABPurpose: si el proveedor o el propósito es un proveedor / propósito que sigue el estándar IAB TCF, deberá establecer un verdadero, de lo contrario, un falso.
Recuerde: Todos los proveedores que no pertenecen al IAB tienen ID que comienzan con una "s" o "c" (por ejemplo, "s123"); Los proveedores que pertenecen a la IAB tienen ID que no comienzan con una "s" o "c".
Reabrir la pantalla de consentimiento
Para permitir que el usuario cambie las opciones, simplemente puede llamar openCmpConsentToolView()
:
consentTool.openCmpConsentToolView(this);
Pasar información de consentimiento a otras fuentes
En algunos casos, una aplicación nativa puede contener vistas web para mostrar ciertas cosas como publicidad o contenido. Para transmitir la información de consentimiento del SDK a la vista web, utilice la función:
String consentData = CMPConsentTool.exportCMPData(this);
Esto exportará la información de consentimiento y todos los datos adicionales que necesita el CMP. Luego puede pasar esta información al CMP que está en su vista web agregándola a la URL que se llama en la vista web:
myWebView.loadURL("https://mywebsite.com/....#cmpimport=" + consentData);
Oyentes de eventos personalizados
Para agregar una lógica de proceso adicional, puede utilizar los detectores de eventos. Los siguientes detectores de eventos están disponibles:
Nombre |
ocurre
|
Al abrir devolución de llamada |
Oyente de evento cuando se abrió CMP |
OnCMPCoseCallback |
Oyente de evento cuando CMP está cerrado |
OnCMPNotOpenedDevolución de llamada |
Oyente para eventos cuando no es necesario abrir CMP |
Devolución de llamada en error |
Listener for Event cuando hay un error en el proceso de gestión de consentimiento. |
Consentimiento de importación/exportación
Para importar o exportar el consentimiento puede utilizar la función exportCMPData(Contexto contexto) y importCMPData(Contexto contexto, String cmpData). Mira el ejemplo a continuación:
// Importing consent data if you like
CMPConsentTool.importCMPData(this, "${your consentString}");
// Instantiate CMPConsentTool()
consentTool = CMPConsentTool.createInstance(...)
// ... Your code here ...
// Exporting Consent data
String consentString = CMPConsentTool.exportCMPData(this);
La cadena de consentimiento que necesita pasar debe estar codificada en base64.
Diagrama de secuencia del SDK de CMP
Preferencias compartidas
El SDK establecerá los valores de preferencias compartidas para IAB TCF v1, IAB TCF v2, IAB USPrivacy y Google AC String. Estos valores se pueden leer utilizando el siguiente código:
Context mContext = getApplicationContext();
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
SharedPreferences.OnSharedPreferenceChangeListener mListener;
mListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
if (key.equals([Specific Consent Key])) {
// Update Consent settings
}
}
};
mPreferences.registerOnSharedPreferenceChangeListener(mListener);
Se definen las siguientes claves:
IAB TCF v1 | |
IABConsent_CMPPresent |
Boolean : Se establece en verdadero si un CMP que implementa esta especificación está presente en la aplicación. Idealmente establecido por el editor lo antes posible, pero también puede ser configurado por el CMP alternativamente. |
IABConsent_SubjectToGDPR |
String 1 - (sujeto a GDPR), 0 - (no sujeto a GDPR), Nulo - indeterminado (predeterminado antes de la inicialización). Se alinea con IAB OpenRTB GDPR Advisory. Decidió ser String, tener el estado no inicializado. |
IABConsent_ConsentString |
String : Cadena de consentimiento |
IABConsent_ParsedPurposeConsents |
String (de "0" y "1") donde el carácter en la posición N indica el estado de consentimiento para la ID de propósito N como se define en la Lista global de proveedores. Cadena de consentimiento otorgado para permitir una verificación simple. El primer personaje de la izquierda es el Propósito 1, ... |
IABConsent_ParsedVendorConsents |
String (de "0" y "1") donde el carácter en la posición N indica el estado de consentimiento para la identificación del proveedor N como se define en la Lista global de proveedores. Cadena de consentimiento otorgado para permitir una verificación simple. El primer personaje de la izquierda es el Vendedor 1, ... |
IAB TCF v2 | |
IABTCF_CmpSdkID |
Number : El ID entero sin signo del SDK de CMP |
IABTCF_CmpSdkVersion |
Number : El número de versión entero sin signo de CMP SDK |
IABTCF_PolicyVersion |
Number : El entero sin signo que representa la versión del TCF a la que se adhieren estos consentimientos. |
IABTCF_gdprApplies |
Number :
Desarmado - indeterminado (predeterminado antes de la inicialización) |
IABTCF_PublisherCC |
String : Código de dos letras ISO 3166-1 alfa-2 - Defecto: AA (desconocido) |
IABTCF_PurposeOneTreatment |
Number :
Desestablecer predeterminado - Los proveedores pueden usar este valor para determinar si se requiere el consentimiento para el propósito uno. |
IABTCF_UseNonStandardStacks |
Number :
|
IABTCF_TCString |
String : Cadena TC codificada completa |
IABTCF_VendorConsents |
Binary String : Los '0' or '1' en la posición n - dónde nLa indexación comienza en 0 - indica el estado de consentimiento para la identificación del proveedor n + 1; false y true respectivamente. p.ej. '1' en el índice 0 es consentimiento true para la identificación del proveedor 1
|
IABTCF_VendorLegitimateInterests |
Binary String : Los '0' or '1' en la posición n - dónde nLa indexación comienza en 0 - indica el estado de interés legítimo para la identificación del proveedor n + 1; false y true respectivamente. p.ej. '1' en el índice 0 se establece un interés legítimo true para la identificación del proveedor 1
|
IABTCF_PurposeConsents |
Binary String : Los '0' or '1' en la posición n - dónde nLa indexación comienza en 0 - indica el estado de consentimiento para la identificación del propósito n + 1; false y true respectivamente. p.ej. '1' en el índice 0 es consentimiento true para fines de identificación 1
|
IABTCF_PurposeLegitimateInterests |
Binary String : Los '0' or '1' en la posición n - dónde nLa indexación comienza en 0 - indica el estado de interés legítimo para la identificación del propósito n + 1; false y true respectivamente. p.ej. '1' en el índice 0 se establece un interés legítimo true para fines de identificación 1
|
IABTCF_SpecialFeaturesOptIns |
Binary String : Los '0' or '1' en la posición n - dónde nLa indexación comienza en 0 - indica el estado de suscripción para ID de función especial n + 1; false y true respectivamente. p.ej. '1' en el índice 0 es opt-in true para ID de función especial 1
|
IABTCF_PublisherRestrictions{ID} |
String ['0','1', or '2'] : El valor en la posición n - dónde nLa indexación comienza en 0 - indica el tipo de restricción del editor (0-2) para el proveedor n + 1; (consulte Tipos de restricciones de editor). p.ej. '2' en el índice 0 es restrictionType 2 para la identificación del proveedor 1 . {ID} se refiere a la identificación del propósito. |
IABTCF_PublisherConsent |
Binary String : Los '0' or '1' en la posición n - dónde nLa indexación comienza en 0 - indica el estado de consentimiento del propósito para la identificación del propósito n + 1 para el editor, ya que corresponden a los propósitos de la Lista global de proveedores; false y true respectivamente. p.ej. '1' en el índice 0 es consentimiento true para fines de identificación 1
|
IABTCF_PublisherLegitimateInterests |
Binary String : Los '0' or '1' en la posición n - dónde nLa indexación comienza en 0 - indica el estado de interés legítimo del propósito para la identificación del propósito n + 1 para el editor, ya que corresponden a los propósitos de la Lista global de proveedores; false y true respectivamente. p.ej. '1' en el índice 0 se establece un interés legítimo true para fines de identificación 1
|
IABTCF_PublisherCustomPurposesConsents |
Binary String : Los '0' or '1' en la posición n - dónde nLa indexación comienza en 0 - indica el estado de consentimiento del propósito para la ID de propósito personalizado del editor n + 1 para el editor; false y true respectivamente. p.ej. '1' en el índice 0 es consentimiento true para ID de propósito personalizado 1
|
IABTCF_PublisherCustomPurposesLegitimateInterests |
Binary String : Los '0' or '1' en la posición n - dónde nLa indexación comienza en 0 - indica el estado de interés legítimo de propósito para la identificación de propósito personalizado del editor n + 1 para el editor; false y true respectivamente. p.ej. '1' en el índice 0 se establece un interés legítimo true para ID de propósito personalizado 1
|
IAB USPrivacidad | |
IABUSPrivacy_String |
String : Se alinea con el IAB OpenRTB CCPA Advisory. La cadena codifica todas las opciones e información. |
Cadena AC de Google | |
IABTCF_AddtlConsent |
|
(Obsoleto) Bloqueo de contenido dinámico con marcador de posición webView
Esta función ha quedado obsoleta y se eliminará en el futuro. El motivo de la obsolescencia es que con la habilitación y deshabilitación de las API de propósito y proveedor, ya no es necesario crear un marcador de posición. Puede agregar su propia interfaz de usuario y su propia lógica comercial y activar y desactivar proveedores dinámicamente. En lugar de usar esta función, debe usar el habilitarLista de proveedores() y deshabilitar lista de proveedores () funciones para administrar qué proveedores están habilitados o deshabilitados, y cree su propia interfaz de usuario para mostrar esta información al usuario.
El viewObject de marcador de posición se puede implementar para obtener la funcionalidad de bloqueo de contenido dinámico Haga clic aquí para entrar.Puede crear la vista con el siguiente método:
CMPPlaceholder placeholderView = CMPConsentTool.createPlaceholder(getApplicationContext(),CMPPlaceholderParams
.ofVendor("${vendorId}"), new CMPPlaceholderEventListener() {
@Override
public void vendorAccepted(WebView view) {
//... Actions to trigger if Consent is accepted
// Like showing Youtube Video View
}
});
Con el objeto Wrapper CMPPlaceholderParams
también puede pasar parámetros opcionales como textos personalizados o una imagen de vista previa opcional. Las funciones del constructor se llaman setCustomplaceholder(String headline, String mainText, String checkboxText, String buttonText)
y setOptionalImageUrl(String imageUrl)
.
La lógica empresarial requerida, cuando desee mostrar la vista y cuando no necesite ser aplicada por el desarrollador. Puede pasar la condición y las acciones necesarias mediante las devoluciones de llamada de EvenListener del CMPPlaceholderEventlistener
. Se debe implementar el siguiente evento requerido:
Necesario: vendorAccepted(CMPPlaceholderView view) { // Your logic }
Opcional: errorOccurred(String message) { // Error handling }
Inicio de sesión
Al utilizar nuestro SDK de Android, es posible que necesite depurar o analizar información de registro para diversos fines. Los registros generados por nuestro SDK están etiquetados con "CMP", lo que le permite filtrar y ver fácilmente solo los registros relevantes. Esta guía proporciona instrucciones paso a paso sobre cómo acceder a estos registros usando Logcat en Android Studio.
Busque la etiqueta: En la barra de búsqueda encima de las declaraciones de registro, escriba CMP
para filtrar los registros etiquetados con "CMP".
Opcional: habilitar el modo de depuración
In CMPConfig
establecer isDebugMode = true
.
val config = CMPConfig.apply {
// ... other settings
isDebugMode = true
}
- Habilita registros más detallados etiquetados con "CMP".
- Útil para depuración y análisis.
Solucionando Problemas
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;
#}