Consentimiento y banner de cookies
La app puede registrar lo que el usuario hace en la tienda, como los productos que ve o lo que añade al carrito, para enviarle recordatorios como el del carrito abandonado. También puede medir el uso de la app con Firebase Analytics. Las dos cosas necesitan el consentimiento del usuario.
Ese consentimiento se suele pedir en el banner de cookies de la web. Dentro de la
app, el banner tiene que comunicarle a la app lo que el usuario ha elegido. Para
eso basta con una llamada de JavaScript, window.ReskytLayout.consent.set(...),
en los botones que el banner ya tiene.
Qué tiene que hacer tu equipo web
Sección titulada «Qué tiene que hacer tu equipo web»- Añadir una función al JavaScript de la web que traduzca la elección del banner al formato de la app.
- Llamarla cada vez que el usuario acepta, rechaza o guarda sus preferencias, y también al cargar cada página si ya había respondido antes.
- Dejar dentro de la app un acceso permanente a la configuración de cookies, para que el usuario pueda cambiar de opinión.
window.ReskytLayout solo existe dentro de la app. En un navegador normal la
llamada no hace nada, así que el mismo código sirve para la web y para la app.
Qué decide el usuario
Sección titulada «Qué decide el usuario»Cada grupo del banner corresponde a una o varias claves de la app:
| Grupo del banner | Qué permite en la app | Clave | Si el usuario aún no ha respondido |
|---|---|---|---|
| Estrictamente necesarias | Nada adicional. | Ninguna | Siempre activas. |
| Analítica | Que Firebase Analytics mida el uso de la app. | analyticsStorage | Activada, salvo que los ajustes del módulo Firebase Analytics indiquen lo contrario. |
| Personalización o comportamiento | Que el User Journal registre la actividad de compra y que se envíen recordatorios basados en ella, como el del carrito abandonado. | journal | Desactivada en todas las apps. |
| Publicidad | Cookies e identificadores publicitarios, envío de datos a Google con fines publicitarios y publicidad personalizada. | adStorage, adUserData y adPersonalization | Desactivadas. |
Las claves de analítica y publicidad corresponden a las del modo de
consentimiento de Google (analytics_storage, ad_storage, ad_user_data y
ad_personalization) y se trasladan una a una a Firebase. Si analyticsStorage
está desactivada, Firebase no recoge nada.
Cómo lo recuerda la app
Sección titulada «Cómo lo recuerda la app»La app guarda la respuesta en el propio dispositivo, junto con la fecha. A partir de ahí:
- No se vuelve a preguntar. La respuesta se mantiene aunque se cierre la app, y Reskyt no la pide de nuevo.
- Se aplica al momento. La app consulta la respuesta cada vez que va a registrar algo, así que un cambio a mitad de sesión tiene efecto inmediato, en los dos sentidos.
- Vale la última respuesta. Da igual si llega del banner de la web o de la página de consentimiento de Reskyt.
Paso 1: añadir la función
Sección titulada «Paso 1: añadir la función»Esta función recibe los grupos que el usuario ha aceptado en el banner y se los pasa a la app. Se puede poner en cualquier punto del JavaScript de la web:
function applyAppConsent(groups) { const consent = window.ReskytLayout?.consent; // Fuera de la app, o si la app aún no está lista, no hace nada if (!consent?.isAvailable()) return;
consent.set({ journal: groups.behavioural === true, analyticsStorage: groups.analytics === true, adStorage: groups.advertising === true, adUserData: groups.advertising === true, adPersonalization: groups.advertising === true, });}Los nombres behavioural, analytics y advertising son un ejemplo: se
sustituyen por los que use el banner. Un grupo que no llega como true queda
desactivado.
Paso 2: llamarla desde el banner
Sección titulada «Paso 2: llamarla desde el banner»La función se llama en cuatro momentos, siempre de la misma forma:
| Cuándo | Qué se llama |
|---|---|
| El usuario pulsa Aceptar todo | applyAppConsent({ analytics: true, behavioural: true, advertising: true }) |
| El usuario pulsa Rechazar todo o Solo necesarias | applyAppConsent({}), que lo desactiva todo |
| El usuario guarda sus preferencias | applyAppConsent(...) con el valor de cada casilla |
| Se carga una página y el usuario ya había respondido | applyAppConsent(...) con la respuesta que la web tiene guardada |
El último caso mantiene la app alineada con la respuesta que guarda la web, por ejemplo en una cookie, aunque el banner no se vuelva a mostrar.
Si la web usa un gestor de consentimiento, la llamada se hace desde el evento que el gestor lanza cuando cambia la elección, en lugar de desde los botones:
| Gestor | Evento |
|---|---|
| OneTrust | OptanonWrapper() |
| Cookiebot | CookiebotOnAccept y CookiebotOnDecline |
| Didomi | consent.changed |
Los grupos aceptados se leen de la API del propio gestor.
Paso 3: permitir cambiar de opinión
Sección titulada «Paso 3: permitir cambiar de opinión»Retirar el consentimiento tiene que ser tan fácil como darlo. Mantén dentro de la
app un enlace permanente a la configuración de cookies, en el pie o en el menú,
que vuelva a abrir el banner. Si el usuario rechaza desde ahí, el banner llama a
applyAppConsent({}) o directamente a ReskytLayout.consent.set('none').
Para que la app vuelva a preguntar, por ejemplo cuando caduca el consentimiento
guardado en la web, se llama a ReskytLayout.consent.reset().
Alternativa: la página de consentimiento de Reskyt
Sección titulada «Alternativa: la página de consentimiento de Reskyt»En lugar del banner propio, la web puede abrir la página de consentimiento que incluye la app:
window.ReskytLayout.screens.openSystemPage('consent');La app no la abre nunca por sí sola: hay que llamarla desde el código de la web, por ejemplo desde un botón. Basta con que la página esté publicada en el backoffice; no necesita ningún otro ajuste.
Si el dispositivo pide no ser rastreado
Sección titulada «Si el dispositivo pide no ser rastreado»Si el navegador del dispositivo tiene activada una opción de privacidad como Do Not Track o Global Privacy Control, la app lo desactiva todo, sea cual sea la respuesta del banner.
Comprobar que funciona
Sección titulada «Comprobar que funciona»Abre la app en un dispositivo de prueba con el inspector web conectado, desde
chrome://inspect en Android o desde el menú Desarrollo de Safari en iOS, y
ejecuta ReskytLayout.consent.get() en la consola:
| Situación | Lo que debe devolver |
|---|---|
| Antes de responder al banner | status: 'undecided' y journal: false |
| Después de Aceptar todo | status: 'decided', source: 'user' y todas las claves a true |
| Después de Rechazar todo desde la configuración de cookies | Todas las claves a false |
Si devuelve source: 'browser' con todo desactivado, el dispositivo tiene
activada una opción de privacidad del navegador, como se explica en la sección
anterior.
Referencia de la API
Sección titulada «Referencia de la API»Métodos
Sección titulada «Métodos»| Método | Qué hace |
|---|---|
isAvailable() | Indica si la API se puede usar. Devuelve false fuera de la app. |
get() | Devuelve la respuesta guardada. |
set(eleccion) | Guarda una respuesta. Devuelve una promesa con el estado nuevo. |
reset() | Borra la respuesta y vuelve al estado sin responder. |
onChange(listener) | Ejecuta listener cada vez que cambia la respuesta. Devuelve una función para dejar de escuchar. |
set acepta tres formas:
| Valor | Efecto |
|---|---|
'all' | Lo activa todo. |
'none' | Lo desactiva todo. |
Un objeto, por ejemplo { journal: true } | Cambia solo las claves indicadas. El resto conserva su valor. |
Se pueden guardar claves propias, con letras, números y guion bajo hasta 64
caracteres. La app las guarda y las devuelve en get(), pero no las usa.
get() devuelve un objeto con esta forma:
{ status: 'decided', source: 'user', decidedAt: '2026-10-21T09:12:00.000Z', categories: { journal: true, analyticsStorage: true, adStorage: false, adUserData: false, adPersonalization: false }}| Campo | Significado |
|---|---|
status | 'undecided' si el usuario aún no ha respondido, 'decided' si ya lo ha hecho. |
source | De dónde sale el valor: 'default', los valores por defecto; 'user', la respuesta del usuario; 'browser', una opción de privacidad del navegador que lo desactiva todo. |
decidedAt | Fecha de la respuesta. |
categories | El valor de cada clave. |
Para leerlo desde la web, por ejemplo para no mostrar el banner dentro de la app si el usuario ya respondió:
const consent = window.ReskytLayout?.consent;if (consent?.get().status === 'decided') hideBanner();consent?.onChange((state) => console.log(state.categories));