Untuk mengatasi persetujuan GDPR AdMob di sebuah Capacitor aplikasi, gunakan Platform Pesan Pengguna Google (UMP) SDK: minta informasi persetujuan pada setiap peluncuran, tunjukkan formulir persetujuan jika diperlukan, dan hanya inisialisasi iklan ketika canRequestAds is true. You also need a privacy options entry point so users can change their choice, and on iOS the UMP flow should come before the App Tracking Transparency prompt. This guide shows the full flow with two setups: a plugin that wraps UMP in JavaScript, and @capgo/capacitor-admob Apakah UMP itu dan mengapa AdMob membutuhkannya
Apa yang dilakukan UMP dan mengapa AdMob memerlukannya
Since January 2024, Google requires publishers that serve ads to users in the EEA, the UK and Switzerland to use a Google-certified consent management platform (CMP) integrated with the IAB Transparency and Consent Framework (TCF). The UMP SDK is Google’s own certified CMP, free and built into the AdMob console.
Mendeteksi apakah pengguna berada di wilayah yang membutuhkan persetujuan.
- Mendeteksi apakah pengguna berada di wilayah yang membutuhkan persetujuan.
- Menampilkan pesan persetujuan yang Anda konfigurasi di AdMob, dalam bahasa pengguna.
- Menyimpan pilihan pengguna sebagai string TC pada perangkat (kunci standar
IABTCF_pada iOS danUserDefaultsdi iOS danSharedPreferencespada perangkat Android), yang Google Mobile Ads SDK dan mitra mediasi membaca ketika meminta iklan.
Anda juga dapat menggunakan UMP untuk regulasi privasi negara bagian AS, yang AdMob sebutkan sebagai "pesan negara bagian AS", dari console yang sama.
Langkah 1: Buatlah pesan di AdMob
Pergi ke console AdMob, lalu: Pengaturan Privasi & Pesan:
- Buat pesan Pesan Regulasi Eropa Pilih pesan (GDPR). Pilih aplikasi mana yang berlaku, bahasa, dan daftar mitra iklan Anda.
- Opsional membuat sebuah Negara Bagian AS Pesan.
- Buat iOS, buatlah Penjelasan IDFA Pesan ini akan ditampilkan jika Anda berencana untuk meminta Transparansi Pengikatan Aplikasi. UMP akan menampilkan pesan ini sebelum prompt ATT sistem.
- Publikasikan pesan-pesan tersebut. Pesan yang belum dipublikasikan tidak akan ditampilkan.
Jika formulir itu tidak pernah muncul di aplikasi Anda kemudian, pesan yang belum dipublikasikan atau tidak diassign adalah hal pertama untuk diperiksa.
Langkah 2: Tentukan Urutan Operasi
Urutan yang paling umum digunakan untuk aplikasi:
- Aplikasi dimulai.
- Minta informasi persetujuan update dengan UMP (setiap peluncuran).
- Jika diperlukan, muat dan tampilkan formulir persetujuan.
- Jika
canRequestAdsMulai iklan mobile jika SDK benar. - Tampilkan entri "Pengaturan Privasi" di layar pengaturan Anda ketika UMP mengatakan bahwa pengaturan privasi diperlukan.
Google juga memungkinkan memulai iklan mobile SDK secara paralel dengan permintaan persetujuan ketika canRequestAds sudah benar dari sesi sebelumnya. Hal ini memperpendek waktu untuk menampilkan iklan untuk pengguna yang kembali.
Pilihan A: plugin yang menggabungkan UMP dalam JavaScript
@capacitor-community/admob versi 8 mendukung Capacitor 8) mengungkapkan metode UMP secara langsung: requestConsentInfo, showConsentForm, showPrivacyOptionsForm dan resetConsentInfo.
bun add @capacitor-community/admob
bunx cap sync
import {
AdMob,
AdmobConsentStatus,
AdmobConsentDebugGeography,
} from '@capacitor-community/admob';
export async function initAdsWithConsent(isDebug: boolean) {
await AdMob.initialize();
let info = await AdMob.requestConsentInfo(
isDebug
? {
debugGeography: AdmobConsentDebugGeography.EEA,
testDeviceIdentifiers: ['YOUR_TEST_DEVICE_ID'],
}
: undefined,
);
if (info.isConsentFormAvailable && info.status === AdmobConsentStatus.REQUIRED) {
info = await AdMob.showConsentForm();
}
// The enum value is the string 'REQUIRED'
const showPrivacyEntry = String(info.privacyOptionsRequirementStatus) === 'REQUIRED';
return { canRequestAds: info.canRequestAds, showPrivacyEntry };
}
export async function openPrivacyOptions() {
await AdMob.showPrivacyOptionsForm();
}
Plugin ini adalah satu-satunya kecuali dari urutan di atas: README-nya memerlukan AdMob.initialize() sebelum requestConsentInfo()dan pada iOS, formulir persetujuan tidak dapat dipresentasikan sampai initialize() telah berjalan. initialize() Mulai SDK tetapi tidak meminta iklan, jadi aturan yang berlaku adalah tidak pernah memuat iklan sebelum canRequestAds benar. Jika Anda membutuhkan SDK untuk tetap berhenti sampai pengguna telah menjawab, gunakan Pilihan B, di mana persetujuan berjalan sebelum AdMob.start().
Periksa canRequestAds sebelum setiap muat iklan, bukan hanya pada startup, karena pengguna dapat menarik kembali persetujuan dari formulir privasi.
Pilihan B: @capgo/capacitor-admob dengan bridge UMP native
@capgo/capacitor-admob memberikan Anda AdMob.start(), konfigurasi permintaan, banner, interstitial, rewarded dan interstitial rewarded iklan, plus otorisasi pelacakan iOS. Ini tidak menggabungkan UMP, jadi Anda menambahkan plugin lokal aplikasi kecil yang menjalankan alur persetujuan sebelum Anda memanggil AdMob.start().
bun add @capgo/capacitor-admob
bunx cap sync
Tambahkan SDK UMP
- iOS: tambahkan Google’s
GoogleUserMessagingPlatformpaket dengan Swift Package Manager (Capacitor 8 proyek menggunakan SPM secara default), atau pod CocoaPods dengan nama yang sama jika proyek Anda masih menggunakan CocoaPods. - Android: di
android/app/build.gradle:
dependencies {
implementation "com.google.android.ump:user-messaging-platform:<latest version>"
}
Pilih versi terbaru dari repository Maven Google.
plugin iklan iOS
Buat ios/App/App/ConsentPlugin.swift:
import Capacitor
import UserMessagingPlatform
@objc(ConsentPlugin)
public class ConsentPlugin: CAPPlugin, CAPBridgedPlugin {
public let identifier = "ConsentPlugin"
public let jsName = "Consent"
public let pluginMethods: [CAPPluginMethod] = [
CAPPluginMethod(name: "gather", returnType: CAPPluginReturnPromise),
CAPPluginMethod(name: "showPrivacyOptions", returnType: CAPPluginReturnPromise),
]
@objc func gather(_ call: CAPPluginCall) {
let parameters = RequestParameters()
DispatchQueue.main.async {
ConsentInformation.shared.requestConsentInfoUpdate(with: parameters) { error in
if let error = error {
call.reject(error.localizedDescription)
return
}
guard let vc = self.bridge?.viewController else {
call.reject("No view controller")
return
}
ConsentForm.loadAndPresentIfRequired(from: vc) { formError in
if let formError = formError {
call.reject(formError.localizedDescription)
return
}
call.resolve(self.state())
}
}
}
}
@objc func showPrivacyOptions(_ call: CAPPluginCall) {
DispatchQueue.main.async {
guard let vc = self.bridge?.viewController else {
call.reject("No view controller")
return
}
ConsentForm.presentPrivacyOptionsForm(from: vc) { formError in
if let formError = formError {
call.reject(formError.localizedDescription)
return
}
call.resolve(self.state())
}
}
}
private func state() -> [String: Any] {
return [
"canRequestAds": ConsentInformation.shared.canRequestAds,
"privacyOptionsRequired":
ConsentInformation.shared.privacyOptionsRequirementStatus == .required,
]
}
}
Mendaftarkannya dari sebuah CAPBridgeViewController turunan kelas, dan atur kelas tersebut pada pengontrol tampilan di Main.storyboard:
import Capacitor
class MainViewController: CAPBridgeViewController {
override open func capacitorDidLoad() {
bridge?.registerPluginInstance(ConsentPlugin())
}
}
plugin iklan Android
Buat android/app/src/main/java/com/example/app/ConsentPlugin.java (gunakan nama paket Anda):
package com.example.app;
import com.getcapacitor.JSObject;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;
import com.getcapacitor.annotation.CapacitorPlugin;
import com.google.android.ump.ConsentInformation;
import com.google.android.ump.ConsentRequestParameters;
import com.google.android.ump.UserMessagingPlatform;
@CapacitorPlugin(name = "Consent")
public class ConsentPlugin extends Plugin {
@PluginMethod
public void gather(PluginCall call) {
ConsentInformation info = UserMessagingPlatform.getConsentInformation(getContext());
ConsentRequestParameters params = new ConsentRequestParameters.Builder().build();
getActivity().runOnUiThread(() ->
info.requestConsentInfoUpdate(
getActivity(),
params,
() -> UserMessagingPlatform.loadAndShowConsentFormIfRequired(getActivity(), formError -> {
if (formError != null) {
call.reject(formError.getMessage());
return;
}
call.resolve(state(info));
}),
requestError -> call.reject(requestError.getMessage())
)
);
}
@PluginMethod
public void showPrivacyOptions(PluginCall call) {
getActivity().runOnUiThread(() ->
UserMessagingPlatform.showPrivacyOptionsForm(getActivity(), formError -> {
if (formError != null) {
call.reject(formError.getMessage());
return;
}
call.resolve(state(UserMessagingPlatform.getConsentInformation(getContext())));
})
);
}
private JSObject state(ConsentInformation info) {
JSObject ret = new JSObject();
ret.put("canRequestAds", info.canRequestAds());
ret.put(
"privacyOptionsRequired",
info.getPrivacyOptionsRequirementStatus() ==
ConsentInformation.PrivacyOptionsRequirementStatus.REQUIRED
);
return ret;
}
}
Mendaftarkannya di MainActivity.java sebelumnya super.onCreate:
public class MainActivity extends BridgeActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
registerPlugin(ConsentPlugin.class);
super.onCreate(savedInstanceState);
}
}
Gunakan dari TypeScript
import { registerPlugin } from '@capacitor/core';
import { AdMob, BannerAd } from '@capgo/capacitor-admob';
interface ConsentState {
canRequestAds: boolean;
privacyOptionsRequired: boolean;
}
interface ConsentPlugin {
gather(): Promise<ConsentState>;
showPrivacyOptions(): Promise<ConsentState>;
}
const Consent = registerPlugin<ConsentPlugin>('Consent');
export async function startAds() {
let state: ConsentState;
try {
state = await Consent.gather();
} catch (err) {
console.warn('Consent flow failed', err);
return { showPrivacyEntry: false };
}
if (state.canRequestAds) {
await AdMob.start();
const banner = new BannerAd({
adUnitId: 'ca-app-pub-3940256099942544/2934735716', // Google test banner (iOS)
position: 'bottom',
});
await banner.show();
}
return { showPrivacyEntry: state.privacyOptionsRequired };
}
export const openPrivacyOptions = () => Consent.showPrivacyOptions();
Perubahan native code memerlukan pembangunan toko baru. Setelah itu, salinan persetujuan di layar pengaturan dan logika penempatan iklan dapat dikirimkan bersama dengan Capgo pembaruan hidup.
Langkah 3: tambahkan entri pilihan privasi
Ketika UMP melaporkan bahwa pilihan privasi diperlukan, Google mengharapkan cara yang terlihat untuk membuka kembali pilihan persetujuan. Tambahkan baris "Pengaturan privasi" ke halaman pengaturan dan sembunyikan ketika tidak diperlukan:
const { showPrivacyEntry } = await startAds();
document.querySelector('#privacy-row')?.toggleAttribute('hidden', !showPrivacyEntry);
document.querySelector('#privacy-row')?.addEventListener('click', () => openPrivacyOptions());
Setelah pengguna mengubah pilihan mereka, baca canRequestAds lagi sebelum permintaan iklan berikutnya.
Langkah 4: Aplikasi Tracking Transparansi pada iOS
ATT terpisah dari GDPR. ATT mengontrol akses ke IDFA pada iOS. Persetujuan GDPR mengontrol apakah dan bagaimana data pribadi dapat diproses. Biasanya Anda memerlukan kedua-duanya untuk pengguna Eropa pada iOS.
- Tambahkan
NSUserTrackingUsageDescriptionkeInfo.plist. - Biarkan UMP menampilkan pesan penjelasan IDFA dan trigger ATT, jika Anda telah mengonfigurasi pesan tersebut di AdMob. Jika tidak, minta ATT secara manual setelah aliran persetujuan.
With @capgo/capacitor-admob Anda dapat membaca dan meminta status ATT secara langsung:
import { AdMob, TrackingAuthorizationStatus } from '@capgo/capacitor-admob';
const { status } = await AdMob.trackingAuthorizationStatus();
if (status === TrackingAuthorizationStatus.notDetermined) {
await AdMob.requestTrackingAuthorization();
}
Capgo juga memiliki versi berdiri sendiri Pengaturan Transparansi Pemantauan Aplikasi Jika Anda memerlukan ATT untuk SDK lain. Jangan lupa untuk menyatakan tracking di manifest privasi Anda dan label privasi App Store, lihat di sini. Petunjuk Manifest Privasi.
Langkah 5: Uji dengan Geografi Pengembang
UMP hanya menampilkan formulir GDPR kepada pengguna yang berada di EEA, UK, atau Swiss. Untuk menguji di tempat lain:
- Jalankan aplikasi sekali dan cari baris log dari UMP dengan ID hash perangkat Anda.
- Tambahkan sebagai perangkat uji dan atur geografi debug ke EEA. Dengan plugin komunitas, lakukan
debugGeographyketestDeviceIdentifierskerequestConsentInfoDi jembatan asli, aturDebugSettingspada iOS danConsentDebugSettingspada Android hanya pada tahap debug saja. - Reset persetujuan antar jalankan (
resetConsentInfo()dalam plugin komunitas,ConsentInformation.reset()secara native) sehingga formulir menampilkan lagi.
Jangan kirim pengaturan debug dalam tahap rilis. Tutup mereka dengan flag pembangunan.
Langkah 6: tangani kesalahan tanpa menghalangi aplikasi
Consent requests can fail: no network, misconfigured app ID, or no published message. Treat failure as “no ads for now”, not as a crash:
- If
requestConsentInfoUpdategagal tetapicanRequestAdswas true from a previous session, you can still request ads. - Jika formulir gagal dimuat, catatnya dan coba lagi pada peluncuran berikutnya.
- Tidak pernah tampilkan iklan saat formulir persetujuan sedang ditampilkan.
Pengaturan Masalah
Formulir tidak pernah ditampilkan. Pesan tidak dipublikasikan, tidak ditugaskan ke ID aplikasi ini, atau Anda berada di luar EEA tanpa geografi debug. Periksa ID aplikasi AdMob di Info.plist dan AndroidManifest.xml Sesuai dengan konsol.
Formulir ditampilkan setiap peluncuran. Pengguna menutupnya tanpa pilihan, atau Anda memanggil reset di produksi code.
canRequestAds Palsu untuk pengguna AS. Anda menerbitkan pesan negara AS dan pengguna menolak penjualan atau berbagi. Tampilkan iklan terbatas hanya melalui SDK, jangan lewati.
Mitras mediasi tidak mendapatkan persetujuan. Pastikan setiap adapter mitra sudah terupdate dan terdaftar dalam daftar mitra iklan pesan GDPR Anda.
Prompt iOS ATT tidak pernah muncul. NSUserTrackingUsageDescription atau pengguna mengaktifkan "Izinkan Aplikasi untuk Minta untuk Mengikuti" di Pengaturan.
Kemampuan komplian di luar formulir
UMP mengelola sisi iklan. Aplikasi Anda masih memerlukan kebijakan privasi yang mencantumkan AdMob, aturan penyimpanan data, dan cara mengelola permintaan data. Daftar komplian GDPR menangani bagian aplikasi lainnya.