Получение согласия с Платформой обмена сообщениями пользователей

Предпосылки

ПрочитайтеКак требования IAB влияют на запросы согласия ЕС .

Введение

В соответствии с Политикой Google в отношении согласия пользователей из ЕС вы должны раскрывать определенную информацию своим пользователям в Европейской экономической зоне (ЕЭЗ), а также в Великобритании, и получать их согласие на использование файлов cookie или других локальных хранилищ, если это требуется по закону, а также на использование персональных данных ( например AdID) для показа рекламы. Эта политика отражает требования Директивы ЕС по электронной конфиденциальности и Общего регламента по защите данных (GDPR).

Чтобы помочь издателям выполнять свои обязанности в соответствии с этой политикой, Google предлагает SDK User Messaging Platform (UMP), который заменяет предыдущий SDK Consent с открытым исходным кодом . UMP SDK был обновлен для поддержки последних стандартов IAB. Мы также упростили процесс настройки форм согласия и перечисления рекламных партнеров. Все эти настройки теперь можно легко настроить вКонфиденциальность и обмен сообщениями AdMob .

Рекомендуется загружать форму каждый раз, когда пользователь запускает ваше приложение, даже если вы определили, что согласие не требуется, чтобы форма была готова к отображению, если пользователь захочет изменить свои настройки согласия.

В этом руководстве рассказывается, как установить SDK, внедрить решения IAB и включить функции тестирования.

Установить с помощью Gradle

Включите библиотеку в build.gradle вашего приложения:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.google.android.ump:user-messaging-platform:2.0.0'
}

Не забудьте синхронизировать Gradle, когда закончите.

Добавьте идентификатор приложения в AndroidManifest.xml

Получите идентификатор приложения, следуя инструкциям Справочного центра .

Добавьте идентификатор своего приложения в AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.rewardedinterstitialexample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="YOUR-APP-ID"/>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Использование SDK

SDK предназначен для линейного использования. Шаги для использования SDK:

  1. Запросить последнюю информацию о согласии.
  2. Проверьте, требуется ли согласие.
  3. Проверьте, доступна ли форма, и если да, загрузите форму.
  4. Представить форму.
  5. Предоставьте пользователям возможность изменить свое согласие.

Рекомендуется запрашивать обновление информации о согласии при каждом запуске приложения. Это определит, должен ли ваш пользователь предоставить согласие.

Ява

import android.os.Bundle;
import com.google.android.ump.ConsentForm;
import com.google.android.ump.ConsentInformation;
import com.google.android.ump.ConsentRequestParameters;
import com.google.android.ump.FormError;
import com.google.android.ump.UserMessagingPlatform;

public class MainActivity extends AppCompatActivity {
  private ConsentInformation consentInformation;
  private ConsentForm consentForm;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set tag for underage of consent. Here false means users are not underage.
    ConsentRequestParameters params = new ConsentRequestParameters
        .Builder()
        .setTagForUnderAgeOfConsent(false)
        .build();

    consentInformation = UserMessagingPlatform.getConsentInformation(this);
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
          @Override
          public void onConsentInfoUpdateSuccess() {
            // The consent information state was updated.
            // You are now ready to check if a form is available.
          }
        },
        new ConsentInformation.OnConsentInfoUpdateFailureListener() {
          @Override
          public void onConsentInfoUpdateFailure(FormError formError) {
            // Handle the error.
          }
        });
  }
}

Котлин

import android.os.Bundle
import com.google.android.ump.*

class MainActivity : AppCompactActivity() {
  private lateinit var consentInformation: ConsentInformation
  private var consentForm: ConsentForm? = null

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Set tag for underage of consent. Here false means users are not underage.
    val params = ConsentRequestParameters.Builder()
        .setTagForUnderAgeOfConsent(false)
        .build()

    consentInformation = UserMessagingPlatform.getConsentInformation(this)
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        {
          // The consent information state was updated.
          // You are now ready to check if a form is available.
        },
        { formError ->
          // Handle the error.
        }
    )
  }
}

Загрузите форму, если она доступна

После того как вы решили, что будете запрашивать согласие пользователя, следующим шагом будет определение доступности формы.

Существует множество причин, по которым форма может быть недоступна, например:

  • У пользователя включено ограниченное отслеживание рекламы.
  • Вы отметили пользователя как младше возраста согласия.

Чтобы проверить, доступна ли форма, используйте метод isConsentFormAvailable() экземпляра ConsentInformation . Добавьте метод-оболочку для загрузки формы:

Ява

...
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
          @Override
          public void onConsentInfoUpdateSuccess() {
            // The consent information state was updated.
            // You are now ready to check if a form is available.
            if (consentInformation.isConsentFormAvailable()) {
              loadForm();
            }
          }
        },
        new ConsentInformation.OnConsentInfoUpdateFailureListener() {
          @Override
          public void onConsentInfoUpdateFailure(FormError formError) {
            // Handle the error.
          }
        });
}

public void loadForm() {

}

Котлин

...
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        {
          // The consent information state was updated.
          // You are now ready to check if a form is available.
          if (consentInformation.isConsentFormAvailable) {
            loadForm()
          }
        },
        { formError ->
          // Handle the error.
        }
    )
}

private fun loadForm() {

}

Чтобы загрузить форму, вы будете использовать статический loadConsentForm() в классе UserMessagingPlatform . Этот метод должен вызываться только из основного потока. Измените метод loadForm() следующим образом:

Ява

public void loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this, new UserMessagingPlatform.OnConsentFormLoadSuccessListener() {
        @Override
        public void onConsentFormLoadSuccess(ConsentForm consentForm) {
          MainActivity.this.consentForm = consentForm;
        }
      },
      new UserMessagingPlatform.OnConsentFormLoadFailureListener() {
        @Override
        public void onConsentFormLoadFailure(FormError formError) {
          // Handle the error.
        }
      });
}

Котлин

private fun loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this,
      { consentForm ->
        this.consentForm = consentForm
      },
      { formError ->
        // Handle the error.
      }
  )
}

Предъявите форму, если требуется

Чтобы представить форму, используйте метод show() экземпляра ConsentForm . Вы должны определить, требуется ли пользователю согласие до представления формы. Чтобы проверить, требуется ли согласие, проверьте метод getConsentStatus() объекта ConsentInformation , который возвращает перечисление типа ConsentInformation.ConsentStatus . Возможны четыре значения:

  • ConsentStatus.UNKNOWN : Неизвестный статус согласия.
  • ConsentStatus.REQUIRED : согласие пользователя требуется, но еще не получено.
  • ConsentStatus.NOT_REQUIRED : согласие пользователя не требуется. Например, пользователь не находится в ЕЭЗ или Великобритании.
  • ConsentStatus.OBTAINED : согласие пользователя получено. Персонализация не определена.

Измените метод loadForm() следующим образом:

Ява

public void loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this, new UserMessagingPlatform.OnConsentFormLoadSuccessListener() {
        @Override
        public void onConsentFormLoadSuccess(ConsentForm consentForm) {
          MainActivity.this.consentForm = consentForm;
          if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.REQUIRED) {
            consentForm.show(
                MainActivity.this,
                    new ConsentForm.OnConsentFormDismissedListener() {
                      @Override
                      public void onConsentFormDismissed(@Nullable FormError formError) {
                        // Handle dismissal by reloading form.
                        loadForm();
                      }
                    });
          }
        }
      },
      new UserMessagingPlatform.OnConsentFormLoadFailureListener() {
        @Override
        public void onConsentFormLoadFailure(FormError formError) {
          // Handle the error.
        }
      });
}

Котлин

private fun loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this,
      { consentForm ->
        this.consentForm = consentForm
        if (consentInformation.consentStatus == ConsentInformation.ConsentStatus.REQUIRED) {
          consentForm.show(this) { formError ->
            // Handle dismissal by reloading form.
            loadForm()
          }
        }
      },
      { formError ->
        // Handle the error.
      }
  )
}

Если согласие не требуется, вы можете сохранить ссылку на форму, чтобы ваш пользователь мог изменить свой статус согласия.

Тестирование

Заставить географию

UMP SDK предоставляет способ проверить поведение вашего приложения, как если бы устройство находилось в ЕЭЗ, с помощью setDebugGeography() в ConsentDebugSettings.Builder .

Вам нужно будет указать хэш-идентификатор вашего тестового устройства в настройках отладки вашего приложения, чтобы использовать функции отладки. Если вы вызываете requestConsentInfoUpdate() без установки этого значения, ваше приложение будет регистрировать требуемый хэш идентификатора при запуске.

Ява

ConsentDebugSettings debugSettings = new ConsentDebugSettings.Builder(this)
    .setDebugGeography(ConsentDebugSettings
        .DebugGeography
        .DEBUG_GEOGRAPHY_EEA)
    .addTestDeviceHashedId("TEST-DEVICE-HASHED-ID")
    .build();

ConsentRequestParameters params = new ConsentRequestParameters
    .Builder()
    .setConsentDebugSettings(debugSettings)
    .build();

consentInformation = UserMessagingPlatform.getConsentInformation(this);
consentInformation.requestConsentInfoUpdate(
    this,
    params,
    new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
      @Override
      public void onConsentInfoUpdateSuccess() {
        // The consent information state was updated.
        // You are now ready to check if a form is available.
      }
    },
    new ConsentInformation.OnConsentInfoUpdateFailureListener() {
      @Override
      public void onConsentInfoUpdateFailure(FormError formError) {
        // Handle the error.
      }
    });

Котлин

val debugSettings = ConsentDebugSettings.Builder(this)
    .setDebugGeography(ConsentDebugSettings
        .DebugGeography
        .DEBUG_GEOGRAPHY_EEA)
    .addTestDeviceHashedId("TEST-DEVICE-HASHED-ID")
    .build()

val params = ConsentRequestParameters
    .Builder()
    .setConsentDebugSettings(debugSettings)
    .build()

consentInformation = UserMessagingPlatform.getConsentInformation(this)
consentInformation.requestConsentInfoUpdate(
    this,
    params,
    {
      // The consent information state was updated.
      // You are now ready to check if a form is available.
    },
    { formError ->
      // Handle the error.
    }
  )

Чтобы заставить SDK обрабатывать устройство так, как будто оно не находится в ЕЭЗ или Великобритании, используйте DebugGeography.DEBUG_GEOGRAPHY_NOT_EEA . Обратите внимание, что настройки отладки работают только на тестовых устройствах. Эмуляторы не нужно добавлять в список идентификаторов устройств, поскольку по умолчанию для них включено тестирование.

При тестировании приложения с помощью UMP SDK может оказаться полезным сбросить состояние SDK, чтобы можно было имитировать первую установку пользователя. SDK предоставляет для этого метод reset .

Ява

consentInformation.reset();

Котлин

consentInformation.reset()

Измерение задержки в приложении (необязательно)

По умолчанию Google Mobile Ads SDK инициализирует измерение приложения и начинает отправлять данные о событиях на уровне пользователя в Google сразу после запуска приложения.Такое поведение при инициализации гарантирует, что вы сможете включить пользовательские показатели AdMob без внесения дополнительных изменений в код.

Однако, если ваше приложение требует согласия пользователя, прежде чем эти события могут быть отправлены, вы можете отложить измерение приложения, пока вы явно не инициализируете Mobile Ads SDK или не загрузите рекламу.

Чтобы отложить измерение приложения, добавьте следующий <meta-data> в файл AndroidManifest.xml .

<manifest>
     <application>
        <!-- Delay app measurement until MobileAds.initialize() is called. -->
        <meta-data
            android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
            android:value="true"/>
    </application>
</manifest>

Посредничество

Если вы используете посредничество, вам нужно будет обрабатывать согласие для ваших партнеров по посредничеству по-разному в зависимости от структуры согласия, которую вы решили использовать в своем приложении. Google поддерживает платформу согласия IAB, но также позволяет вам иметь собственное решение для получения согласия. Ниже приведены подробные сведения о том, как обращаться с посредничеством в рамках каждого из этих вариантов.Узнайте больше о нашем решении для получения согласия .

Ни UMP SDK, ни Mobile Ads SDK не передают информацию о согласии партнерам по посредничеству. Вместо этого при использовании решения IAB UMP SDK записывает информацию о состоянии согласия в локальное хранилище, и за чтение соответствующих ключей отвечает SDK каждого партнера по посредничеству. Обязательно проверьте каждую стороннюю сеть, чтобы определить, поддерживают ли они решение IAB.

Если вы используете собственное решение для получения согласия, вы обязаны уведомить сторонние SDK о статусе согласия вашего приложения. Для получения подробной информации о том, как передать информацию о согласии соответствующим третьим сторонам, обратитесь к руководству по интеграции каждого партнера-посредника для деталей реализации.

Код в этом разделе можно использовать с любой версией Google Mobile Ads SDK. Его также можно использовать независимо от того, использовали ли вы Consent SDK для получения согласия.

По умолчанию Google Mobile Ads SDK показывает персонализированную рекламу. Если пользователь дал согласие на получение только неперсонализированной рекламы, вы можете настроить объект AdRequest , чтобы указать, что следует запрашивать только неперсонализированную рекламу. Следующий код вызывает запрос неперсонализированной рекламы независимо от того, находится ли пользователь в ЕЭЗ:

Ява

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

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

Котлин

val extras = Bundle()
extras.putString("npa", "1")

val request = AdRequest.Builder()
    .addNetworkExtrasBundle(AdMobAdapter::class.java, extras)
    .build()

Если запрашивается неперсонализированная реклама, URL-адрес запроса рекламы в настоящее время включает &npa=1 . Однако обратите внимание, что это внутренние детали реализации Google Mobile Ads SDK, которые могут быть изменены.