Cómo solicitar anuncios de AdMob no personalizados con el nuevo SDK de la plataforma de mensajería unificada para Android

Aug 18 2020

Actualmente estoy usando la biblioteca de consentimiento de Google (obsoleta) para solicitar el consentimiento para anuncios personalizados de usuarios europeos. La documentación especifica que si el estado de consentimiento de un usuario ya está configurado como PERSONALIZADO o NON_PERSONALIZED, puede reenviar el consentimiento al SDK de anuncios de Google para móviles con:

Bundle extras = new Bundle();
extras.putString("npa", "1");

AdRequest request = new AdRequest.Builder()
    .addNetworkExtrasBundle(AdMobAdapter.class, extras)
    .build();

Ahora quiero migrar al nuevo SDK de la plataforma de mensajería unificada para Android . La documentación es bastante sencilla, pero solo explica cómo obtener el consentimiento, no cómo usarlo . ¿Significa esto que cuando usamos el nuevo SDK de UMP para Android, ya no tenemos que configurar el "npa"es "1"cuando solicitamos un anuncio de AdMob para un usuario que no dio su consentimiento para los anuncios personalizados?


EDITAR 25 Ago 2020

Ayer encontré esta conversación en la que alguien del equipo del SDK de anuncios móviles respondió a la misma pregunta que hice aquí. El dijo que:

Nuestro SDK respetará el legado " Aprobación del consentimiento" a través de npa = 1 hasta nuevo aviso.


EDITAR 31 Ago 2020

Comencé una nueva conversación en la que hago la misma pregunta que la de esta publicación, pero no obtengo ninguna respuesta.

Respuestas

1 Alexander Oct 07 2020 at 21:12

Con la nueva plataforma de mensajería unificada, Google funciona como una plataforma de gestión de consentimiento . Estos CMP utilizan una cadena TCF para almacenar las preferencias de consentimiento del usuario. Google verifica esta cadena TCF para ver qué anuncios se pueden mostrar;

Según la documentación de Google :

Google ofrecerá anuncios personalizados cuando se cumplan todos los siguientes criterios:

  1. El usuario final otorga a Google su consentimiento para almacenar y / o acceder a información en un dispositivo.
  2. Crea un perfil de anuncios personalizado
  3. Seleccionar anuncios personalizados

Y se establece un interés legítimo (o consentimiento, cuando un editor configura su CMP para solicitarlo) para que Google:

  1. Seleccionar anuncios básicos
  2. Medir el rendimiento de los anuncios
  3. Aplicar la investigación de mercado para generar información sobre la audiencia
  4. Desarrollar y mejorar productos

Si no se cumplen los requisitos de consentimiento para los anuncios personalizados, Google publicará anuncios no personalizados cuando se cumplan todos los siguientes criterios:

  1. Almacenar y / o acceder a información en un dispositivo

Se establece un interés legítimo (o consentimiento, cuando un editor configura su CMP para solicitarlo) para que Google:

  1. Seleccionar anuncios básicos
  2. Medir el rendimiento de los anuncios
  3. Aplicar la investigación de mercado para generar información sobre la audiencia
  4. Desarrollar y mejorar productos
  5. Habilite Google en la lista de proveedores.

Actualización 20 de octubre: Aparentemente, 3,4,5 ya no son necesarios para mostrar anuncios no personales SO @Georg para proporcionar esta información.

Si no se cumple ninguna de las condiciones anteriores, Google no mostrará anuncios.

Espero que esto responda a su pregunta, pero si necesita más información, hágamelo saber.

Frank Nov 03 2020 at 05:44

Solo recuerda estas frases:

Nunca te rindas y el vaso siempre está medio lleno :-) -> ¡para ser optimista!

Así que "ya no" habrá una solución para cambiar lo que es válido en Europa. Lo que podemos hacer es esto:

Después de que el usuario presione "Aceptar" o presione "Enviar" en el formulario de opciones de financiación, algunos parámetros se guardarán en las preferencias compartidas predeterminadas en Android cuando se cierre el cuadro de diálogo. Lo mismo sucede en IOS (para que todos puedan programar esta solución fácilmente en rápido también

Como antes, es "nuestro" derecho ofrecer una aplicación limitada. Eso significa que, como antes, puede ofrecer una versión ligera con restricciones y una versión completa para comprar.

Entonces, lo que podemos hacer es leer las claves de preferencia.

Las claves de preferencias para el Marco de Transparencia y Consentimiento se describen aquí: https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#in-app-details

Necesitamos las siguientes claves de preferencia para leer (Android o IOS):

IABTCF_PurposeLegitimateInterests

IABTCF_VendorConsents

IABTCF_PurposeConsents

Entonces, dependiendo de estos valores, podemos verificar si los anuncios se publican o si los anuncios "no" se publican después de descartar el formulario.

Luego puede bloquear opciones importantes en su aplicación y tal vez mostrar un cuadro de diálogo:

"Los anuncios están desactivados. Estás usando la versión ligera de la aplicación en este momento. Puedes cambiar de opinión o comprar una versión pro, etc., etc."

-> Tal vez agregar botones después de la explicación "habilitar anuncios" y mostrar el formulario nuevamente o "comprar Pro"

¡Depende de usted lo que está haciendo aquí!

¡Mi clase está en kotlin o java!

Lo que tiene que hacer: coloque el SDK de UMP de Google en su dependencia en gradle y configure opciones de financiación para su aplicación en su cuenta de admob. Luego, escriba sus rutinas para configurar los formularios de opciones de financiamiento.

En las opciones de financiación, agregue solo "Google" como proveedor.

https://developers.google.com/admob/ump/android/quick-start

Todavía tienes que programar muchas cosas por ti mismo para que todo siga funcionando, pero esta clase te ayudará al menos a obtener la información si se publican anuncios o no. También debes informarte de cómo funciona todo para profundizar en esto.

RECUERDA !!!

¡Siempre pruebe con identificadores de prueba en admob! ¡Nunca use identificadores de producción o puede tener problemas con su cuenta! ¡Cree una nueva aplicación de prueba en admob con identificadores de prueba solo si desea hacer pruebas primero!

Cómo usar la clase:

Consentfunctions consentfunction; 


consentfunction = new Consentfunctions(this);



// Check if Ads are serving

if (consentfunction.AdsAreServing()) {

// No need to do anything because everything is fine

} else {

// Decide what to do here. Block important functions of your app
//  and open a help page with explanations etc. etc


}

Código Java:

public class ConsentFunctions {

private ConsentInformation consentInformation;

SharedPreferences.Editor editor;


  private Context mContext;



private String consinfosaved;

private String vendorconsent;

private SharedPreferences preferences;

private String LegitimateInterests;


public ConsentFunctions(Context context){

    mContext = context;


    preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
    



    consentInformation = UserMessagingPlatform.getConsentInformation(mContext);


}



public Boolean AdsAreServing() {

    vendorconsent = preferences.getString("IABTCF_VendorConsents", "");
    LegitimateInterests = preferences.getString("IABTCF_PurposeLegitimateInterests", "");


    // Not required = not in europe -- return true because everything is fine !
    if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.NOT_REQUIRED) {
        return true;
    }


    Boolean vendoractive = vendorconsent.contains("1");
    consinfosaved = preferences.getString("IABTCF_PurposeConsents", "0");

    switch (consinfosaved) {


        case "1011":    // Personal 1 - rest legitimate interest
        case "1111111011":  // Personal 2
        case "1111001011":  // Personal 3
        case "1000001011":  // Non personal ok
        case "1100001011":  // Non Peronal ok
        case "11":   // Non Personal ok - rest is legitimate interest
        case    "1111001001":
        case "1":  // Non personalized


        {

            // Check also if vendor is activated
            if (!vendoractive) {
                return false;

            }
            else {

                // Legitimate must be always =  0100111011 and vendor contains 1
                if (LegitimateInterests.equals("0100111011") || LegitimateInterests.equals("0100001011"))
                return true;
                else
                    return false;

            }

        }


        default: {


            return false;



        }



    }


}


}

Código Kotlin:

class ConsentFunctionsKotlin(private val mContext: Context) {


private val consentInformation: ConsentInformation
var editor: SharedPreferences.Editor


private var consinfosaved: String? = null
private var vendorconsent: String? = null
private val preferences: SharedPreferences
private var LegitimateInterests: String? = null



init {
    preferences = PreferenceManager.getDefaultSharedPreferences(mContext)
   
    consentInformation = UserMessagingPlatform.getConsentInformation(mContext)
}





fun AdsAreServing(): Boolean {
    vendorconsent = preferences.getString("IABTCF_VendorConsents", "")
    LegitimateInterests = preferences.getString("IABTCF_PurposeLegitimateInterests", "")


    // Not required = not in europe -- return true because everything is fine !
    if (consentInformation.consentStatus == ConsentInformation.ConsentStatus.NOT_REQUIRED) {
        return true
    }


    val vendoractive = vendorconsent!!.contains("1")
    consinfosaved = preferences.getString("IABTCF_PurposeConsents", "0")

    return when (consinfosaved) {
        "1111001001","1011", "1111111011", "1111001011", "1000001011", "1100001011", "11", "1" -> {


            // Check also if vendor is activated
            if (!vendoractive) {
                false
            } else {

                // Legitimate must be always =  0100111011 and vendor contains 1
                if (LegitimateInterests == "0100111011" || LegitimateInterests == "0100001011") true else false
            }
        }
        else -> {
            false
        }
    }


}

}