Memperoleh Persetujuan dengan Platform Perpesanan Pengguna

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Prasyarat

Baca Pengaruh persyaratan IAB terhadap pesan izin Uni Eropa.

Pengantar

Berdasarkan Kebijakan Izin Pengguna Uni Eropa Google, Anda harus membuat pengungkapan tertentu kepada pengguna di Wilayah Ekonomi Eropa (EEA) bersama dengan Inggris Raya dan mendapatkan izin mereka untuk menggunakan cookie atau penyimpanan lokal lainnya, jika diwajibkan secara hukum, dan untuk menggunakan data pribadi (seperti AdID) guna menayangkan iklan. Kebijakan ini mencerminkan persyaratan dalam ePrivacy Directive dan General Data Protection Regulation (GDPR) Uni Eropa.

Untuk mendukung penayang dalam memenuhi kewajibannya berdasarkan kebijakan ini, Google menawarkan User Messaging Platform (UMP) SDK, yang menggantikan Consent SDK open source sebelumnya. UMP SDK telah diupdate untuk mendukung standar IAB terbaru. Kami juga menyederhanakan proses penyiapan formulir izin dan mencantumkan partner iklan. Semua konfigurasi ini sekarang dapat ditangani dengan mudah dipesan Privasi AdMob &.

Praktik terbaiknya adalah memuat formulir setiap kali pengguna meluncurkan aplikasi Anda, meskipun Anda menentukan izin tidak diperlukan, sehingga formulir siap ditampilkan jika pengguna ingin mengubah setelan izinnya.

Panduan ini membahas cara menginstal SDK, menerapkan solusi IAB, dan mengaktifkan fitur pengujian.

Menginstal dengan Gradle

Sertakan library di build.gradle aplikasi:

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'
}

Jangan lupa untuk menyinkronkan Gradle saat Anda selesai.

Tambahkan ID aplikasi ke AndroidManifest.xml

Dapatkan ID aplikasi Anda dengan mengikuti petunjuk Pusat Bantuan.

Tambahkan ID aplikasi Anda ke 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>

Menggunakan SDK

SDK didesain untuk digunakan secara linear. Langkah-langkah untuk menggunakan SDK adalah:

  1. Minta informasi izin terbaru.
  2. Periksa apakah izin diperlukan.
  3. Periksa apakah formulir tersedia dan jika ya, muat formulir.
  4. Mempresentasikan formulir.
  5. Menyediakan cara bagi pengguna untuk mengubah izin mereka.

Sebaiknya Anda meminta pembaruan informasi izin setiap kali aplikasi diluncurkan. Hal ini akan menentukan apakah pengguna perlu memberikan izin atau tidak.

Java

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.
          }
        });
  }
}

Kotlin

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

Memuat formulir jika tersedia

Setelah Anda menentukan bahwa Anda akan meminta izin kepada pengguna, langkah berikutnya adalah menentukan apakah formulir tersedia.

Ada berbagai alasan mengapa formulir mungkin tidak tersedia, misalnya:

  • Pengguna mengaktifkan pelacakan iklan terbatas.
  • Anda memberi tag pengguna di bawah usia dewasa.

Untuk memeriksa apakah formulir tersedia, gunakan metode isConsentFormAvailable() pada instance ConsentInformation. Tambahkan metode wrapper untuk memuat formulir:

Java

...
    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() {

}

Kotlin

...
    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() {

}

Untuk memuat formulir, Anda akan menggunakan metode loadConsentForm() statis di class UserMessagingPlatform. Metode ini hanya boleh dipanggil dari thread utama. Ubah metode loadForm() Anda seperti berikut:

Java

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.
        }
      });
}

Kotlin

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

Presentasikan formulir jika diperlukan

Untuk mempresentasikan formulir, gunakan metode show() pada instance ConsentForm. Anda harus menentukan apakah pengguna memerlukan izin sebelum menampilkan formulir tersebut. Untuk memeriksa apakah izin diperlukan, periksa metode getConsentStatus() pada objek ConsentInformation, yang menampilkan enum jenis ConsentInformation.ConsentStatus. Ada empat kemungkinan nilai:

  • ConsentStatus.UNKNOWN: Status izin tidak diketahui.
  • ConsentStatus.REQUIRED: Izin pengguna diperlukan tetapi belum diperoleh.
  • ConsentStatus.NOT_REQUIRED: Izin pengguna tidak diperlukan. Misalnya, pengguna tidak berada di EEA atau Inggris Raya.
  • ConsentStatus.OBTAINED: Izin pengguna diperoleh. Personalisasi tidak ditentukan.

Ubah metode loadForm() Anda seperti berikut:

Java

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.
        }
      });
}

Kotlin

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

Jika izin tidak diperlukan, Anda dapat mempertahankan referensi ke formulir, sehingga pengguna Anda dapat mengubah status izinnya.

Pengujian

Memaksa geografi

UMP SDK menyediakan cara untuk menguji perilaku aplikasi Anda seolah-olah perangkat berada di EEA menggunakan metode setDebugGeography() pada ConsentDebugSettings.Builder.

Anda harus memberikan ID yang di-hash perangkat pengujian di setelan debug aplikasi untuk menggunakan fungsi debug. Jika Anda memanggil requestConsentInfoUpdate() tanpa menetapkan nilai ini, aplikasi Anda akan mencatat hash ID yang diperlukan saat dijalankan.

Java

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.
      }
    });

Kotlin

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

Untuk memaksa SDK agar memperlakukan perangkat seolah-olah tidak berada di EEA atau Inggris Raya, gunakan DebugGeography.DEBUG_GEOGRAPHY_NOT_EEA. Perhatikan bahwa setelan debug hanya berfungsi pada perangkat pengujian. Emulator tidak perlu ditambahkan ke daftar ID perangkat karena mengaktifkan pengujian secara default.

Dalam menguji aplikasi dengan UMP SDK, sebaiknya Anda mereset status SDK sehingga Anda dapat menyimulasikan pengalaman penginstalan pertama pengguna. SDK menyediakan metode reset untuk melakukannya.

Java

consentInformation.reset();

Kotlin

consentInformation.reset()

Tunda pengukuran aplikasi (opsional)

Secara default, Google Mobile Ads SDK menginisialisasi pengukuran aplikasi dan mulai mengirim data peristiwa tingkat pengguna ke Google segera saat aplikasi dimulai. Perilaku inisialisasi ini memastikan Anda dapat mengaktifkan metrik pengguna AdMob tanpa membuat perubahan kode tambahan.

Namun, jika aplikasi Anda memerlukan izin pengguna sebelum peristiwa ini dapat dikirim, Anda dapat menunda pengukuran aplikasi hingga secara eksplisit menginisialisasi Mobile Ads SDK atau memuat iklan.

Untuk menunda pengukuran aplikasi, tambahkan tag <meta-data> berikut di AndroidManifest.xml Anda.

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

Mediasi

Jika menggunakan mediasi, Anda harus menangani izin untuk partner mediasi secara berbeda berdasarkan framework izin yang dipilih untuk digunakan di aplikasi Anda. Google mendukung Framework Izin IAB, tetapi juga memungkinkan Anda memiliki solusi izin kustom sendiri. Berikut adalah detail tentang cara menangani mediasi untuk setiap opsi ini. Pelajari solusi izin kami lebih lanjut.

Baik UMP SDK maupun Mobile Ads SDK tidak meneruskan informasi izin ke partner mediasi. Sebaliknya, saat menggunakan solusi IAB, UMP SDK menulis informasi status izin ke penyimpanan lokal dan merupakan tanggung jawab setiap SDK partner mediasi untuk membaca kunci yang sesuai. Pastikan untuk menghubungi setiap jaringan pihak ketiga untuk menentukan apakah mereka mendukung solusi IAB atau tidak.

Jika menggunakan solusi izin kustom, Anda bertanggung jawab untuk memberi tahu SDK pihak ketiga tentang status izin aplikasi Anda. Untuk mengetahui detail tentang cara meneruskan informasi izin kepada pihak ketiga yang relevan, lihat panduan integrasi setiap partner mediasi untuk mengetahui detail penerapannya.

Kode di bagian ini dapat digunakan dengan versi Google Mobile Ads SDK apa pun. Metode ini juga dapat digunakan terlepas dari apakah Anda menggunakan Consent SDK untuk mengumpulkan izin.

Perilaku default Google Mobile Ads SDK adalah menayangkan iklan yang dipersonalisasi. Jika pengguna telah mengizinkan untuk hanya menerima iklan yang tidak dipersonalisasi, Anda dapat mengonfigurasi objek AdRequest untuk menentukan bahwa hanya iklan yang tidak dipersonalisasi yang harus diminta. Kode berikut menyebabkan iklan yang tidak dipersonalisasi diminta terlepas dari apakah pengguna berada di EEA atau tidak:

Java

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

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

Kotlin

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

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

Jika iklan yang tidak dipersonalisasi diminta, URL permintaan iklan saat ini menyertakan &npa=1. Namun, perhatikan bahwa ini adalah detail implementasi internal Google Mobile Ads SDK dan dapat berubah sewaktu-waktu.