Ir al contenido

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.

  1. Añadir una función al JavaScript de la web que traduzca la elección del banner al formato de la app.
  2. 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.
  3. 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.

Cada grupo del banner corresponde a una o varias claves de la app:

Grupo del bannerQué permite en la appClaveSi el usuario aún no ha respondido
Estrictamente necesariasNada adicional.NingunaSiempre activas.
AnalíticaQue Firebase Analytics mida el uso de la app.analyticsStorageActivada, salvo que los ajustes del módulo Firebase Analytics indiquen lo contrario.
Personalización o comportamientoQue el User Journal registre la actividad de compra y que se envíen recordatorios basados en ella, como el del carrito abandonado.journalDesactivada en todas las apps.
PublicidadCookies e identificadores publicitarios, envío de datos a Google con fines publicitarios y publicidad personalizada.adStorage, adUserData y adPersonalizationDesactivadas.

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.

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.

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.

La función se llama en cuatro momentos, siempre de la misma forma:

CuándoQué se llama
El usuario pulsa Aceptar todoapplyAppConsent({ analytics: true, behavioural: true, advertising: true })
El usuario pulsa Rechazar todo o Solo necesariasapplyAppConsent({}), que lo desactiva todo
El usuario guarda sus preferenciasapplyAppConsent(...) con el valor de cada casilla
Se carga una página y el usuario ya había respondidoapplyAppConsent(...) 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:

GestorEvento
OneTrustOptanonWrapper()
CookiebotCookiebotOnAccept y CookiebotOnDecline
Didomiconsent.changed

Los grupos aceptados se leen de la API del propio gestor.

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 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.

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ónLo que debe devolver
Antes de responder al bannerstatus: 'undecided' y journal: false
Después de Aceptar todostatus: 'decided', source: 'user' y todas las claves a true
Después de Rechazar todo desde la configuración de cookiesTodas 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.

MétodoQué 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:

ValorEfecto
'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
}
}
CampoSignificado
status'undecided' si el usuario aún no ha respondido, 'decided' si ya lo ha hecho.
sourceDe 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.
decidedAtFecha de la respuesta.
categoriesEl 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));