Как запросить неперсонализированную рекламу AdMob с помощью нового SDK платформы единой системы обмена сообщениями для Android
В настоящее время я использую (устаревшую) библиотеку согласия Google, чтобы запросить согласие на персонализированную рекламу от европейских пользователей. В документации указано, что если статус согласия пользователя уже установлен на PERSONALIZED или NON_PERSONALIZED, вы можете переслать согласие на Google Mobile Ads SDK с помощью:
Bundle extras = new Bundle();
extras.putString("npa", "1");
AdRequest request = new AdRequest.Builder()
.addNetworkExtrasBundle(AdMobAdapter.class, extras)
.build();
Теперь я хочу перейти на новый SDK платформы единой системы обмена сообщениями для Android . Документация довольно проста, но в ней объясняется только, как получить согласие, а не как его использовать . Означает ли это, что при использовании нового UMP SDK для Android нам больше не нужно задавать "npa"
is "1"
при запросе рекламы AdMob для пользователя, который не дал согласия на персонализированную рекламу?
ИЗМЕНИТЬ 25 августа 2020 г.
Вчера я нашел этот разговор, в котором кто-то из команды Mobile Ads SDK ответил на тот же вопрос, который я задал здесь. Он говорит, что:
Устаревшая «передача согласия» через npa = 1 будет учитываться нашим SDK до дальнейшего уведомления.
ИЗМЕНИТЬ 31 августа 2020 г.
Я начал новый разговор, задаю тот же вопрос, что и в этом посте, но не получаю ответа.
Ответы
С новой платформой единой системы обмена сообщениями Google работает как платформа управления согласием . Эти CMP используют строку TCF для хранения предпочтений согласия пользователя. Google проверяет эту строку TCF, чтобы увидеть, какие объявления могут быть показаны;
Согласно документации Google :
Google будет показывать персонализированную рекламу при соблюдении всех следующих критериев:
- Конечный пользователь дает Google согласие на хранение и / или доступ к информации на устройстве.
- Создайте персонализированный рекламный профиль
- Выберите персонализированную рекламу
И законный интерес (или согласие, если издатель настраивает свой CMP для его запроса) создается для Google, чтобы:
- Выберите базовые объявления
- Измеряйте эффективность рекламы
- Применяйте маркетинговые исследования, чтобы получить представление об аудитории
- Разрабатывать и улучшать продукты
Если требования согласия для персонализированной рекламы не выполняются, Google будет показывать неперсонализированную рекламу при соблюдении всех следующих критериев:
- Хранить и / или получать доступ к информации на устройстве
У Google есть законный интерес (или согласие, если издатель настраивает свой CMP для его запроса):
- Выберите базовые объявления
-
Измеряйте эффективность рекламы -
Применяйте маркетинговые исследования, чтобы получить представление об аудитории -
Разрабатывать и улучшать продукты - Включите Google в списке поставщиков.
Обновление от 20 октября: по-видимому, 3,4,5 больше не нужны для показа неличной рекламы. SO @Georg за предоставление этой информации.
Если ни одно из перечисленных выше условий не выполнено, Google не будет показывать рекламу.
Надеюсь, это ответит на ваш вопрос, но если вам нужна дополнительная информация, дайте мне знать!
Просто запомните эти предложения:
Никогда не сдавайтесь, и стакан всегда наполовину полон :-) -> для оптимизма!
Так что больше не будет решения изменить то, что действует в Европе. Что мы можем сделать:
После того, как пользователь нажмет «Согласен» или «Отправить» в форме выбора финансирования, некоторые параметры будут сохранены в общих настройках по умолчанию на Android, когда диалоговое окно будет закрыто !! То же самое происходит и с IOS (так что каждый может легко запрограммировать это решение и быстро
Как и раньше, предлагать ограниченное приложение - «наше» право. Это означает, что, как и раньше, вы можете предложить облегченную версию с ограничениями и полную версию для покупки.
Итак, что мы можем сделать, так это прочитать ключи pref.
Ключи предпочтений для структуры прозрачности и согласия описаны здесь: https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#in-app-details
Нам нужны следующие ключи pref для чтения (Android или IOS):
IABTCF_PurposeLegitimateInterests
IABTCF_VendorConsents
IABTCF_PurposeConsents
Таким образом, в зависимости от этих значений мы можем проверить, показываются ли объявления или объявления "не" показываются после закрытия формы.
Затем вы можете заблокировать важные параметры в своем приложении и, возможно, показать диалоговое окно:
«Реклама отключена. Вы используете облегченную версию приложения прямо сейчас. Вы можете передумать или купить профессиональную версию и т. Д. И т. Д.»
-> Может быть, добавить кнопки после объяснения «включить рекламу» и снова показать форму или «купить Pro»
Вам решать, что вы здесь делаете!
Мой класс на котлине или на Java!
Что вам нужно сделать: поместите UMP SDK из Google в свою зависимость в Gradle и настройте варианты финансирования для своего приложения в своей учетной записи admob! Затем напишите свои распорядки, чтобы настроить формы выбора финансирования.
При выборе финансирования добавьте только "Google" в качестве поставщика!
https://developers.google.com/admob/ump/android/quick-start
Вам все равно придется самостоятельно программировать много вещей, чтобы все работало, но этот класс поможет вам, по крайней мере, получить информацию, показывается ли реклама или нет. Также вы должны узнать, как все работает, чтобы глубже погрузиться в это.
ПОМНИТЕ !!!
Всегда тестируйте с тестовыми идентификаторами в admob !! Никогда не используйте производственные идентификаторы, иначе у вас могут возникнуть проблемы с учетной записью! Создайте новое тестовое приложение в admob с тестовыми идентификаторами, только если вы хотите сначала провести тесты !!!
Как пользоваться классом:
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
}
Код 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;
}
}
}
}
Код Котлина:
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
}
}
}
}