Compliant with GDPR, CCPA, COPPA, LGPD, PECR, PDPA, PIPEDA, and more.
UniConsent CMP es un paquete para gestionar el consentimiento GDPR IAB TCF 2.3 en aplicaciones Flutter. Puede encontrar una aplicación de demostración integrada con UniConsent CMP en el directorio "uniconsent_demo".
Para incluir el paquete de UniConsent en su proyecto Flutter, agréguelo como dependencia en su archivo pubspec.yaml:
dependencies:
uniconsent:
path: ../uniconsent
Luego, sincronice la dependencia ejecutando el siguiente comando:
flutter pub get
Antes de integrar el SDK, personalice la apariencia del banner de consentimiento en el Panel de UniConsent para que coincida con su marca y optimice las tasas de consentimiento.
Vaya a Projects → Seleccione su Proyecto → Settings → Step 5: UI & Style Settings para configurar:
Para un control más preciso, agregue CSS personalizado en el campo CSS Content en el Paso 5. Esto se recomienda para que el banner se sienta nativo en su aplicación y logre la mejor tasa de consentimiento:
/* Example: Style the accept button to match your brand */
.unic-btn-accept {
background-color: #4CAF50;
border-radius: 8px;
font-weight: 600;
}
/* Example: Adjust banner font */
.unic-banner {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
/* Example: Make the reject button less prominent */
.unic-btn-reject {
background-color: transparent;
border: 1px solid #ccc;
color: #666;
}
Consejo: Una interfaz de consentimiento bien personalizada que se sienta nativa en su aplicación generalmente logra tasas de consentimiento más altas. Los usuarios tienen más probabilidades de interactuar positivamente con un banner que coincide con la apariencia que esperan.
Para usar UniConsent CMP en su aplicación, siga estos pasos:
Inicialice el CMP con un App ID proporcionado por su gestor de cuenta:
// Init CMP with appId
UniConsent.instance.setAppId("YOUR_APP_ID_CHANGE_THIS");
// Set language (Optional)
UniConsent.instance.setLanguage("EN");
Mostrar la interfaz del CMP:
// Display CMP as full-screen page (default)
UniConsent.instance.launchCMP(context);
// Display CMP as a modal bottom sheet
UniConsent.instance.launchCMP(context, displayMode: CMPDisplayMode.modalSheet);
// Display CMP as a modal bottom sheet at 70% of the available height
UniConsent.instance.launchCMP(
context,
displayMode: CMPDisplayMode.modalSheet,
heightRatio: 0.7,
);
// Display CMP as a center dialog
UniConsent.instance.launchCMP(context, displayMode: CMPDisplayMode.dialog);
// Display CMP as a center dialog at 85% width and 70% height
UniConsent.instance.launchCMP(
context,
displayMode: CMPDisplayMode.dialog,
widthRatio: 0.85,
heightRatio: 0.7,
);
Disponible desde la versión 26.8.0 del SDK.
Ambas proporciones son opcionales: todos los modos de visualización funcionan sin ellas. Pase una proporción (una fracción del espacio disponible, mayor que 0 y como máximo 1) solo para sobrescribir el tamaño predeterminado; los valores no válidos lanzan ArgumentError:
| Parámetro | Se aplica a | Valor predeterminado si se omite |
|---|---|---|
heightRatio | modalSheet, dialog | Hoja: 90% de la altura. Diálogo: 70% |
widthRatio | Solo dialog | 90% del ancho, hasta 500 píxeles lógicos |
Las proporciones que no se aplican al modo de visualización elegido se ignoran (page ignora ambas).
Escuche los eventos del ciclo de vida del SDK con subscribe(). Esta es la forma recomendada de saber cuándo se muestra la interfaz y cuándo se cierra.
Eventos disponibles (CMPEventType):
CMPEventType.uiDisplay — La interfaz de consentimiento se muestraCMPEventType.uiClose — La interfaz de consentimiento se cierraUniConsent.instance.subscribe((event) {
switch (event.type) {
case CMPEventType.uiDisplay:
print('CMP UI displayed');
break;
case CMPEventType.uiClose:
print('CMP UI closed');
break;
default:
break;
}
});
Escuche los cambios de consentimiento con un callback opcional:
// Display CMP UI with consent change callback
UniConsent.instance.launchCMP(context, onConsentChanged: (info) {
// Called when the user saves consent choices
print('Consent updated: ${info?.tcString}');
});
Para un control completo, use buildCMPWidget() para integrar el CMP en su propio diseño:
// Embed in your own widget tree
UniConsent.instance.buildCMPWidget(
onConsentChanged: (info) { /* ... */ },
onClose: () { /* dismiss your custom UI */ },
);
Verificar automáticamente si se necesita consentimiento al iniciar la aplicación:
// Check if consent should be requested (e.g. first visit, or vendor list updated)
final shouldRequest = await UniConsent.instance.shouldRequestConsent();
if (shouldRequest) {
UniConsent.instance.launchCMP(context);
}
Obtener el tcString si es necesario:
// Get tcString
final info = await UniConsent.instance.getConsentInfo();
print(info?.tcString);
Leer el estado del consentimiento:
// Read consent status
final info = await UniConsent.instance.getConsentInfo();
if (info is ConsentInfo &&
info.purposeConsents.contains(DataUsagePurpose.useLimitedDataToSelectAds)) {
// do something
}
Restablecer el estado del consentimiento si es necesario:
// Clear all consent data
await UniConsent.instance.clearAll();
Disponible desde la versión 26.7.0 del SDK. Si crea su propia interfaz de consentimiento de primera capa en lugar de mostrar la webview del CMP, puede guardar el consentimiento directamente:
// Grant consent for all purposes, special features and vendors
final saved = await UniConsent.instance.agreeAll();
// Reject all purposes, special features and vendors
final saved = await UniConsent.instance.rejectAll();
Ambas API guardan los mismos valores de consentimiento que el flujo de la interfaz del CMP (claves IAB TCF, consentimiento adicional y señales de consent mode) y disparan el mismo evento de cierre para los suscriptores.
Nota: Estas API obtienen la lista de proveedores y la configuración del proyecto a través de la red y devuelven
falsesi el consentimiento no pudo guardarse (por ejemplo, sin conexión).Importante: Su primera capa personalizada debe seguir cumpliendo los requisitos de IAB TCF (divulgar las finalidades y los proveedores, y ofrecer aceptar y rechazar con la misma prominencia). Los usuarios deben poder seguir abriendo la interfaz completa del CMP (
launchCMP()) para tomar decisiones granulares.
Si su aplicación abre un WebView que carga una página web con la etiqueta de UniConsent CMP, puede pasar el estado de consentimiento nativo para que la etiqueta del CMP reconozca el consentimiento existente y no muestre el banner nuevamente.
import 'package:webview_flutter/webview_flutter.dart';
import 'package:uniconsent/uniconsent.dart';
final controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setNavigationDelegate(NavigationDelegate(
onPageStarted: (url) async {
// Inject consent at page start, before CMP tag runs
await UniConsent.instance.syncConsent(controller);
},
))
..loadRequest(Uri.parse('https://example.com'));
Los siguientes tipos están disponibles al importar package:uniconsent/uniconsent.dart:
UniConsent — singleton principal del SDKUniConsentInfo — datos base de consentimiento (sdkId, tcString, gdprApplies, vendorListVersion, etc.)ConsentInfo — extiende UniConsentInfo con listas de consentimiento a nivel de propósitoDataUsagePurpose — enum de IDs de propósitos IAB TCF 2.3KVDBKeys — constantes de claves de almacenamiento IAB TCF (por ejemplo, KVDBKeys.tcString, KVDBKeys.purposeConsents)CMPDisplayMode — enum para el estilo de visualización (page, modalSheet, dialog)CMPEventType — enum para eventos del ciclo de vida (sdkInit, ready, uiDisplay, uiClose)CMPEvent — objeto de evento con una propiedad typeCMPEventCallback — typedef para el callback de subscribe()LogLevel — debug / prodConsentCallback — typedef para el callback onConsentChangedUniConsentCMPContent — el widget principal del CMP para diseños personalizados