Solicitar el consentimiento de los usuarios europeos

Según lo estipulado en la Política de Consentimiento de Usuarios de la Unión Europea de Google, debes mostrar cierta información a los usuarios que se encuentren en el Espacio Económico Europeo (EEE) y obtener su consentimiento para usar cookies u otros métodos de almacenamiento local en aquellos casos en los que sea obligatorio por ley, así como para usar sus datos personales (como AdID) con el objetivo de servirles anuncios. Esta política refleja los requisitos de la directiva sobre la privacidad electrónica de la UE y del Reglamento General de Protección de Datos (RGPD).

Para que los editores puedan cumplir fácilmente las disposiciones de esta política, Google proporciona un SDK de consentimiento. Se trata de una biblioteca de código abierto que ofrece funciones para obtener el consentimiento de los usuarios. El código fuente completo está disponible en GitHub

Los anuncios que sirve Google se pueden clasificar como personalizados o no personalizados, y en ambos casos se requiere el consentimiento de los usuarios del EEE. De forma predeterminada, cuando se envían solicitudes de anuncio a Google, se sirven anuncios personalizados que se seleccionan en función de los datos de usuario que se hayan recogido con anterioridad. Google también permite configurar las solicitudes de anuncio para que se sirvan anuncios no personalizados. Más información sobre los anuncios personalizados y no personalizados

En esta guía se explica cómo usar el SDK de consentimiento para obtener el consentimiento de los usuarios. También se proporciona información sobre cómo reenviar el consentimiento al SDK de anuncios de Google para móviles cuando lo hayas obtenido.

Requisitos previos

CocoaPods (método preferido)

La forma más sencilla de importar el SDK a un proyecto de iOS es hacerlo mediante CocoaPods. Abre el archivo Podfile de tu proyecto y añade esta línea en el parámetro target de tu aplicación:

pod 'PersonalizedAdConsent'

A continuación, en la línea de comandos, ejecuta lo siguiente:

pod install --repo-update

Si es la primera vez que utilizas CocoaPods, consulta la documentación oficial para obtener información sobre cómo crear y usar archivos Podfile.

Descarga manual

También puedes descargar o clonar el código fuente del SDK directamente y seguir estas instrucciones para incluirlo en tu proyecto:

  1. En el Finder, arrastra el archivo PersonalizedAdConsent.xcodeproj a tu proyecto.

  2. Ve a la pestaña Build Phases (Fases de compilación). En Target Dependencies (Dependencias de destino), haz clic en el botón con el signo + y añade PersonalizedAdConsent como destino.

  3. Haz clic con el botón derecho en tu proyecto y selecciona Add Files to "MyProject" (Añadir archivos a "Mi proyecto"). Desplázate a PersonalizedAdConsent.bundle y marca la opción Create folder references (Crear referencias de carpetas).

    Cuando termines, debería aparecer PersonalizedAdConsent.bundle en la pestaña Build Phases (Fases de compilación) de la sección Copy Bundle Resources (Copiar recursos de paquete).

Antes de usar cualquier otro método en el SDK de consentimiento, debes actualizar el estado del consentimiento para asegurarte de que el SDK dispone de la información más reciente sobre los proveedores de tecnología publicitaria que has seleccionado en la interfaz de usuario de AdMob. Si la lista de proveedores ha cambiado desde que el usuario dio su consentimiento por última vez, el estado del consentimiento vuelve a ser desconocido.

Si no usas la mediación

Si no usas la mediación, tienes dos opciones para obtener el consentimiento usando este SDK.

Una opción consiste en usar el SDK de consentimiento para presentar un formulario de consentimiento renderizado por Google a los usuarios. El formulario de consentimiento muestra una lista con los proveedores de tecnología publicitaria que has seleccionado en la interfaz de AdMob. Con esta opción, el SDK de consentimiento almacenará la respuesta del usuario.

La otra opción es utilizar el SDK de consentimiento para generar de forma dinámica la lista completa de proveedores de tecnología publicitaria a partir de los datos de AdMob, tal y como se explica en la sección Obtención de consentimiento gestionada por el editor. Ten en cuenta que, en este caso, tendrás que determinar cómo poner la lista de proveedores a disposición de los usuarios y presentarles tu propio formulario de consentimiento.

Cuando el usuario tome una decisión sobre el consentimiento, puedes pedir al SDK que la almacene, tal y como se explica en la sección Almacenar los consentimientos gestionados por el editor.

Si un usuario solo da su consentimiento para recibir anuncios no personalizados, tendrás que reenviárselo al SDK de anuncios de Google para móviles.

Si usas la mediación de AdMob

Puedes usar el SDK de consentimiento para generar de forma dinámica la lista completa de proveedores de tecnología publicitaria a partir de los datos de AdMob, tal y como se explica en la sección Obtención de consentimiento gestionada por el editor. Tendrás que determinar qué proveedores de tecnología publicitaria adicionales de otras redes debes presentar a tus usuarios a la hora de solicitarles su consentimiento.

Los desarrolladores de aplicaciones tienen que obtener el consentimiento de los usuarios tanto para los proveedores de tecnología publicitaria indicados por el SDK de consentimiento como para los de otras redes publicitarias. También debes almacenar manualmente las respuestas a la solicitud de consentimiento de los usuarios y, si el usuario solo ha aceptado recibir anuncios no personalizados, reenviar el consentimiento al SDK de anuncios de Google para móviles.

Por el momento, Google no puede obtener ni gestionar los consentimientos de las redes de mediación, por lo que tendrás que hacerlo por separado con cada red publicitaria. Estamos colaborando estrechamente con todas nuestras redes de mediación de código abierto y con varias versiones para ofrecer documentación actualizada sobre cómo reenviar los consentimientos. Las siguientes redes de mediación ya cuentan con esta documentación:

Actualizar el estado del consentimiento

Si utilizas el SDK de consentimiento, te recomendamos que determines el estado del consentimiento del usuario cada vez que abra la aplicación. Para ello, llama a requestConsentInfoUpdateForPublisherIdentifiers:completionHandler: en una instancia de PACConsentInformation.

Swift

import PersonalizedAdConsent
...
class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    PACConsentInformation.sharedInstance.
    requestConsentInfoUpdate(
    forPublisherIdentifiers: ["pub-0123456789012345"])
    {(_ error: Error?) -> Void in
      if let error = error {
        // Consent info update failed.
      } else {
        // Consent info update succeeded. The shared PACConsentInformation
        // instance has been updated.
      }
    }
  }

Objective‑C

#import <PersonalizedAdConsent/PersonalizedAdConsent.h>
...
@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  [PACConsentInformation.sharedInstance
      requestConsentInfoUpdateForPublisherIdentifiers:@[ @"pub-0123456789012345" ]
          completionHandler:^(NSError *_Nullable error) {
            if (error) {
              // Consent info update failed.
            } else {
              // Consent info update succeeded. The shared PACConsentInformation
              // instance has been updated.
            }
          }];
}

La llamada a requestConsentInfoUpdateForPublisherIdentifiers:completionHandler: requiere dos argumentos:

  • Una matriz de IDs de editor válidos y completamente activados a los que tu aplicación solicite anuncios. Localizar tu ID de editor

  • Un bloque que acepta un valor NSError como parámetro de entrada y proporciona información sobre solicitudes de actualización de consentimiento fallidas.

Si la información de consentimiento se actualiza correctamente, el método PACConsentInformation.sharedInstance.consentStatus proporciona el estado actualizado del consentimiento, que puede tener los siguientes valores:

Estado del consentimiento Definición
PACConsentStatusPersonalized El usuario ha dado su consentimiento para que se le muestren anuncios personalizados.
PACConsentStatusNonPersonalized El usuario ha dado su consentimiento para que se le muestren anuncios no personalizados.
PACConsentStatusUnknown El usuario no ha dado ni denegado su consentimiento para que se le muestren anuncios personalizados o no personalizados.

Cuando la información de consentimiento se haya actualizado correctamente, también podrás usar el método PACConsentInformation.sharedInstance.requestLocationInEEAOrUnknown para comprobar si el usuario se encuentra en el Espacio Económico Europeo o si la ubicación de la solicitud es desconocida.

Si la propiedad requestLocationInEEAOrUnknown es NO, significa que el usuario no se encuentra en el Espacio Económico Europeo y no se requiere su consentimiento para cumplir la Política de Consentimiento de Usuarios de la Unión Europea. Por lo tanto, puedes solicitar anuncios al SDK de anuncios de Google para móviles.

Si la propiedad requestLocationInEEAOrUnknown es YES:

  • Si el valor de PACConsentStatus es PACConsentStatusPersonalized o PACConsentStatusNonPersonalized, significa que el usuario ya ha dado su consentimiento, por lo que puedes reenviárselo al SDK de anuncios de Google para móviles.

  • Si el valor del consentimiento del usuario es PACConsentStatusUnknown, consulta la sección Obtener el consentimiento que aparece a continuación, en la que se explica cómo usar los métodos de utilidades para obtener el consentimiento.

El SDK de consentimiento de Google ofrece dos formas de recopilar el consentimiento de un usuario:

Recuerda que debes ofrecer a los usuarios la opción de cambiar o revocar el consentimiento.

El formulario de consentimiento renderizado por Google es un formulario configurable a pantalla completa que se muestra sobre el contenido de tu aplicación. Puedes configurarlo para ofrecer al usuario distintas combinaciones de las siguientes opciones:

  • Dar su consentimiento para ver anuncios personalizados.
  • Dar su consentimiento para ver anuncios no personalizados.
  • Usar una versión de pago de la aplicación en lugar de ver anuncios.

Revisa detenidamente el mensaje de consentimiento: el texto que aparece de forma predeterminada puede resultar adecuado si usas Google para monetizar tu aplicación, pero no podemos ofrecerte asesoramiento legal para determinar cuál es el que mejor se adapta a tu caso. Para cambiar el mensaje de consentimiento del formulario renderizado por Google, modifica el archivo consentform.html incluido en el SDK de consentimiento según sea necesario.

El formulario de consentimiento renderizado por Google se configura y se muestra mediante la clase PACConsentForm. En el siguiente fragmento de código, puedes ver cómo crear un elemento PACConsentForm que incluya las tres opciones de consentimiento:

Swift

// TODO: Replace with your app's privacy policy url.
guard let privacyUrl = URL(string: "https://www.your.com/privacyurl"),
  let form = PACConsentForm(applicationPrivacyPolicyURL: privacyUrl) else {
    print("incorrect privacy URL.")
    return
}
form.shouldOfferPersonalizedAds = true
form.shouldOfferNonPersonalizedAds = true
form.shouldOfferAdFree = true

Objective‑C

// TODO: Replace with your app's privacy policy url.
NSURL *privacyURL = [NSURL URLWithString:@"https://www.your.com/privacyurl"];
PACConsentForm *form = [[PACConsentForm alloc] initWithApplicationPrivacyPolicyURL:privacyURL];
form.shouldOfferPersonalizedAds = YES;
form.shouldOfferNonPersonalizedAds = YES;
form.shouldOfferAdFree = YES;

A continuación se describen las propiedades de PACConsentForm con más detalle:

shouldOfferPersonalizedAds
Indica si el formulario de consentimiento debe mostrar una opción de anuncios personalizados. El valor predeterminado es YES.
shouldOfferNonPersonalizedAds
Indica si el formulario de consentimiento debe mostrar una opción de anuncios no personalizados. El valor predeterminado es YES.
shouldOfferAdFree
Indica si el formulario de consentimiento debe mostrar una opción de aplicación sin anuncios. El valor predeterminado es NO.

Después de crear y configurar un objeto PACConsentForm, invoca el método loadWithCompletionHandler: de PACConsentForm para cargar el formulario de consentimiento, tal y como se muestra a continuación:

Swift

form.load {(_ error: Error?) -> Void in
  print("Load complete.")
  if let error = error {
    // Handle error.
    print("Error loading form: \(error.localizedDescription)")
  } else {
    // Load successful.
  }
}

Objective‑C

[form loadWithCompletionHandler:^(NSError *_Nullable error) {
  NSLog(@"Load complete. Error: %@", error);
  if (error) {
    // Handle error.
  } else {
    // Load successful.
  }
}];

Para mostrar al usuario el formulario de consentimiento renderizado por Google, llama a presentFromViewController:dismissCompletion: en un PACConsentForm cargado, tal y como se muestra a continuación:

Swift

form.present(from: self) { (error, userPrefersAdFree) in
      if let error = error {
        // Handle error.
      } else if userPrefersAdFree {
        // User prefers to use a paid version of the app.
      } else {
        // Check the user's consent choice.
        let status =
             PACConsentInformation.sharedInstance.consentStatus
      }
    }

Objective‑C

 [form presentFromViewController:self
     dismissCompletion:^(NSError *_Nullable error, BOOL userPrefersAdFree) {
       if (error) {
         // Handle error.
       } else if (userPrefersAdFree) {
         // The user prefers to use a paid version of the app.
       } else {
         // Check the user's consent choice.
         PACConsentStatus status =
             PACConsentInformation.sharedInstance.consentStatus;
       }
     }];

La llamada a presentFromViewController:dismissCompletion: requiere dos argumentos:

  • Un UIViewController desde el que mostrar el formulario.

  • Un bloque que acepta los valores NSError y BOOL como parámetros de entrada. El valor NSError indica si se ha producido un error al mostrar el formulario de consentimiento. El valor BOOL userPrefersAdFree tiene un valor YES cuando el usuario elige usar una versión de pago de la aplicación en lugar de ver anuncios.

Cuando el usuario selecciona una opción y cierra el formulario, el SDK de consentimiento guarda su elección y llama al bloque dismissCompletion:. Puedes leer la elección del usuario y reenviar el consentimiento al SDK de anuncios de Google para móviles.

Obtención de consentimiento gestionada por el editor

Si decides obtener el consentimiento por tu cuenta, puedes usar la propiedad adProviders de la clase PACConsentInformation para obtener los proveedores de tecnología publicitaria asociados a los ID de editor que se usan en tu aplicación. Debes obtener el consentimiento de los usuarios para toda la lista de proveedores de tecnología publicitaria que has configurado para tus ID de editor.

Antes de acceder a la propiedad adProviders de PACConsentInformation, debes esperar a que se actualice correctamente el estado del consentimiento del usuario, tal y como se describe en la sección Actualizar estado del consentimiento.

Swift

let adProviders = PACConsentInformation.sharedInstance.adProviders

Objective‑C

NSArray *adProviders = PACConsentInformation.sharedInstance.adProviders;

A continuación, podrás usar la lista de proveedores de anuncios para obtener el consentimiento por tu cuenta.

Cuando obtengas el consentimiento, registra el PACConsentStatus correspondiente a la respuesta del usuario mediante la propiedad status de la clase PACConsentInformation.

Swift

PACConsentInformation.sharedInstance.consentStatus = .personalized

Objective‑C

PACConsentInformation.sharedInstance.consentStatus = PACConsentStatusPersonalized;

Tras comunicar el consentimiento al SDK, puedes reenviárselo al SDK de anuncios de Google para móviles.

Para ello, solo tienes que repetir los pasos indicados en la sección Obtener el consentimiento cuando el usuario cambie el estado de su consentimiento.

Si el editor sabe que el usuario no tiene la edad para dar su consentimiento legal, se debe incluir en todas las solicitudes de anuncios el parámetro TFUA (etiqueta para indicar que los usuarios no tienen edad para dar su consentimiento legal en Europa). Para incluir esta etiqueta en todas las solicitudes de anuncios realizadas desde tu aplicación, define la propiedad tagForUnderAgeOfConsent como YES. Este ajuste se aplicará a todas las solicitudes de anuncios posteriores.

Swift

PACConsentInformation.sharedInstance.isTaggedForUnderAgeOfConsent = true

Objective‑C

PACConsentInformation.sharedInstance.tagForUnderAgeOfConsent = YES;

Si habilitas el parámetro TFUA, el formulario de consentimiento renderizado por Google no podrá cargarse. Todas las solicitudes de anuncios que incluyan esta etiqueta dejarán de ser aptas para mostrar anuncios personalizados y para el remarketing. El parámetro TFUA inhabilita las solicitudes a proveedores de tecnología publicitaria de terceros, como píxeles de medición de anuncios y servidores de anuncios de terceros.

Para eliminar el parámetro TFUA de las solicitudes de anuncios, define la propiedad tagForUnderAgeOfConsent como NO.

Pruebas

El comportamiento del SDK de consentimiento varía en función del valor de PACConsentInformation.sharedInstance.requestLocationInEEAOrUnknown. Por ejemplo, el formulario de consentimiento no se carga si el usuario no se encuentra en el EEE.

Para que sea más fácil probar la aplicación dentro y fuera del EEE, el SDK de consentimiento admite las opciones de depuración, que puedes configurar antes de llamar a otros métodos en el SDK de consentimiento.

  1. Obtén el ID de publicidad de tu dispositivo. Puedes usar el siguiente código para registrarlo:

    #import <AdSupport/AdSupport.h>
    // ...
    
    NSLog(@"Advertising ID: %@",
          ASIdentifierManager.sharedManager.advertisingIdentifier.UUIDString);

    A continuación, ve a la consola para obtenerlo:

    Advertising ID: 41E538F6-9C98-4EF2-B3EE-D7BD8CAF8339
  2. Designa el dispositivo como un dispositivo de prueba con el ID de publicidad de la consola:

    PACConsentInformation.sharedInstance.debugIdentifiers =
        @[ @"41E538F6-9C98-4EF2-B3EE-D7BD8CAF8339" ];
  3. Por último, asigna el parámetro debugGeography al área geográfica que quieras usar en las pruebas.

    // Geography appears as in EEA for debug devices.
    PACConsentInformation.sharedInstance.debugGeography = PACDebugGeographyEEA;
    // Geography appears as not in EEA for debug devices.
    PACConsentInformation.sharedInstance.debugGeography = PACDebugGeographyNotEEA;

Cuando completes estos pasos, las llamadas para actualizar el estado del consentimiento tendrán en cuenta el área geográfica de depuración que hayas establecido.

El código de esta sección se puede usar con cualquier versión del SDK de anuncios de Google para móviles, tanto si has usado el SDK de consentimiento como si no.

El SDK de anuncios de Google para móviles sirve anuncios personalizados de forma predeterminada. Si un usuario solo da su consentimiento para recibir anuncios no personalizados, puedes configurar un objeto GADRequest para especificar que solo se soliciten anuncios no personalizados. El siguiente código hace que se soliciten anuncios no personalizados sin tener en cuenta si el usuario se encuentra en el EEE.

Swift

let request = GADRequest()
let extras = GADExtras()
extras.additionalParameters = ["npa": "1"]
request.register(extras)

Objective‑C

GADRequest *request = [GADRequest request];
GADExtras *extras = [[GADExtras alloc] init];
extras.additionalParameters = @{@"npa": @"1"};
[request registerAdNetworkExtras:extras];

Si se solicitan anuncios no personalizados, la URL de solicitud de anuncio incluye actualmente &npa=1, pero se trata de un ajuste de implementación interno del SDK de anuncios de Google para móviles que podría cambiar.

Retrasar la medición de la aplicación (opcional)

De forma predeterminada, el SDK de anuncios de Google para móviles inicializa la medición de la aplicación y empieza a enviar datos de eventos a nivel de usuario a Google justo después de que se inicie la aplicación. Gracias a este comportamiento, puedes habilitar las métricas de usuario de AdMob sin tener que hacer ningún cambio en el código.

Sin embargo, si tu aplicación requiere el consentimiento del usuario para poder enviar estos eventos, puedes retrasar la medición de la aplicación hasta que inicialices el SDK de anuncios para móviles expresamente o cargues un anuncio.

Para retrasar la medición de la aplicación, añade la clave GADDelayAppMeasurementInit con el valor booleano de YES al archivo Info.plist de la aplicación. Puedes hacerlo mediante programación:

<key>GADDelayAppMeasurementInit</key>
<true/>

También puedes utilizar el editor de lista de propiedades:

Preguntas frecuentes

¿Cuántos proveedores de tecnología publicitaria admite el SDK de consentimiento?
No hay ningún límite en el número de proveedores de tecnología publicitaria que puede habilitar el editor con el SDK de consentimiento.
¿La lista de proveedores de tecnología publicitaria que muestra el SDK se actualiza automáticamente si cambio mi selección en la interfaz de usuario de AdMob?
Así es. Si haces algún cambio en la lista de proveedores de tecnología publicitaria de la interfaz de usuario de AdMob, los cambios se propagarán a los servidores de anuncios de Google en una hora aproximadamente.