Saat Anda membaca dokumentasi Privacy Sandbox di Android, gunakan tombol Pratinjau Developer atau Beta untuk memilih versi program yang sedang Anda gunakan, karena petunjuknya dapat bervariasi.
Protected Audience API di Android (sebelumnya disebut FLEDGE) menyertakan Custom Audience API dan Ad Selection API. Platform teknologi iklan dan pengiklan dapat menggunakan API ini untuk menayangkan iklan yang disesuaikan berdasarkan interaksi aplikasi sebelumnya sehingga membatasi berbagi ID di seluruh aplikasi dan membatasi berbagi informasi interaksi aplikasi pengguna dengan pihak ketiga.
Custom Audience API berpusat di sekitar abstraksi "audiens kustom" yang mewakili sekelompok pengguna dengan niat yang sama. Pengiklan dapat mendaftarkan pengguna ke audiens kustom dan mengaitkan iklan yang relevan dengan audiens kustom tersebut. Informasi ini disimpan secara lokal dan dapat digunakan untuk menginformasikan bid pengiklan, pemfilteran iklan, dan rendering iklan.
Ad Selection API menyediakan framework yang memungkinkan beberapa developer menjalankan lelang secara lokal untuk audiens kustom. Untuk mencapai hal ini, sistem akan mempertimbangkan iklan yang relevan yang terkait dengan audiens kustom dan melakukan pemrosesan tambahan pada iklan yang ditampilkan oleh platform teknologi iklan ke perangkat.
Platform teknologi iklan dapat mengintegrasikan API ini untuk menerapkan pemasaran ulang yang tetap menjaga privasi pengguna. Dukungan untuk kasus penggunaan tambahan, seperti iklan instal aplikasi, direncanakan untuk rilis mendatang. Pelajari lebih lanjut Protected Audience API di Android dalam proposal desain.
Panduan ini menjelaskan cara menggunakan Protected Audience API di Android untuk melakukan hal berikut:
- Mengelola audiens kustom
- Menyiapkan dan menjalankan pemilihan iklan di perangkat
- Melaporkan tayangan iklan
Sebelum memulai
Sebelum Anda memulai, selesaikan hal-hal berikut:
- Menyiapkan lingkungan pengembangan Anda untuk Privacy Sandbox di Android.
- Instal image sistem ke perangkat yang didukung atau siapkan emulator yang menyertakan dukungan untuk Privacy Sandbox di Android.
Di terminal, aktifkan akses ke Protected Audience API (dinonaktifkan secara default) dengan perintah adb berikut.
adb shell device_config put adservices ppapi_app_allow_list \"*\"
Sertakan izin
ACCESS_ADSERVICES_CUSTOM_AUDIENCE
dalam manifes aplikasi Anda:<uses-permission android:name="android.permission.ACCESS_ADSERVICES_CUSTOM_AUDIENCE" />
Referensikan konfigurasi layanan iklan di elemen
<application>
manifes Anda:<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/ad_services_config" />
Tentukan resource XML layanan iklan yang dirujuk dalam manifes, seperti
res/xml/ad_services_config.xml
. Pelajari izin layanan iklan dan kontrol akses SDK lebih lanjut.<ad-services-config> <custom-audiences allowAllToAccess="true" /> </ad-services-config>
Secara default, Ad Selection API menerapkan batas jumlah maksimum memori yang dapat dialokasikan oleh skrip pelaporan lelang atau tayangan. Fitur pembatasan memori memerlukan WebView versi 105.0.5195.58 atau yang lebih tinggi. Platform ini menerapkan pemeriksaan versi dan panggilan ke
selectAds
API danreportImpression
API akan gagal jika hal ini tidak terpenuhi. Ada dua opsi untuk menyiapkannya:Opsi 1: Jalankan perintah adb berikut untuk menonaktifkan pemeriksaan ini:
adb device_config put fledge_js_isolate_enforce_max_heap_size false
Opsi 2: Instal WebView Beta dari Google Play Store. Versi ini harus sama dengan atau lebih tinggi dari versi yang disebutkan sebelumnya.
Bergabung dengan audiens kustom
Audiens kustom mewakili sekelompok pengguna yang memiliki niat atau minat sama seperti yang ditentukan oleh aplikasi pengiklan. Aplikasi atau SDK dapat menggunakan audiens kustom untuk menunjukkan audiens tertentu, seperti seseorang yang telah meninggalkan item dalam keranjang belanja. Untuk membuat atau bergabung dengan audiens kustom secara asinkron, lakukan hal berikut:
- Lakukan inisialisasi objek
CustomAudienceManager
. - Buat objek
CustomAudience
dengan menentukan parameter utama seperti paket pembeli dan nama yang relevan. Lalu, inisialisasi objekJoinCustomAudienceRequest
dengan objekCustomAudience
. - Panggil
joinCustomAudience()
asinkron dengan objekJoinCustomAudienceRequest
dan objekExecutor
danOutcomeReceiver
yang relevan.
Kotlin
val customAudienceManager: CustomAudienceManager =
context.getSystemService(CustomAudienceManager::class.java)
// Initialize a custom audience.
val audience = CustomAudience.Builder()
.setBuyer(buyer)
.setName(name)
...
.build()
// Initialize a custom audience request.
val joinCustomAudienceRequest: JoinCustomAudienceRequest =
JoinCustomAudienceRequest.Builder().setCustomAudience(audience).build()
// Request to join a custom audience.
customAudienceManager.joinCustomAudience(joinCustomAudienceRequest,
executor,
outcomeReceiver)
Java
CustomAudienceManager customAudienceManager =
context.getSystemService(CustomAudienceManager.class);
// Initialize a custom audience.
CustomAudience audience = new CustomAudience.Builder()
.setBuyer(buyer)
.setName(name)
...
.build();
// Initialize a custom audience request.
JoinCustomAudienceRequest joinCustomAudienceRequest =
new JoinCustomAudienceRequest.Builder().setCustomAudience(audience).build();
// Request to join a custom audience.
customAudienceManager.joinCustomAudience(joinCustomAudienceRequest,
executor,
outcomeReceiver);
Kombinasi parameter berikut secara unik mengidentifikasi setiap
objek CustomAudience
di perangkat:
owner
: Nama paket aplikasi pemilik. Secara implisit, nama ini ditetapkan ke nama paket aplikasi pemanggil.buyer
: ID untuk jaringan iklan pembeli yang mengelola iklan untuk audiens kustom ini.name
: Nama atau ID arbitrer untuk audiens kustom.
Memanggil joinCustomAudience()
berulang kali dengan instance yang berbeda dari
CustomAudience
memperbarui CustomAudience
yang ada dengan
cocok dengan parameter owner, buyer
, dan name
. Untuk membantu menjaga privasi,
hasil API tidak membedakan antara "creation" (pembuatan) dan "update".
Selain itu, CustomAudience
harus dibuat dengan parameter
yang diperlukan berikut:
- URL update harian: URL HTTPS dikueri setiap hari di latar belakang untuk mengupdate sinyal bidding pengguna audiens kustom, data bidding tepercaya, serta URL dan metadata render untuk iklan.
- URL logika bidding: URL HTTPS yang dikueri selama pemilihan iklan untuk mengambil logika bidding JavaScript pembeli. Lihat tanda tangan fungsi yang diperlukan dalam JavaScript ini.
- ID Render Iklan: ID arbitrer yang ditetapkan oleh teknologi iklan pembeli. Penetapan ini adalah pengoptimalan untuk menghasilkan payload untuk B&A.
Parameter opsional untuk objek CustomAudience
dapat mencakup:
- Waktu aktivasi: Audiens kustom hanya dapat berpartisipasi dalam pemilihan iklan dan update harian setelah waktu aktivasinya. Misalnya, waktu aktivasi bisa berguna untuk melibatkan pengguna aplikasi yang tidak aktif.
- Waktu habis masa berlaku: Waktu mendatang saat audiens kustom dihapus dari perangkat.
- Sinyal bidding pengguna: String JSON yang berisi sinyal pengguna, seperti lokalitas pilihan pengguna, yang digunakan oleh JavaScript logika bidding pembeli untuk menghasilkan bid selama proses pemilihan iklan. Format ini membantu platform teknologi iklan menggunakan kembali kode di seluruh platform dan memudahkan pemakaian dalam fungsi JavaScript.
- Data bidding tepercaya: URL HTTPS dan daftar string yang digunakan selama proses pemilihan iklan yang mengambil sinyal bidding dari server Kunci/Nilai yang tepercaya.
- Iklan: Daftar objek
AdData
yang sesuai dengan iklan yang berpartisipasi dalam pemilihan iklan. Setiap objekAdData
terdiri dari:- URL Render: URL HTTPS yang dikueri untuk merender iklan akhir.
- Metadata: Objek JSON yang diserialisasi sebagai string yang berisi informasi yang akan digunakan oleh logika bidding pembeli selama proses pemilihan iklan.
- Filter Iklan: Class yang berisi semua informasi yang diperlukan untuk penginstalan iklan dan pembatasan frekuensi penginstalan aplikasi selama pemilihan iklan.
Berikut adalah contoh pembuatan instance objek CustomAudience
:
Kotlin
// Minimal initialization of a CustomAudience object
val customAudience: CustomAudience = CustomAudience.Builder()
.setBuyer(AdTechIdentifier.fromString("my.buyer.domain.name"))
.setName("example-custom-audience-name")
.setDailyUpdateUrl(Uri.parse("https://DAILY_UPDATE_URL"))
.setBiddingLogicUrl(Uri.parse("https://BIDDING_LOGIC_URL"))
.build()
Java
// Minimal initialization of a CustomAudience object
CustomAudience customAudience = CustomAudience.Builder()
.setBuyer(AdTechIdentifier.fromString("my.buyer.domain.name"))
.setName("example-custom-audience-name")
.setDailyUpdateUrl(Uri.parse("https://DAILY_UPDATE_URL"))
.setBiddingLogicUrl(Uri.parse("https://BIDDING_LOGIC_URL"))
.build();
Menangani hasil joinCustomAudience()
Metode joinCustomAudience()
asinkron menggunakan objek OutcomeReceiver
untuk memberi sinyal hasil panggilan API.
- Callback
onResult()
menandakan bahwa audiens kustom berhasil dibuat atau diperbarui. - Callback
onError()
menandakan adanya dua kemungkinan kondisi.- Jika
JoinCustomAudienceRequest
diinisialisasi dengan argumen yang tidak valid,AdServicesException
akan menunjukkanIllegalArgumentException
sebagai penyebabnya. - Semua error lainnya akan menerima
AdServicesException
denganIllegalStateException
sebagai penyebabnya.
- Jika
Berikut adalah contoh penanganan hasil joinCustomAudience()
:
Kotlin
var callback: OutcomeReceiver<Void, AdServicesException> =
object : OutcomeReceiver<Void, AdServicesException> {
override fun onResult(result: Void) {
Log.i("CustomAudience", "Completed joinCustomAudience")
}
override fun onError(error: AdServicesException) {
// Handle error
Log.e("CustomAudience", "Error executing joinCustomAudience", error)
}
};
Java
OutcomeReceiver callback = new OutcomeReceiver<Void, AdServicesException>() {
@Override
public void onResult(@NonNull Void result) {
Log.i("CustomAudience", "Completed joinCustomAudience");
}
@Override
public void onError(@NonNull AdServicesException error) {
// Handle error
Log.e("CustomAudience", "Error executing joinCustomAudience", error);
}
};
Keluar dari audiens kustom
Jika pengguna tidak lagi memenuhi kriteria bisnis untuk audiens
kustom tertentu, aplikasi atau SDK dapat memanggil leaveCustomAudience()
untuk menghapus audiens
kustom dari perangkat. Untuk menghapus CustomAudience
berdasarkan parameter
uniknya, lakukan hal berikut:
- Lakukan inisialisasi objek
CustomAudienceManager
. - Lakukan inisialisasi
LeaveCustomAudienceRequest
denganbuyer
danname
audiens kustom. Untuk mempelajari kolom input ini lebih lanjut, baca "Bergabung dengan audiens kustom". - Panggil metode
leaveCustomAudience()
asinkron dengan objekLeaveCustomAudienceRequest
serta objekExecutor
danOutcomeReceiver
yang relevan.
Kotlin
val customAudienceManager: CustomAudienceManager =
context.getSystemService(CustomAudienceManager::class.java)
// Initialize a LeaveCustomAudienceRequest
val leaveCustomAudienceRequest: LeaveCustomAudienceRequest =
LeaveCustomAudienceRequest.Builder()
.setBuyer(buyer)
.setName(name)
.build()
// Request to leave a custom audience
customAudienceManager.leaveCustomAudience(
leaveCustomAudienceRequest,
executor,
outcomeReceiver)
Java
CustomAudienceManager customAudienceManager =
context.getSystemService(CustomAudienceManager.class);
// Initialize a LeaveCustomAudienceRequest
LeaveCustomAudienceRequest leaveCustomAudienceRequest =
new LeaveCustomAudienceRequest.Builder()
.setBuyer(buyer)
.setName(name)
.build();
// Request to leave a custom audience
customAudienceManager.leaveCustomAudience(
leaveCustomAudienceRequest,
executor,
outcomeReceiver);
Seperti halnya memanggil joinCustomAudience()
, OutcomeReceiver
menandakan
akhir panggilan API. Untuk membantu melindungi privasi, hasil error tidak
membedakan antara error internal dan argumen yang tidak valid. Callback onResult()
dipanggil saat panggilan API telah selesai, baik audiens kustom
yang cocok berhasil dihapus maupun tidak.
Menjalankan pemilihan iklan
Untuk menggunakan Protected Audience API untuk memilih iklan, panggil metode selectAds()
:
- Lakukan inisialisasi objek
AdSelectionManager
. - Buat objek
AdSelectionConfig
. - Panggil metode
selectAds()
asinkron dengan objekAdSelectionConfig
serta objekExecutor
danOutcomeReceiver
yang relevan.
Kotlin
val adSelectionManager: AdSelectionManager =
context.getSystemService(AdSelectionManager::class.java)
// Initialize AdSelectionConfig
val adSelectionConfig: AdSelectionConfig =
AdSelectionConfig.Builder().setSeller(seller)
.setDecisionLogicUrl(decisionLogicUrl)
.setCustomAudienceBuyers(customAudienceBuyers)
.setAdSelectionSignals(adSelectionSignals)
.setSellerSignals(sellerSignals)
.setPerBuyerSignals(perBuyerSignals)
.setBuyerContextualAds(
Collections.singletonMap(
contextualAds.getBuyer(), contextualAds
)
).build()
// Run ad selection with AdSelectionConfig
adSelectionManager.selectAds(
adSelectionConfig, executor, outcomeReceiver
)
Java
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
// Initialize AdSelectionConfig
AdSelectionConfig adSelectionConfig =
new AdSelectionConfig.Builder()
.setSeller(seller)
.setDecisionLogicUrl(decisionLogicUrl)
.setCustomAudienceBuyers(customAudienceBuyers)
.setAdSelectionSignals(adSelectionSignals)
.setSellerSignals(sellerSignals)
.setPerBuyerSignals(perBuyerSignals)
.setBuyerContextualAds(
Collections.singletonMap(contextualAds.getBuyer(), contextualAds)
)
.build();
// Run ad selection with AdSelectionConfig
adSelectionManager.selectAds(adSelectionConfig, executor, outcomeReceiver);
Metode selectAds()
memerlukan input AdSelectionConfig
, dan
Anda harus menentukan parameter wajib berikut:
- Penjual: ID untuk jaringan iklan penjual yang memulai pemilihan iklan.
- URL logika keputusan: URL HTTPS yang dikueri untuk mendapatkan logika JavaScript jaringan
iklan penjual.
- URL HTTPS: dikueri untuk mendapatkan logika JavaScript jaringan iklan penjual. Lihat tanda tangan fungsi yang diperlukan.
- URI bawaan: yang mengikuti format pemilihan iklan FLEDGE.
IllegalArgumentException
ditampilkan, jika URI bawaan yang tidak didukung atau salah format diteruskan.
- Pembeli audiens kustom: Daftar lengkap ID untuk jaringan iklan pembeli yang
diizinkan oleh penjual untuk berpartisipasi dalam proses pemilihan iklan.
ID pembeli ini sesuai dengan
CustomAudience.getBuyer()
audiens kustom yang berpartisipasi.
Parameter berikut dapat ditentukan secara opsional untuk pemilihan iklan yang lebih disesuaikan:
- Sinyal pemilihan iklan: Objek JSON, yang diserialisasi sebagai string, berisi
sinyal yang akan digunakan oleh JavaScript logika bidding pembeli yang diambil dari
CustomAudience.getBiddingLogicUrl()
. - Sinyal penjual: Objek JSON, yang diserialisasi sebagai string, yang berisi sinyal
yang digunakan oleh logika keputusan JavaScript yang diambil penjual dari
AdSelectionConfig.getDecisionLogicUrl()
. - Sinyal per pembeli: Peta objek JSON, yang diserialisasi sebagai string,
yang berisi sinyal untuk digunakan oleh JavaScript logika bidding pembeli tertentu
yang diambil dari
CustomAudience.getBiddingLogicUrl()
, yang diidentifikasi oleh kolom pembeli pada audiens kustom yang berpartisipasi. - Iklan kontekstual: Kumpulan kandidat iklan yang dikumpulkan langsung dari pembeli selama lelang yang berlangsung di luar lelang Audiens yang Dilindungi.
Setelah iklan dipilih, hasil, bid, dan sinyal akan dipertahankan secara internal
untuk pelaporan. Callback OutcomeReceiver.onResult()
menampilkan
AdSelectionOutcome
yang berisi:
- URL render untuk iklan pemenang yang diperoleh dari
AdData.getRenderUrl()
. - ID pemilihan iklan yang unik untuk pengguna perangkat. ID ini digunakan untuk melaporkan tayangan iklan.
Jika pemilihan iklan tidak berhasil diselesaikan karena alasan seperti
argumen tidak valid, waktu tunggu habis, atau konsumsi resource berlebih,
callback OutcomeReceiver.onError()
akan memberikan AdServicesException
dengan perilaku berikut:
- Jika pemilihan iklan dimulai dengan argumen yang tidak valid,
AdServicesException
akan menunjukkanIllegalArgumentException
sebagai penyebabnya. - Semua error lainnya akan menerima
AdServicesException
denganIllegalStateException
sebagai penyebabnya.
Iklan kontekstual
Protected Audience dapat menyertakan iklan kontekstual ke Protected Auction.
Iklan kontekstual harus dipilih di server teknologi iklan dan ditampilkan ke
perangkat di luar Dilindungi Audience API. Iklan kontekstual kemudian dapat disertakan
dalam lelang menggunakan AdSelectionConfig
saat iklan tersebut berfungsi sama
seperti pada iklan perangkat, termasuk kelayakan untuk pemfilteran iklan negatif. Setelah
lelang Audiens Dilindungi selesai, Anda perlu memanggil
reportImpression()
. Tindakan ini memanggil reportWin()
dalam iklan kontekstual pemenang, dengan
pola yang sama seperti pelaporan tayangan, untuk menerima iklan pemenang di
perangkat. Setiap iklan kontekstual membutuhkan pembeli, bid, link ke logika pelaporan,
URL render, dan metadata iklan.
Untuk men-deploy iklan kontekstual dalam aplikasi, aplikasi target harus membuat
objek ContextualAds
:
Kotlin
val contextualAds: ContextualAds =
Builder().setBuyer(AdTechIdentifier.fromString(mBiddingLogicUri.getHost()))
//Pass in your valid app install ads
.setDecisionLogicUri(mContextualLogicUri)
.setAdsWithBid(appInstallAd)
.build()
Java
ContextualAds contextualAds = new ContextualAds.Builder()
.setBuyer(AdTechIdentifier.fromString(mBiddingLogicUri.getHost()))
.setDecisionLogicUri(mContextualLogicUri)
//Pass in your valid app install ads
.setAdsWithBid(appInstallAd)
.build();
Objek ContextualAds
yang dihasilkan kemudian dapat diteruskan saat membuat
AdSelectionConfig
:
Kotlin
// Create a new ad
val noFilterAd: AdData = Builder()
.setMetadata(JSONObject().toString())
.setRenderUri(Uri.parse(baseUri + NO_FILTER_RENDER_SUFFIX))
.build()
val noFilterAdWithBid = AdWithBid(noFilterAd, NO_FILTER_BID)
contextualAds.getAdsWithBid().add(noFilterAdWithBid)
Java
// Create a new ad
AdData noFilterAd = new AdData.Builder()
.setMetadata(new JSONObject().toString())
.setRenderUri(Uri.parse(baseUri + NO_FILTER_RENDER_SUFFIX))
.build();
AdWithBid noFilterAdWithBid = new AdWithBid(noFilterAd, NO_FILTER_BID);
contextualAds.getAdsWithBid().add(noFilterAdWithBid);
Pemfilteran iklan instal aplikasi
Pemfilteran iklan instal aplikasi membantu Anda memfilter iklan penginstalan untuk aplikasi yang sudah diinstal di perangkat.
Langkah pertama dalam proses ini adalah menentukan pengiklan yang memiliki kemampuan untuk memfilter paket yang diinstal. Hal ini harus terjadi di aplikasi yang ingin Anda targetkan dengan iklan.
Kotlin
//Create a request for setting the app install advertisers
val adtech = AdTechIdentifier.fromString("your.enrolled.uri")
val adtechSet = setOf(adtech)
val request = SetAppInstallAdvertisersRequest(adtechSet)
//Set the app install advertisers in the ad selection manager
mAdSelectionManager.setAppInstallAdvertisers(
request,
mExecutor,
object : OutcomeReceiver<Any?, Exception?>() {
fun onResult(@NonNull ignoredResult: Any?) {
Log.v("[your tag]", "Updated app install advertisers")
}
fun onError(@NonNull error: Exception?) {
Log.e("[your tag]", "Failed to update app install advertisers", error)
}
})
Java
//Create a request for setting the app install advertisers
AdTechIdentifier adtech = AdTechIdentifier.fromString("your.enrolled.uri");
Set<AdTechIdentifier> adtechSet = Collections.singleton(adtech);
SetAppInstallAdvertisersRequest request = new SetAppInstallAdvertisersRequest(adtechSet);
//Set the app install advertisers in the ad selection manager
mAdSelectionManager.setAppInstallAdvertisers(
request,
mExecutor,
new OutcomeReceiver<Object, Exception>() {
@Override
public void onResult(@NonNull Object ignoredResult) {
Log.v("[your tag]", "Updated app install advertisers");
}
@Override
public void onError(@NonNull Exception error) {
Log.e("[your tag]", "Failed to update app install advertisers", error);
}
});
Saat kode sebelumnya dieksekusi, pengiklan yang diteruskan kemudian dapat memfilter aplikasi terinstal yang Anda tentukan selama pembuatan bid. Jika pengiklan perlu menghapus akses pengiklan ke status penginstalan aplikasi ini, jalankan lagi kode ini dengan menghapus informasi pengiklan.
Langkah berikutnya adalah menyiapkan pemfilteran iklan di dalam aplikasi penayang. Pihak yang
menayangkan iklan di dalam aplikasi penayang (kemungkinan besar berupa SDK sisi suplai)
harus melakukan inisialisasi objek AdFilters
mereka dengan informasi tentang iklan
yang terkait dengan aplikasi yang akan mereka tampilkan ingin memfilter:
Kotlin
// Instantiate AdFilters object with package names.
val filters: AdFilters = Builder().setAppInstallFilters(
Builder().setPackageNames(setOf("example.target.app")).build()
).build()
Java
// Instantiate AdFilters object with package names.
AdFilters filters = new AdFilters.Builder()
.setAppInstallFilters(
new AppInstallFilters.Builder()
.setPackageNames(Collections.singleton("example.target.app"))
.build())
.build();
Penayang sisi permintaan juga dapat menetapkan AdFilter
untuk iklan yang ada di dalam
audiens kustom mereka.
AdFilters
juga dapat diteruskan pada saat membuat instance objek AdData
baru:
Kotlin
// Instantiate an AdData object with the AdFilters created in the
// previous example.
val appInstallAd: AdData =
Builder().setMetadata("{ ... }") // Valid JSON string
.setRenderUri(Uri.parse("www.example-dsp1.com/.../campaign123.html"))
.setAdFilters(filters).build()
Java
// Instantiate an AdData object with the AdFilters created in the
// previous example.
AdData appInstallAd = new AdData.Builder()
.setMetadata("{ ... }") // Valid JSON string
.setRenderUri(Uri.parse("www.example-dsp1.com/.../campaign123.html"))
.setAdFilters(filters)
.build();
Pemfilteran batas frekuensi
Pemfilteran batas frekuensi memungkinkan teknologi iklan membatasi frekuensi iklan ditampilkan. Pemfilteran batas frekuensi mengurangi eksposur iklan yang berlebihan dan mengoptimalkan pemilihan iklan alternatif untuk kampanye iklan tertentu.
Ada dua komponen utama dari filter batas frekuensi: jenis peristiwa iklan dan kunci penghitung iklan. Jenis peristiwa iklan yang tersedia dan dapat digunakan adalah:
- Menang (segera hadir): Peristiwa menang menunjukkan bahwa iklan telah memenangkan lelang. Peristiwa menang akan otomatis diperbarui oleh Protected Audience API dan tidak dapat dipanggil langsung oleh developer. Data menang hanya dapat dilihat oleh iklan dalam audiens kustom tertentu.
- Tayangan: Terpisah dari
reportImpression
, pemanggil di perangkat (SSP atau MMP) menggunakanupdateAdCounterHistogram()
untuk memanggil peristiwa tayangan pada titik dalam kode yang dipilihnya. Peristiwa tayangan terlihat oleh semua iklan yang termasuk dalam DSP tertentu, dan tidak terbatas pada iklan dalam audiens kustom yang sama. - Tampilan: Peristiwa dipanggil oleh pemanggil di perangkat (SSP atau MMP) pada titik dalam
kode yang dipilih menggunakan panggilan ke
updateAdCounterHistogram()
. Peristiwa tampilan terlihat oleh semua iklan yang termasuk dalam DSP tertentu dan tidak terbatas pada iklan dalam Audiens Kustom yang sama. - Klik: Peristiwa dipanggil oleh pemanggil di perangkat (SSP atau MMP) pada titik dalam
kode yang dipilih menggunakan panggilan ke
updateAdCounterHistogram()
. Peristiwa klik terlihat oleh semua iklan yang termasuk dalam DSP tertentu dan tidak terbatas pada iklan dalam Audiens Kustom yang sama.
Di aplikasi penayang, SSP atau MMP yang ada di perangkat memanggil peristiwa
iklan. Saat updateAdCounterHistogram()
dipanggil, penghitung filter batas frekuensi
akan bertambah sehingga lelang mendatang akan memiliki informasi terbaru
tentang eksposur pengguna terhadap iklan tertentu. Jenis peristiwa iklan tidak
terikat secara paksa ke tindakan pengguna yang sesuai dan merupakan panduan yang diberikan untuk membantu
pemanggil membuat struktur sistem peristiwa. Untuk menambahkan penghitung iklan saat
peristiwa muncul, aktor di perangkat memberikan ID pemilihan iklan dari lelang iklan pemenang.
Kunci penghitung iklan adalah bilangan bulat arbitrer bertanda 32-bit yang ditetapkan oleh teknologi iklan pembeli, dan sesuai dengan kumpulan iklan tertentu seperti yang ditetapkan oleh DSP. Karena kunci penghitung iklan hanya terbatas pada iklan yang termasuk dalam DSP tertentu, kunci ini dapat dipilih tanpa tumpang-tindih dengan histogram dari teknologi iklan lainnya. Kunci penghitung iklan digunakan untuk menambah ID khusus DSP di seluruh iklan DSP atau dalam audiens kustom tertentu untuk memfilter iklan dari lelang di masa mendatang.
Kunci penghitung dapat dimanfaatkan untuk memprioritaskan iklan yang mungkin lebih menarik bagi pengguna tertentu berdasarkan interaksi mereka dengan iklan lain dari teknologi iklan pembeli tertentu. Misalnya, iklan yang telah menerima interaksi tingkat tinggi dari lelang iklan, tampilan, dan klik pemenang, menunjukkan titik data yang disimpulkan. Untuk mengilustrasikan hal ini lebih lanjut: iklan stik golf untuk tangan kiri mungkin menunjukkan bahwa pengguna tidak akan tertarik dengan stik untuk tangan kanan. Filter pembatasan frekuensi yang ditetapkan untuk kunci penghitung yang ditetapkan untuk iklan tangan kiri dapat memfilter iklan untuk tangan kanan.
Untuk menggunakan pembatasan frekuensi di lelang, Anda harus terlebih dahulu membuat
objek KeyedFrequencyCap
seperti ditunjukkan di bawah ini:
Kotlin
// Value used when incrementing frequency counter
val adCounterKey = 123
// Frequency cap exceeded after 2 counts
val keyedFrequencyCapForImpression: KeyedFrequencyCap = Builder(
adCounterKey, 2, Duration.ofSeconds(10)
).build()
// Frequency cap exceeded after 1 counts
val keyedFrequencyCapForImpression: KeyedFrequencyCap = Builder(
adCounterKey, 1, Duration.ofSeconds(10)
).build()
Java
// Value used when incrementing frequency counter
int adCounterKey = 123;
// Frequency cap exceeded after 2 counts
KeyedFrequencyCap keyedFrequencyCapForImpression =
new KeyedFrequencyCap.Builder(
adCounterKey, 2, Duration.ofSeconds(10)
).build();
// Frequency Cap exceeded after 1 counts
KeyedFrequencyCap keyedFrequencyCapForClick =
new KeyedFrequencyCap.Builder(
adCounterKey, 1, Duration.ofSeconds(10)
).build();
Setelah objek KeyedFrequencyCap
dibuat, Anda dapat meneruskannya ke
objek AdFilters
.
Kotlin
val filters: AdFilters = Builder()
.setFrequencyCapFilters(
Builder()
.setKeyedFrequencyCapsForImpressionEvents(
ImmutableObject.of(keyedFrequencyCapForImpression)
)
.setKeyedFrequencyCapsForClickEvents(
ImmutableObject.of(keyedFrequencyCapForClick)
)
).build()
Java
AdFilters filters = new AdFilters.Builder()
.setFrequencyCapFilters(new FrequencyCapFilters.Builder()
.setKeyedFrequencyCapsForImpressionEvents(
ImmutableObject.of(keyedFrequencyCapForImpression)
)
.setKeyedFrequencyCapsForClickEvents(
ImmutableObject.of(keyedFrequencyCapForClick)
)
).build();
Saat objek AdFilters
diisi dengan filter batas frekuensi, objek tersebut dapat
diteruskan saat audiens kustom dibuat:
Kotlin
// Initialize a custom audience.
val audience: CustomAudience = Builder()
.setBuyer(buyer)
.setName(name)
.setAds(
listOf(
Builder()
.setRenderUri(renderUri)
.setMetadata(JSONObject().toString())
.setAdFilters(filters)
.setAdCounterKeys(adCounterKeys)
.build()
)
).build()
Java
// Initialize a custom audience.
CustomAudience audience = new CustomAudience.Builder()
.setBuyer(buyer)
.setName(name)
.setAds(Collections.singletonList(new AdData.Builder()
.setRenderUri(renderUri)
.setMetadata(new JSONObject().toString())
.setAdFilters(filters)
.setAdCounterKeys(adCounterKeys)
.build()))
.build();
Saat filter batas frekuensi diterapkan ke audiens kustom, SSP kemudian dapat memanggil peristiwa klik, tampilan, atau tayangan yang diperlukan.
Kotlin
val callerAdTech: AdTechIdentifier = mAdSelectionConfig.getSeller()
val request: UpdateAdCounterHistogramRequest = Builder(
adSelectionId,
FrequencyCapFilters.AD_EVENT_TYPE_CLICK, //CLICK, VIEW, or IMPRESSION
callerAdTech
).build()
Java
AdTechIdentifier callerAdTech = mAdSelectionConfig.getSeller();
UpdateAdCounterHistogramRequest request =
new UpdateAdCounterHistogramRequest.Builder(
adSelectionId,
FrequencyCapFilters.AD_EVENT_TYPE_CLICK, //CLICK, VIEW, or IMPRESSION
callerAdTech
).build();
Iklan yang telah mencapai batas filter batas frekuensi yang telah ditetapkan sebelumnya akan dikecualikan dari lelang. Pemfilteran terjadi sebelum logika bidding dijalankan untuk lelang di perangkat, dan saat payload dibuat untuk lelang layanan Bidding & Lelang. Toolkit ini memberi teknologi iklan fleksibilitas untuk menggunakan interaksi antara pengguna dan iklan dalam audiens kustom untuk memfokuskan penargetan iklan sekaligus meminimalkan eksposur iklan yang berlebihan.
Pemfilteran iklan kontekstual tanpa panggilan jaringan
Jika tidak ada permintaan pemasaran ulang di perangkat, Anda dapat menjalankan pemilihan iklan untuk iklan kontekstual tanpa panggilan jaringan. Dengan URI bawaan dan daftar iklan kontekstual dengan bid, platform ini dapat melewati pengambilan logika bidding, sinyal bidding, dan sinyal skor. Platform ini menggunakan URI bawaan untuk memilih iklan kontekstual dengan bid tertinggi.
Untuk meningkatkan latensi, teknologi iklan dapat menjalankan alur pemilihan iklan yang hanya menyertakan
iklan kontekstual dengan fungsi pemfilteran iklan tanpa panggilan jaringan. Hal ini
dicapai dengan menggunakan URI bawaan untuk menilai sinyal. Lihat bagian Kasus penggunaan dan nama URI
bawaan yang didukung untuk mengetahui daftar implementasi
scoreAds
.
Untuk menjalankan pemilihan iklan tanpa panggilan jaringan:
- Siapkan pemfilteran iklan
- Buat iklan kontekstual
Buat objek
AdSelectionConfig
dengan hal berikut:- Daftar pembeli kosong
- URI bawaan untuk memilih bid tertinggi
- Iklan kontekstual
- URI kosong untuk sinyal penskoran. URI kosong diizinkan untuk menunjukkan bahwa Anda tidak ingin menggunakan pengambilan sinyal tepercaya untuk penskoran:
Uri prebuiltURIScoringUri = Uri.parse("ad-selection-prebuilt://ad-selection/highest-bid-wins/?reportingUrl=your.registered.uri/reporting"); // Initialize AdSelectionConfig AdSelectionConfig adSelectionConfig = new AdSelectionConfig.Builder() .setSeller(seller) .setDecisionLogicUri(prebuiltURIScoringUri) .setCustomAudienceBuyers(Collections.emptyList()) .setAdSelectionSignals(adSelectionSignals) .setSellerSignals(sellerSignals) .setPerBuyerSignals(perBuyerSignals) .setBuyerContextualAds(buyerContextualAds) .setTrustedScoringSignalsUri(Uri.EMPTY) .build();
Jalankan pemilihan iklan:
adSelectionManager.selectAds( adSelectionConfig, executor, outcomeReceiver);
Menjalankan JavaScript pelaporan Anda sendiri saat menggunakan URI bawaan
Saat ini, platform Privacy Sandbox hanya memiliki implementasi JavaScript
pelaporan dasar yang tersedia untuk URI bawaan. Jika ingin menjalankan JavaScript
pelaporan sendiri saat masih menggunakan URI bawaan untuk pemilihan iklan latensi
rendah, Anda dapat mengganti DecisionLogicUri
antara pemilihan iklan dan
pelaporan.
- Menjalankan langkah-langkah untuk menjalankan pemilihan iklan kontekstual untuk iklan menggunakan URI bawaan
Membuat salinan
AdSelectionConfig
Anda sebelum menjalankan pelaporanadSelectionConfigWithYourReportingJS = adSelectionConfig.cloneToBuilder() // Replace <urlToFetchYourReportingJS> with your own URL: .setDecisionLogicUri(Uri.parse(<urlToFetchYourReportingJS>)) .build();
Menjalankan pelaporan tayangan
// adSelectionId is from the result of the previous selectAds run ReportImpressionRequest request = new ReportImpressionRequest( adSelectionId, adSelectionConfigWithYourReportingJS); adSelectionManager.reportImpression( request, executor, outcomeReceiver);
Menjalankan mediasi waterfall
Mediasi waterfall mewajibkan beberapa SDK pihak ketiga (jaringan pihak ketiga) diatur oleh jaringan mediasi SDK pihak pertama. Mediasi waterfall adalah dilakukan dengan cara yang sama terlepas dari apakah lelang dilakukan di perangkat atau berjalan di Penawaran & Layanan lelang (B&A).
Jaringan pihak ketiga
Jaringan pihak ketiga harus menyediakan adaptor yang memungkinkan jaringan mediasi memanggil metode yang diperlukan untuk menjalankan lelang:
- Menjalankan pemilihan iklan
- Melaporkan tayangan
Berikut adalah contoh adaptor jaringan mediasi:
Kotlin
class NetworkAdaptor {
private val adSelectionManager : AdSelectionManager
init {
adSelectionManager = context.getSystemService(AdSelectionManager::class.java)
}
fun selectAds() {...}
fun reportImpressions() {...}
}
Java
class NetworkAdaptor {
AdSelectionManager adSelectionManager;
public NetworkAdaptor() {
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
}
public void selectAds() {...}
public void reportImpressions() {...}
}
Setiap SDK memiliki klien dan pengelola layanan pemilihan iklan sendiri serta implementasi
selectAds
dan reportImpressions
mereka sendiri. Penyedia SDK dapat melihat
bagian tentang cara menjalankan pemilihan iklan untuk lelang di perangkat atau penjelasan
B&A untuk lelang B&A. Ikuti cara melaporkan tayangan
iklan (mengikuti pelaporan tayangan SSP tunggal untuk
pelaporan.
Jaringan mediasi
Serupa dengan jaringan pihak ketiga, jaringan mediasi memerlukan implementasi selectAds
dan
reportImpression
. Lihat bagian tentang cara menjalankan pemilihan
iklan dan cara melaporkan tayangan iklan untuk informasi selengkapnya.
Jaringan mediasi bertanggung jawab untuk menjalankan rantai mediasi dan menempatkan dirinya sendiri di rantai mediasi. Bagian berikutnya membahas cara menyiapkan dan menjalankan proses ini.
Mengambil rantai mediasi dan nilai minimum bid
Jaringan mediasi bertanggung jawab untuk mengambil iklan kontekstual pihak pertama (1P),
rantai mediasi, dan nilai minimum bid jaringan pihak ketiga (3P). Hal ini
dapat terjadi dalam permintaan untuk mengambil iklan kontekstual yang dijalankan oleh jaringan
mediasi. Rantai mediasi menentukan cara melakukan iterasi melalui Jaringan Pihak Ketiga,
dan nilai minimum bid dapat diteruskan ke proses lelang sebagai adSelectionSignals
.
Penempatan jaringan dalam rantai mediasi
SDK mediasi dapat menempatkan dirinya sendiri di rantai mediasi berdasarkan eCPM
langsung bid iklan pihak pertamanya. Di Protected Audience API, bid iklan tidak transparan. SDK mediasi
harus menggunakan AdSelectionFromOutcomesConfig
agar dapat membandingkan bid iklan pihak pertama
yang ditentukan dengan nilai minimum bid jaringan pihak ketiga berikutnya di rantai tersebut. Jika bid pihak pertama
lebih tinggi dari nilai minimum bid, berarti SDK mediasi ditempatkan di depan
jaringan pihak ketiga tersebut.
Menjalankan pemilihan iklan
Untuk mengambil kandidat iklan pihak pertama, jaringan mediasi dapat menjalankan lelang di perangkat
dengan mengikuti langkah-langkah di bagian menjalankan pemilihan iklan. Tindakan ini menghasilkan
kandidat iklan pihak pertama, bid, dan AdSelectionId
yang digunakan dalam proses
mediasi.
Membuat AdSelectionFromOutcomesConfig
AdSelectionFromOutcomesConfig
memungkinkan jaringan mediasi meneruskan daftar
AdSelectionIds
(hasil dari lelang sebelumnya), sinyal pemilihan iklan, dan
URI untuk mengambil JavaScript yang memilih iklan dari beberapa kandidat. Daftar
AdSelectionIds beserta bid-nya dan sinyal diteruskan ke
JavaScript yang dapat menampilkan salah satu AdSelectionIds
jika mengalahkan nilai minimum
bid, atau tidak sama sekali jika rantai mediasi harus dilanjutkan.
Jaringan Mediasi membuat AdSelectionFromOutcomesConfig
menggunakan AdSelectionId
pihak pertama dari bagian sebelumnya, dan nilai minimum bid untuk Jaringan Pihak Ketiga
yang dipertimbangkan. AdSelectionFromOutcomesConfig
baru harus dibuat
untuk setiap langkah dalam rantai mediasi.
Kotlin
fun runSelectOutcome(
adSelectionClient : AdSelectionClient,
outcome1p : AdSelectionOutcome,
network3p : NetworkAdapter) : ListenableFuture<AdSelectionOutcome?> {
val config = AdSelectionFromOutcomesConfig.Builder()
.setSeller(seller)
.setAdSelectionIds(listOf(outcome1p))
.setSelectionSignals({"bid_floor": bid_floor})
.setSelectionLogicUri(selectionLogicUri)
.build()
return adSelectionClient.selectAds(config)
}
Java
public ListenableFuture<AdSelectionOutcome> runSelectOutcome(AdSelectionOutcome outcome1p,
NetworkAdapter network3p) {
AdSelectionFromOutcomesConfig config = new AdSelectionFromOutcomesConfig.Builder()
.setSeller(seller)
.setAdSelectionIds(Collection.singletonList(outcome1p))
.setSelectionSignals({"bid_floor": bid_floor})
.setSelectionLogicUri(selectionLogicUri)
.build();
return adSelectionClient.selectAds(config){}
}
Penggantian metode selectAds()
untuk mediasi waterfall memerlukan
input AdSelectionFromOutcomesConfig
, tempat Anda harus menentukan parameter
yang diperlukan berikut:
- Penjual: ID untuk jaringan iklan penjual yang memulai pemilihan iklan.
- AdSelectionIds: Daftar singleton dari
selectAds()
sebelumnya yang dijalankan untuk iklan pihak pertama. - Sinyal pemilihan iklan: Objek JSON, yang diserialisasi sebagai string, berisi sinyal yang akan digunakan oleh logika bidding pembeli. Dalam hal ini, sertakan nilai minimum bid yang diambil untuk jaringan pihak ketiga yang ditentukan.
- URI Logika Pemilihan: URL HTTPS yang dikueri selama pemilihan iklan untuk mengambil
JavaScript jaringan mediasi guna memilih iklan pemenang. Lihat tanda tangan fungsi
yang diperlukan dalam JavaScript ini. JavaScript harus menampilkan
iklan pihak ketiga jika bid lebih tinggi dari nilai minimum bid. Jika tidak,
null
yang ditampilkan. Hal ini memungkinkan SDK mediasi memotong rantai mediasi saat pemenang ditemukan.
Setelah AdSelectionOutcomesConfig
dibuat, panggil metode selectAds()
jaringan pihak ketiga yang pertama dalam rantai.
Kotlin
val adSelectionManager = context.getSystemService(AdSelectionManager::class.java)
// Initialize AdSelectionFromOutcomesConfig
AdSelectionFromOutcomesConfig adSelectionFromOutcomesConfig =
AdSelectionFromOutcomesConfig.Builder()
.setSeller(seller)
.setAdSelectionIds(listof(outcome1p))
.setSelectionSignals({"bid_floor": bid_floor})
.setSelectionLogicUri(selectionLogicUri)
.setAdSelectionIds(outcomeIds)
.build()
// Run ad selection with AdSelectionConfig
adSelectionManager.selectAds(
adSelectionFromOutcomesConfig,
executor,
outcomeReceiver)
Java
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
// Initialize AdSelectionFromOutcomesConfig
AdSelectionFromOutcomesConfig adSelectionFromOutcomesConfig =
new AdSelectionFromOutcomesConfig.Builder()
.setSeller(seller)
.setAdSelectionIds(Collection.singletonList(outcome1p))
.setSelectionSignals({"bid_floor": bid_floor})
.setSelectionLogicUri(selectionLogicUri)
.setAdSelectionIds(outcomeIds)
.build();
// Run ad selection with AdSelectionConfig
adSelectionManager.selectAds(
adSelectionFromOutcomesConfig,
executor,
outcomeReceiver);
Mengatur mediasi waterfall
Berikut ini urutan operasi untuk menjalankan proses mediasi.
- Jalankan pemilihan iklan pihak pertama.
- Lakukan iterasi melalui rantai mediasi. Untuk setiap jaringan pihak ketiga, lakukan hal berikut:
- Build
AdSelectionFromOutcomeConfig
, termasukoutcomeId
pihak pertama dan nilai minimum bid SDK pihak ketiga. - Panggil
selectAds()
dengan konfigurasi dari langkah sebelumnya. - Jika hasilnya tidak kosong, tampilkan iklan.
- Panggil metode
selectAds()
adaptor jaringan SDK saat ini. Jika hasilnya tidak kosong, tampilkan iklan.
- Build
- Jika tidak ada pemenang yang ditemukan dari rantai, tampilkan iklan pihak pertama.
Kotlin
fun runWaterfallMediation(mediationChain : List<NetworkAdapter>)
: Pair<AdSelectionOutcome, NetworkAdapter> {
val outcome1p = runAdSelection()
var outcome : AdSelectionOutcome
for(network3p in mediationChain) {
outcome = runSelectOutcome(outcome1p, network3p)
if (outcome1p.hasOutcome() && outcome.hasOutcome()) {
return Pair(outcome, this)
}
outcome = network3p.runAdSelection()
if(outcome.hasOutcome()) {
return Pair(outcome, network3p)
}
}
return Pair(outcome1p, this)
}
Java
class MediationNetwork {
AdSelectionManager adSelectionManager;
public MediationNetwork() {
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
}
public void runAdSelection() {...}
public void reportImpressions() {...}
public Pair<AdSelectionOutcome, NetworkAdapter> runWaterfallMediation(
List<NetworkAdapter> mediationChain) {
AdSelectionOutcome outcome1p = runAdSelection();
AdSelectionOutcome outcome;
for(NetworkAdapter network3p: mediationChain) {
if (outcome1p.hasOutcome() &&
(outcome = runSelectOutcome(outcome1p, network3p)).hasOutcome()) {
return new Pair<>(outcome, this);
}
if((outcome = network3p.runAdSelection()).hasOutcome()) {
return new Pair<>(outcome, network3p);
}
}
return new Pair<>(outcome1p, this);
}
/* Runs comparison by creating an AdSelectionFromOutcomesConfig */
public AdSelectionOutcome runSelectOutcome(AdSelectionOutcome outcome1p,
NetworkAdapter network3p) { ... }
}
Melaporkan tayangan iklan
Ada dua alur untuk melaporkan tayangan iklan, bergantung pada cara lelang dijalankan. Jika Anda adalah satu SSP yang menjalankan lelang, ikuti bagian ini. Jika Anda akan menerapkan mediasi waterfall, ikuti langkah-langkah yang ditemukan di bagian pelaporan tayangan mediasi waterfall.
Pelaporan tayangan SSP tunggal
Setelah iklan yang menang dipilih dari alur kerja pemilihan iklan, Anda dapat
melaporkan kembali tayangan ke platform sisi jual dan sisi beli yang berpartisipasi
dengan metode AdSelectionManager.reportImpression()
. Untuk melaporkan
tayangan iklan:
- Lakukan inisialisasi objek
AdSelectionManager
. - Buat objek
ReportImpressionRequest
dengan ID pemilihan iklan. - Panggil metode
reportImpression()
asinkron dengan objekReportImpressionRequest
serta objekExecutor
danOutcomeReceiver
yang relevan.
Java
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
// Initialize a ReportImpressionRequest
ReportImpressionRequest reportImpressionRequest =
new ReportImpressionRequest.Builder()
.setAdSelectionId(adSelectionId)
.setAdSelectionConfig(adSelectionConfig)
.build();
// Request to report the impression with the ReportImpressionRequest
adSelectionManager.reportImpression(
reportImpressionRequest,
executor,
outcomeReceiver);
Kotlin
val adSelectionManager = context.getSystemService(AdSelectionManager::class.java)
// Initialize a ReportImpressionRequest
val adSelectionConfig: ReportImpressionRequest =
ReportImpressionRequest.Builder()
.setAdSelectionId(adSelectionId)
.setAdSelectionConfig(adSelectionConfig)
.build()
// Request to report the impression with the ReportImpressionRequest
adSelectionManager.reportImpression(
reportImpressionRequest,
executor,
outcomeReceiver)
Lakukan inisialisasi ReportImpressionRequest
dengan parameter yang diperlukan berikut:
- ID pemilihan iklan: ID unik hanya untuk pengguna perangkat yang mengidentifikasi pemilihan iklan yang berhasil.
- Konfigurasi pemilihan iklan: Konfigurasi yang sama yang digunakan dalam panggilan
selectAds()
yang diidentifikasi oleh ID pemilihan iklan yang disediakan.
Metode reportImpression()
asinkron menggunakan objek OutcomeReceiver
untuk memberi sinyal hasil panggilan API.
- Callback
onResult()
menunjukkan apakah URL pelaporan tayangan telah dibuat dan permintaan telah dijadwalkan. - Callback
onError()
menunjukkan kemungkinan kondisi berikut:- Jika panggilan diinisialisasi dengan argumen input yang tidak valid,
AdServicesException
akan menunjukkanIllegalArgumentException
sebagai penyebabnya. - Semua error lainnya akan menerima
AdServicesException
denganIllegalStateException
sebagai penyebabnya.
- Jika panggilan diinisialisasi dengan argumen input yang tidak valid,
Pelaporan tayangan mediasi waterfall
SDK mediasi perlu memantau SDK pemenang untuk memicu alur pelaporannya. SDK yang berpartisipasi dalam rantai mediasi harus menyediakan metode bagi mediator untuk memanggil guna memicu alur pelaporannya sendiri. SDK yang berpartisipasi dalam lelang yang dimediasi dapat mengikuti langkah-langkah di atas untuk menerapkan pelaporannya sendiri.
SSP dapat menggunakan contoh kode SDK pihak ketiga ini sebagai prototipe untuk cara bergabung dalam alur mediasi:
Pair<AdSelectionOutcome, NetworkAdapter> winnerOutcomeAndNetwork =
mediationSdk.orchestrateMediation(mediationChain);
if (winner.first.hasOutcome()) {
winner.second.reportImpressions(winner.first.getAdSelectionId());
Endpoint pelaporan tayangan
API tayangan laporan akan menerbitkan permintaan GET HTTPS ke endpoint yang disediakan oleh platform sisi jual dan platform sisi beli yang menang:
Endpoint platform sisi beli:
- API ini menggunakan URL logika bidding yang ditentukan dalam audiens kustom untuk mengambil JavaScript yang disediakan pembeli yang menyertakan logika untuk menampilkan URL pelaporan tayangan.
- Panggil fungsi JavaScript
reportWin()
yang diharapkan akan menampilkan URL pelaporan tayangan pembeli.
Endpoint platform sisi jual:
- Gunakan URL logika keputusan yang ditentukan dalam objek
AdSelectionConfig
untuk mengambil JavaScript logika keputusan penjual. - Panggil fungsi JavaScript
reportResult()
yang diharapkan akan menampilkan URL pelaporan tayangan penjual.
Pelaporan layanan Bidding & Lelang
Lelang yang dijalankan di layanan Bidding & Lelang akan memiliki semua informasi pelaporan yang diperlukan, termasuk URL yang dihasilkan untuk pelaporan interaksi iklan, yang disertakan dalam respons terenkripsi dari lelang sisi server. Saat respons didekripsi, URL yang sesuai akan didaftarkan dengan platform, sehingga pelaporan iklan dan tayangan mengikuti langkah-langkah yang sama seperti yang tercantum di atas.
Upaya terbaik Pelaporan tayangan
reportImpression()
dirancang untuk menawarkan upaya penyelesaian pelaporan yang paling
mudah.
Melaporkan Interaksi Iklan
Protected Audience memberikan dukungan untuk melaporkan interaksi yang lebih terperinci untuk iklan yang dirender. Hal ini dapat mencakup interaksi seperti waktu tampilan, klik, kursor, atau metrik berguna lainnya yang dapat dikumpulkan. Ada dua langkah untuk menerima laporan ini. Pertama, pembeli dan penjual harus mendaftar untuk menerima laporan ini di JavaScript pelaporannya. Selanjutnya, klien harus melaporkan peristiwa ini.
Mendaftar untuk menerima peristiwa interaksi
Proses pendaftaran peristiwa interaksi terjadi di reportWin()
pembeli dan fungsi JavaScript
reportResult()
penjual menggunakan fungsi JavaScript
yang disediakan oleh platform: registerAdBeacon
. Untuk mendaftar guna menerima
laporan peristiwa, cukup panggil Fungsi JavaScript platform dari JavaScript
pelaporan Anda. Cuplikan berikut menggunakan reportWin()
pembeli, tetapi pendekatan yang sama
berlaku untuk reportResult()
.
reportWin(
adSelectionSignals,
perBuyerSignals,
signalsForBuyer,
contextualSignals,
customAudienceSignals) {
...
// Calculate reportingUri, clickUri, viewUri, and hoverUri
registerAdBeacon({"click": clickUri, "view": viewUri, "hover": hoverUri});
return reportingUri;
}
Melaporkan peristiwa interaksi
Setelah melaporkan tayangan, klien dapat melaporkan interaksi kembali ke
platform sisi beli dan sisi jual yang menang yang sebelumnya terdaftar dengan
metode AdSelectionManager.reportInteraction()
. Untuk melaporkan peristiwa iklan:
- Lakukan inisialisasi objek
AdSelectionManager
. - Bangun objek
ReportInteractionRequest
dengan ID pemilihan iklan, kunci interaksi, data interaksi, dan tujuan pelaporan. - Panggil metode
reportInteraction()
asinkron dengan objekrequest
dan objekExecutor
danOutcomeReceiver
yang relevan.
AdSelectionManager adSelectionManager =
context.getSystemService(AdSelectionManager.class);
// Initialize a ReportInteractionRequest
ReportInteractionRequest request =
new ReportInteractionRequest.Builder()
.setAdSelectionId(adSelectionId)
.setInteractionKey("view")
.setInteractionData("{ viewTimeInSeconds : 1 }") // Can be any string
.setReportingDestinations(
FLAG_REPORTING_DESTINATION_BUYER | FLAG_REPORTING_DESTINATION_SELLER
)
.build();
// Request to report the impression with the ReportImpressionRequest
adSelectionManager.reportInteraction(
reportImpressionRequest,
executor,
outcomeReceiver);
Lakukan inisialisasi ReportInteractionRequest
dengan parameter yang diperlukan berikut:
- ID pemilihan iklan: ID pemilihan iklan yang diambil dari
AdSelectionOutcome
yang ditampilkan sebelumnya. - Kunci Interaksi: Kunci string yang ditentukan oleh klien yang menjelaskan tindakan yang dilaporkan. Ini harus cocok dengan kunci yang didaftarkan oleh penjual atau pembeli dalam fungsi JavaScript pelaporan.
- Data Interaksi: String yang berisi data yang akan disertakan dengan laporan peristiwa, yang akan di-POST kembali ke server pelaporan.
- Tujuan Pelaporan: Bit mask yang menentukan apakah peristiwa harus
dilaporkan kepada pembeli, penjual, atau keduanya. Tanda ini disediakan oleh
platform dan mask tujuan akhir dapat dibuat menggunakan operasi
bitwise. Untuk melaporkan ke satu tujuan, Anda dapat menggunakan tanda yang disediakan langsung oleh
platform. Untuk melaporkan ke beberapa tujuan, Anda dapat menggunakan bitwise
OR (
|
) untuk menggabungkan nilai tanda.
Metode reportInteraction()
asinkron menggunakan objek OutcomeReceiver
untuk memberi sinyal hasil panggilan API.
- Callback
onResult()
menunjukkan panggilan interaksi laporan valid. - Callback
onError()
menunjukkan kemungkinan kondisi berikut:- Jika panggilan dilakukan saat aplikasi berjalan di latar belakang,
IllegalStateException
dengan deskripsi kegagalan akan ditampilkan. - Jika klien di-throttle agar tidak memanggil
reportInteraction()
,LimitExceededException
akan ditampilkan. - Jika paket tidak terdaftar untuk memanggil Privacy Preserving API,
SecurityException()
akan ditampilkan. - Jika interaksi pelaporan aplikasi berbeda dari aplikasi yang memanggil
selectAds()
,IllegalStateException
akan ditampilkan.
- Jika panggilan dilakukan saat aplikasi berjalan di latar belakang,
- Jika pengguna belum memberikan izin untuk mengaktifkan Privacy Sandbox API, panggilan akan gagal tanpa ada peringatan.
Endpoint pelaporan interaksi
API interaksi laporan menerbitkan permintaan POST HTTPS ke endpoint yang disediakan oleh platform sisi jual dan platform sisi beli yang menang. Audience Terlindungi akan cocok dengan kunci interaksi dengan URI yang dideklarasikan dalam pelaporan JavaScript dan mengeluarkan permintaan POST ke setiap endpoint untuk setiap interaksi yang dilaporkan. Jenis konten permintaan adalah teks biasa dengan isi berupa Data Interaksi.
Upaya terbaik Pelaporan interaksi
reportInteraction()
dirancang untuk menawarkan upaya penyelesaian
pelaporan yang sebaik mungkin melalui HTTP POST.
Update latar belakang harian
Saat membuat audiens kustom, aplikasi atau SDK Anda dapat menginisialisasi metadata audiens kustom. Selain itu, platform ini dapat mengupdate bagian dari metadata audiens kustom berikut dengan proses update di latar belakang harian.
- Sinyal bidding pengguna
- Data bidding tepercaya
- Daftar
AdData
Proses ini mengajukan kueri terhadap URL Update harian yang ditentukan dalam audiens kustom dan URL tersebut dapat menampilkan respons JSON.
- Respons JSON mungkin berisi salah satu kolom metadata yang didukung dan perlu diperbarui.
- Setiap kolom JSON divalidasi secara terpisah. Klien mengabaikan kolom yang rusak sehingga tidak ada update pada kolom tersebut dalam respons.
- Respons HTTP kosong atau objek JSON kosong "
{}
" tidak akan menghasilkan update metadata. - Ukuran pesan respons harus dibatasi hingga 10 KB.
- Semua URI diperlukan untuk menggunakan HTTPS.
trusted_bidding_uri
harus memiliki ETLD+1 yang sama dengan pembeli.
Contoh: Respons JSON untuk update harian latar belakang
{
"user_bidding_signals" : { ... }, // Valid JSON object
"trusted_bidding_data" : {
"trusted_bidding_uri" : 'example-dsp1-key-value-service.com',
"trusted_bidding_keys" : [ 'campaign123', 'campaign456', ... ]
},
'ads' : [
{
"render_uri" : 'www.example-dsp1.com/.../campaign123.html',
'metadata' : { ... } // Valid JSON object
},
{
"render_uri" : 'www.example-dsp1.com/.../campaign456.html',
'metadata' : { ... } // Valid JSON object
},
...
]
}
JavaScript untuk pemilihan iklan
Alur kerja pemilihan iklan mengatur eksekusi JavaScript yang disediakan pembeli dan yang disediakan penjual.
JavaScript yang disediakan pembeli diambil dari URL logika Bidding yang ditentukan dalam audiens kustom. JavaScript yang ditampilkan harus menyertakan fungsi berikut:
JavaScript yang disediakan penjual diambil dari URL logika keputusan yang ditentukan dalam
parameter AdSelectionConfig
untuk ad selection API. JavaScript
yang ditampilkan harus menyertakan fungsi berikut:
generateBid()
function generateBid(
ad,
auction_signals,
per_buyer_signals,
trusted_bidding_signals,
contextual_signals,
user_signals,
custom_audience_bidding_signals) {
return {'status': 0, 'ad': ad, 'bid': ad.metadata.result };
}
Parameter input:
ad
: objek JSON dengan formatvar ad = { 'render_url': url, 'metadata': json_metadata };
auction_signals, per_buyer_signals
: objek JSON yang ditentukan dalam objek konfigurasi lelangcustom_audience_bidding_signals
: objek JSON yang dihasilkan oleh platform. Format untuk objek JSON ini adalah:var custom_audience_signals = { "owner":"ca_owner", "buyer":"ca_buyer", "name":"ca_name", "activation_time":"ca_activation_time_epoch_ms", "expiration_time":"ca_expiration_time_epoch_ms", "user_bidding_signals":"ca_user_bidding_signals" }
dalam hal ini:
owner
,buyer
,name
adalah string yang diambil dari properti dengan nama Audiens Khusus yang sama yang berpartisipasi dalam pemilihan iklanactivation_time
danexpiration_time
adalah waktu aktivasi dan berakhirnya masa berlaku audiens kustom yang dinyatakan sebagai detik sejak epoch Unixca_user_bidding_signals
adalah string JSON yang ditentukan dalam kolomuserBiddingSignals
dariCustomAudience
pada waktu pembuatantrusted_bidding_signals, contextual_signals
danuser_signals
adalah objek JSON. Objek tersebut diteruskan sebagai objek kosong dan akan diisi di rilis mendatang. Formatnya tidak diterapkan oleh platform dan dikelola oleh teknologi iklan.
Hasil:
ad
: adalah iklan yang dirujuk oleh bid. Skrip ini diizinkan untuk menampilkan salinan iklan yang diterima dengan metadata berbeda. Propertirender_url
iklan tidak akan diubah.bid
: nilai float yang mewakili nilai bid untuk iklan inistatus
: nilai bilangan bulat yang dapat berupa:0
: untuk keberhasilan eksekusi1
: (atau nilai apa pun yang bukan nol) jika sinyal input apa pun tidak valid. Jika nilai bukan nol ditampilkan oleh generate-bid, proses bidding untuk semua iklan CA menjadi tidak valid
scoreAd()
function scoreAd(
ad,
bid,
ad_selection_config,
seller_signals,
trusted_scoring_signals,
contextual_signal,
user_signal,
custom_audience_signal) {
return {'status': 0, 'score': score };
}
Parameter input:
ad
: lihat dokumentasigenerateBid
bid
: nilai bid untuk iklanad_selection_config
: objek JSON yang mewakili parameterAdSelectionConfig
selectAds
API. Formatnya adalah:var ad_selection_config = { 'seller': 'seller', 'decision_logic_url': 'url_of_decision_logic', 'custom_audience_buyers': ['buyer1', 'buyer2'], 'auction_signals': auction_signals, 'per_buyer_signals': per_buyer_signals, 'contextual_ads': [ad1, ad2] }
seller_signals
: Objek JSON yang dibaca dari parameter APIsellerSignals
AdSelectionConfig
trusted_scoring_signal
: yang dibaca dari kolomadSelectionSignals
di parameter APIAdSelectionConfig
contextual_signals, user_signals
: Objek JSON. Saat ini objek tersebut diteruskan sebagai objek kosong dan akan diisi di rilis mendatang. Formatnya tidak diterapkan oleh platform dan dikelola oleh teknologi iklan.per_buyer_signals
: Objek JSON dibaca dari petaperBuyerSignal
dalam parameter APIAdSelectionConfig
menggunakan kunci sebagai pembeli Audiens Kustom saat ini. Kosong jika peta tidak berisi entri untuk pembeli tertentu.
Output:
score
: nilai float yang mewakili nilai skor untuk iklan inistatus
: nilai bilangan bulat yang dapat berupa:- 0: untuk keberhasilan eksekusi
- 1: jika
customAudienceSignals
tidak valid - 2: jika
AdSelectionConfig
tidak valid - 3: jika salah satu sinyal lain tidak valid
- Nilai apa pun yang bukan nol menyebabkan kegagalan proses, nilai tersebut akan menentukan jenis pengecualian yang ditampilkan
selectOutcome()
function selectOutcome(
outcomes,
selection_signals) {
return {'status': 0, 'result': null};
}
Parameter input:
outcomes
: objek JSON{"id": id_string, "bid": bid_double}
selection_signals
: Objek JSON yang ditentukan dalam objek konfigurasi lelang
Output:
status
:0
untuk berhasil dan bukan nol untuk gagalresult
: salah satu hasil yang diteruskan atau null
reportResult()
function reportResult(ad_selection_config, render_url, bid, contextual_signals) {
return {
'status': status,
'results': {'signals_for_buyer': signals_for_buyer, 'reporting_url': reporting_url }
};
}
Parameter input:
ad_selection_config
: lihat dokumentasiscoreAds
render_url
: URL render iklan pemenangbid
: bid yang ditawarkan untuk iklan pemenangcontextual_signals
: lihat dokumentasigenerateBid
Output:
status: 0
untuk berhasil dan bukan nol untuk gagalresults
: objek JSON yang berisi:signals_for_buyer
: objek JSON yang diteruskan ke fungsireportWin
reporting_url
: URL yang digunakan oleh platform untuk memberi tahu tayangan kepada pembeli
reportWin()
function reportWin(
ad_selection_signals,
per_buyer_signals,
signals_for_buyer,
contextual_signals,
custom_audience_signals) {
return {'status': 0, 'results': {'reporting_url': reporting_url } };
}
Parameter input:
ad_selection_signals, per_buyer_signals
: lihat dokumentasi untukscoreAd
signals_for_buyer
: objek JSON yang ditampilkan olehreportResult
contextual_signals, custom_audience_signals
: lihat dokumentasi untukgenerateBid
Output:
status: 0
untuk berhasil dan bukan nol untuk gagalresults
: objek JSON yang berisi:reporting_url
: URL yang digunakan oleh platform untuk memberi tahu tayangan kepada penjual
registerAdBeacon()
function registerAdBeacon(
beacons
)
Parameter Input:
beacons
: Objek yang berisi key-value pair dari kunci interaksi dan URI pelaporan. Formatnya adalah:let beacons = { 'interaction_key': 'reporting_uri', 'interaction_key': 'reporting_uri', ... }
interaction_key
: String yang mewakili peristiwa. Hal ini digunakan oleh platform nanti saat melaporkan interaksi peristiwa untuk mencarireporting_uri
yang akan diberi tahu. Kunci ini harus cocok antara apa yang didaftarkan oleh pembeli atau penjual, dan apa yang dilaporkan oleh penjual.reporting_uri
: URI untuk menerima laporan peristiwa. Pertanyaan ini harus spesifik ke jenis peristiwa yang dilaporkan. Aplikasi harus menerima permintaan POST untuk menangani data apa pun yang dilaporkan bersamaan dengan peristiwa tersebut.
Contoh:
let beacons = { 'click': 'https://reporting.example.com/click_event', 'view': 'https://reporting.example.com/view_event' }
URI bawaan Pilihan Iklan
URI bawaan memberi teknisi iklan kemampuan untuk menetapkan fungsi JavaScript untuk logika
keputusan pemilihan iklan di class AdSelectionConfig
dan
AdSelectionFromOutcomesConfig
. URI bawaan tidak memerlukan panggilan
jaringan untuk mendownload JavaScript yang sesuai. Teknologi iklan dapat menggunakan URI bawaan
tanpa harus menyiapkan domain terdaftar untuk menghosting JavaScript.
URI bawaan dibuat menggunakan format berikut:
ad-selection-prebuilt:<use-case>/<name>?<required-script-generation-parameters>
Platform Privacy Sandbox menyediakan JavaScript menggunakan informasi dari URI ini dalam runtime.
IllegalArgumentException
ditampilkan jika:
- salah satu parameter yang diperlukan tidak ada di URI
- ada parameter yang tidak dikenal dalam URI
Kasus penggunaan dan nama URI bawaan yang didukung
Kasus penggunaan 1: pemilihan iklan
URI bawaan dalam kasus penggunaan ad-selection
didukung dalam
alur selectAds(AdSelectionConfig)
.
Nama URI bawaan: highest-bid-wins
URI bawaan ini menyediakan JavaScript yang memilih iklan dengan bid tertinggi
setelah bidding. Laporan ini juga menyediakan fungsi pelaporan dasar untuk melaporkan
render_uri
dan bid
pemenang.
Parameter yang diperlukan
reportingUrl
: URL pelaporan dasar yang diparameterisasi dengan render_uri
dan bid
iklan pemenang:
<reportingUrl>?render_uri=<renderUriOfWinnigAd>&bid=<bidOfWinningAd>
Penggunaan
Jika URL pelaporan dasar Anda adalah https://www.ssp.com/reporting
, URI bawaan
akan menjadi:
`ad-selection-prebuilt://ad-selection/highest-bid-wins/?reportingUrl=https://www.ssp.com/reporting`
Kasus penggunaan 2: ad-selection-from-outcomes
URI bawaan dalam kasus penggunaan ad-selection-from-outcomes
mendukung
alur kerja selectAds(AdSelectionFromOutcomesConfig)
.
Nama URI bawaan: waterfall-mediation-truncation
waterfall-mediation-truncation
URI bawaan menyediakan JavaScript yang
mengimplementasikan logika pemotongan mediasi waterfall tempat JavaScript menampilkan
iklan pihak pertama jika bid
lebih tinggi atau sama dengan bid floor
, dan
jika tidak, menampilkan null
.
Parameter yang diperlukan
bidFloor
: Kunci dari nilai minimum bid yang diteruskan di getSelectionSignals()
yang dibandingkan dengan iklan SDK mediasi.
Penggunaan
Jika sinyal pemilihan iklan Anda terlihat seperti {"bid_floor": 10}
, URI
bawaan yang dihasilkan akan menjadi:
`ad-selection-prebuilt://ad-selection-from-outcomes/waterfall-mediation-truncation/?bidFloor=bid_floor`
Pengujian
Untuk membantu Anda memulai Protected Audience API, kami telah membuat aplikasi contoh di Kotlin dan Java yang dapat ditemukan di GitHub.
Prasyarat
Protected Audience API memerlukan beberapa JavaScript selama pemilihan iklan dan pelaporan tayangan. Ada dua metode untuk menyediakan JavaScript ini di lingkungan pengujian:
- Menjalankan server dengan endpoint HTTPS yang diperlukan yang menampilkan JavaScript
- Mengganti pengambilan jarak jauh dengan memberikan kode yang diperlukan dari sumber lokal
Salah satu pendekatan tersebut memerlukan penyiapan endpoint HTTPS untuk menangani pelaporan tayangan.
Endpoint HTTPS
Untuk menguji pemilihan iklan dan pelaporan tayangan, Anda harus menyiapkan 7 endpoint HTTPS yang dapat diakses oleh perangkat pengujian atau emulator Anda:
- Endpoint pembeli yang menayangkan JavaScript logika bidding.
- Endpoint yang menayangkan sinyal bidding.
- Endpoint penjual yang menayangkan JavaScript logika keputusan.
- Endpoint yang menyalurkan sinyal skor.
- Endpoint pelaporan tayangan pembeli yang menang.
- Endpoint pelaporan tayangan penjual.
- Endpoint untuk menayangkan update harian untuk audiens kustom.
Demi kemudahan, repo GitHub menyediakan kode JavaScript dasar untuk tujuan pengujian. Repo GitHub ini juga mencakup definisi layanan OpenAPI yang dapat di-deploy ke platform tiruan atau microservice yang didukung. Untuk mengetahui detail selengkapnya, lihat README project.
Mengganti pengambilan JavaScript jarak jauh
Fitur ini dimaksudkan untuk digunakan dalam pengujian menyeluruh. Untuk mengganti pengambilan jarak jauh, aplikasi Anda harus berjalan dalam mode debug dengan opsi developer diaktifkan.
Guna mengaktifkan mode debug untuk aplikasi Anda, tambahkan baris berikut ke atribut aplikasi dalam AndroidManifest.xml:
<application
android:debuggable="true">
Untuk contoh cara menggunakan penggantian ini, lihat aplikasi contoh Protected Audience API di GitHub.
Anda harus menambahkan JavaScript kustom Anda sendiri untuk menangani rutinitas pemilihan iklan, seperti bidding, keputusan skor, dan pelaporan. Anda dapat menemukan contoh kode JavaScript dasar yang menangani semua permintaan yang diperlukan di repo GitHub. Aplikasi contoh Protected Audience API menunjukkan cara membaca kode dari file tersebut dan menyiapkannya untuk digunakan sebagai penggantian.
Anda dapat mengganti pengambilan JavaScript sisi jual dan sisi beli secara terpisah, meskipun Anda memerlukan endpoint HTTPS untuk menayangkan JavaScript apa pun yang tidak diberi penggantian. Lihat README untuk mengetahui informasi tentang cara menyiapkan server yang menangani kasus ini.
Anda hanya dapat mengganti pengambilan JavaScript untuk audiens kustom yang dimiliki oleh paket Anda.
Mengganti JavaScript sisi jual
Untuk menyiapkan penggantian JavaScript sisi jual, lakukan hal berikut seperti yang ditunjukkan dalam contoh kode berikut:
- Lakukan inisialisasi objek
AdSelectionManager
. - Dapatkan referensi ke
TestAdSelectionManager
dari objekAdSelectionManager
. - Buat objek
AdSelectionConfig
. - Buat
AddAdSelectionOverrideRequest
dengan objekAdSelectionConfig
danString
yang mewakili JavaScript yang ingin Anda gunakan sebagai penggantian. - Panggil metode
overrideAdSelectionConfigRemoteInfo()
asinkron dengan objekAddAdSelectionOverrideRequest
dan objekExecutor
danOutcomeReceiver
yang relevan.
Kotlin
val testAdSelectionManager: TestAdSelectionManager =
context.getSystemService(AdSelectionManager::class.java).getTestAdSelectionManager()
// Initialize AdSelectionConfig =
val adSelectionConfig = new AdSelectionConfig.Builder()
.setSeller(seller)
.setDecisionLogicUrl(decisionLogicUrl)
.setCustomAudienceBuyers(customAudienceBuyers)
.setAdSelectionSignals(adSelectionSignals)
.setSellerSignals(sellerSignals)
.setPerBuyerSignals(perBuyerSignals)
.build()
// Initialize AddAddSelectionOverrideRequest
val request = AddAdSelectionOverrideRequest.Builder()
.setAdSelectionConfig(adSelectionConfig)
.setDecisionLogicJs(decisionLogicJS)
.build()
// Run the call to override the JavaScript for the given AdSelectionConfig
// Note that this only takes effect in apps marked as debuggable
testAdSelectionManager.overrideAdSelectionConfigRemoteInfo(
request,
executor,
outComeReceiver)
Java
TestAdSelectionManager testAdSelectionManager =
context.getSystemService(AdSelectionManager.class).getTestAdSelectionManager();
// Initialize AdSelectionConfig =
AdSelectionConfig adSelectionConfig = new AdSelectionConfig.Builder()
.setSeller(seller)
.setDecisionLogicUrl(decisionLogicUrl)
.setCustomAudienceBuyers(customAudienceBuyers)
.setAdSelectionSignals(adSelectionSignals)
.setSellerSignals(sellerSignals)
.setPerBuyerSignals(perBuyerSignals)
.build();
// Initialize AddAddSelectionOverrideRequest
AddAdSelectionOverrideRequest request = AddAdSelectionOverrideRequest.Builder()
.setAdSelectionConfig(adSelectionConfig)
.setDecisionLogicJs(decisionLogicJS)
.build();
// Run the call to override the JavaScript for the given AdSelectionConfig
// Note that this only takes effect in apps marked as debuggable
testAdSelectionManager.overrideAdSelectionConfigRemoteInfo(
request,
executor,
outComeReceiver);
Lihat bagian Menjalankan pemilihan iklan untuk mengetahui informasi selengkapnya tentang apa yang
direpresentasikan oleh setiap kolom dalam AdSelectionConfig
. Perbedaan utamanya adalah
bahwa decisionLogicUrl dapat ditetapkan ke nilai placeholder karena akan
diabaikan.
Untuk mengganti JavaScript yang digunakan selama pemilihan iklan,
decisionLogicJs
harus berisi tanda tangan fungsi sisi penjual yang sesuai.
Untuk contoh cara membaca file JavaScript sebagai string, lihat
aplikasi contoh Protected Audience API di GitHub.
Metode overrideAdSelectionConfigRemoteInfo()
asinkron menggunakan
objek OutcomeReceiver
untuk memberi sinyal hasil panggilan API.
Callback onResult()
menandakan bahwa penggantian berhasil diterapkan.
Panggilan ke selectAds()
di masa mendatang akan menggunakan logika pengambilan keputusan dan
pelaporan yang Anda teruskan sebagai penggantian.
Callback onError()
menandakan adanya dua kemungkinan kondisi:
- Jika penggantian dicoba dengan argumen yang tidak valid,
AdServiceException
akan menunjukkanIllegalArgumentException
sebagai penyebabnya. - Jika penggantian dicoba dengan aplikasi yang tidak berjalan dalam mode debug dengan
opsi developer yang diaktifkan,
AdServiceException
akan menunjukkanIllegalStateException
sebagai penyebabnya.
Mereset penggantian sisi jual
Bagian ini mengasumsikan bahwa Anda telah mengganti JavaScript sisi jual dan
memiliki referensi ke TestAdSelectionManager
dan
AdSelectionConfig
yang digunakan di bagian sebelumnya.
Untuk mereset penggantian bagi semua AdSelectionConfigs
:
- Panggil metode
resetAllAdSelectionConfigRemoteOverrides()
asinkron dengan objekOutcomeReceiver
yang relevan.
Kotlin
// Resets overrides for all AdSelectionConfigs
testAadSelectionManager.resetAllAdSelectionConfigRemoteOverrides(
outComeReceiver)
Java
// Resets overrides for all AdSelectionConfigs
testAdSelectionManager.resetAllAdSelectionConfigRemoteOverrides(
outComeReceiver);
Setelah Anda mereset penggantian sisi jual, panggilan ke selectAds()
akan menggunakan
decisionLogicUrl apa pun yang disimpan di AdSelectionConfig
untuk mencoba
mengambil JavaScript yang diperlukan.
Jika panggilan ke resetAllAdSelectionConfigRemoteOverrides()
gagal,
callback OutComeReceiver.onError()
akan memberikan AdServiceException
.
Jika penghapusan penggantian dicoba dengan aplikasi yang tidak berjalan dalam mode debug
dengan opsi developer yang diaktifkan, AdServiceException
akan menunjukkan
IllegalStateException
sebagai penyebabnya.
Mengganti JavaScript sisi beli
- Ikuti langkah-langkah untuk bergabung dengan audiens kustom
- Buat
AddCustomAudienceOverrideRequest
dengan pembeli dan nama audiens kustom yang ingin Anda ganti, selain logika bidding dan data yang ingin Anda gunakan sebagai penggantian - Panggil metode
overrideCustomAudienceRemoteInfo()
asinkron dengan objekAddCustomAudienceOverrideRequest
dan objekExecutor
danOutcomeReceiver
yang relevan
Kotlin
val testCustomAudienceManager: TestCustomAudienceManager =
context.getSystemService(CustomAudienceManager::class.java).getTestCustomAudienceManager()
// Join custom audience
// Build the AddCustomAudienceOverrideRequest
val request = AddCustomAudienceOverrideRequest.Builder()
.setBuyer(buyer)
.setName(name)
.setBiddingLogicJs(biddingLogicJS)
.setTrustedBiddingSignals(trustedBiddingSignals)
.build()
// Run the call to override JavaScript for the given custom audience
testCustomAudienceManager.overrideCustomAudienceRemoteInfo(
request,
executor,
outComeReceiver)
Java
TestCustomAudienceManager testCustomAudienceManager =
context.getSystemService(CustomAudienceManager.class).getTestCustomAudienceManager();
// Join custom audience
// Build the AddCustomAudienceOverrideRequest
AddCustomAudienceOverrideRequest request =
AddCustomAudienceOverrideRequest.Builder()
.setBuyer(buyer)
.setName(name)
.setBiddingLogicJs(biddingLogicJS)
.setTrustedBiddingSignals(trustedBiddingSignals)
.build();
// Run the call to override JavaScript for the given custom audience
testCustomAudienceManager.overrideCustomAudienceRemoteInfo(
request,
executor,
outComeReceiver);
Nilai untuk pembeli dan nama adalah nilai yang sama dengan yang digunakan untuk membuat audiens kustom. Pelajari kolom ini lebih lanjut.
Selain itu, Anda dapat menentukan dua parameter tambahan:
biddingLogicJs
: JavaScript yang menyimpan logika pembeli yang digunakan selama pemilihan iklan. Lihat tanda tangan fungsi yang diperlukan dalam JavaScript ini.trustedBiddingSignals
: Sinyal bidding yang akan digunakan selama pemilihan iklan. Untuk tujuan pengujian, sinyal ini bisa berupa string kosong.
Metode overrideCustomAudienceRemoteInfo()
asinkron menggunakan objek OutcomeReceiver
untuk memberi sinyal hasil panggilan API.
Callback onResult()
menandakan bahwa penggantian berhasil diterapkan.
Panggilan berikutnya ke selectAds()
akan menggunakan logika bidding dan pelaporan apa pun
yang telah Anda teruskan sebagai penggantian.
Callback onError()
menandakan adanya dua kemungkinan kondisi.
- Jika penggantian dicoba dengan argumen yang tidak valid,
AdServiceException
akan menunjukkanIllegalArgumentException
sebagai penyebabnya. - Jika penggantian dicoba dengan aplikasi yang tidak berjalan dalam mode debug dengan
opsi developer yang diaktifkan,
AdServiceException
akan menunjukkanIllegalStateException
sebagai penyebabnya.
Mereset penggantian sisi beli
Bagian ini mengasumsikan bahwa Anda telah mengganti JavaScript sisi beli dan
memiliki referensi ke TestCustomAudienceManager
dan yang digunakan di
bagian sebelumnya.
Untuk mereset penggantian bagi semua audiens kustom:
- Panggil metode
resetAllCustomAudienceOverrides()
asinkron dengan objekExecutor
danOutcomeReceiver
yang relevan.
Kotlin
// Resets overrides for all custom audiences
testCustomAudienceManager.resetCustomAudienceRemoteInfoOverride(
executor,
outComeReceiver)
Java
// Resets overrides for all custom audiences
testCustomAudienceManager.resetCustomAudienceRemoteInfoOverride(
executor,
outComeReceiver)
Setelah Anda mereset penggantian sisi beli, panggilan berikutnya keselectAds()
menggunakan biddingLogicUrl
dan trustedBiddingData
apa pun
disimpan di dalam CustomAudience
untuk mencoba mengambil
JavaScript yang diperlukan.
Jika panggilan ke resetCustomAudienceRemoteInfoOverride()
gagal,
callback OutComeReceiver.onError()
akan memberikan AdServiceException
.
Jika penghapusan penggantian dicoba dengan aplikasi yang tidak berjalan dalam mode debug
dengan opsi developer yang diaktifkan, AdServiceException
akan menunjukkan
IllegalStateException
sebagai penyebabnya.
Menyiapkan Server Pelaporan
Saat menggunakan penggantian pengambilan jarak jauh, Anda masih harus menyiapkan server yang dapat dijangkau oleh perangkat atau emulator untuk merespons peristiwa pelaporan. Endpoint sederhana yang menampilkan 200 sudah cukup untuk pengujian. Repo GitHub mencakup definisi layanan OpenAPI yang dapat di-deploy ke platform tiruan atau microservice yang didukung. Untuk mengetahui detail selengkapnya, lihat README project.
Saat mencari definisi OpenAPI, cari reporting-server.json.
File ini berisi endpoint sederhana yang menampilkan 200, yang mewakili kode
respons HTTP. Endpoint ini digunakan selama selectAds()
dan memberikan sinyal ke
Protected Audience API bahwa pelaporan tayangan berhasil diselesaikan.
Fungsi yang akan diuji
- Melakukan praktik saat bergabung atau keluar dan menyiapkan audiens kustom berdasarkan tindakan pengguna sebelumnya.
- Melakukan praktik inisiasi pemilihan iklan di perangkat melalui JavaScript yang dihosting dari jarak jauh.
- Amati bagaimana pengaitan aplikasi dengan setelan audiens kustom dapat memengaruhi hasil pemilihan iklan.
- Melatih pelaporan tayangan setelah pemilihan iklan.
Batasan
Tabel berikut mencantumkan batasan untuk pemrosesan Protected Audience API. Batas yang ditampilkan dapat berubah berdasarkan masukan. Untuk kemampuan yang sedang berlangsung, baca catatan rilis.
Komponen | Deskripsi Batas | Nilai Batas |
---|---|---|
Audiens kustom (CA) | Jumlah iklan maksimum per CA | 100 |
Jumlah maksimum CA per aplikasi | 1000 | |
Jumlah maksimum aplikasi yang dapat membuat CA | 1000 | |
Penundaan maksimum dalam waktu aktivasi CA dari waktu pembuatannya | 60 hari | |
Waktu habis masa berlaku maksimum CA dari waktu aktivasinya | 60 hari | |
Jumlah maksimum CA di perangkat | 4000 | |
Ukuran maksimum nama CA | 200 byte | |
Ukuran maksimum URI pengambilan harian | 400 byte | |
Ukuran maksimum URI logika bidding | 400 byte | |
Ukuran maksimum data bidding tepercaya | 10 KB | |
Ukuran maksimum sinyal bidding pengguna | 10 KB | |
Tarif panggilan maksimum untuk leaveCustomAudience per pembeli |
1 per detik | |
Tarif panggilan maksimum untuk joinCustomAudience per pembeli |
1 per detik | |
Pengambilan Latar Belakang CA | Waktu tunggu koneksi habis | 5 detik |
Waktu tunggu pembacaan HTTP habis | 30 detik | |
Total ukuran download maksimum | 10 KB | |
Durasi maksimum iterasi pengambilan | 5 menit | |
Jumlah maksimum CA yang diperbarui per tugas | 1000 | |
Pemilihan Iklan | Jumlah maksimum pembeli | Ditentukan Nanti |
Jumlah maksimum CA per pembeli | Ditentukan Nanti | |
Jumlah maksimum iklan dalam lelang | Ditentukan Nanti | |
Waktu tunggu koneksi awal habis | 5 detik | |
Waktu tunggu pembacaan koneksi habis | 5 detik | |
Waktu eksekusi maksimum AdSelection secara keseluruhan |
10 detik | |
Waktu eksekusi maksimum bidding per CA di AdSelection |
5 detik | |
Waktu eksekusi skor maksimum di AdSelection |
5 detik | |
Waktu eksekusi maksimum untuk per pembeli di AdSelection |
Ditentukan Nanti | |
Ukuran maksimum sinyal pemilihan iklan/penjual/per pembeli | Ditentukan Nanti | |
Ukuran maksimum skrip penjual/pembeli | Ditentukan Nanti | |
Tarif panggilan maksimum untuk selectAds |
1 QPS | |
Pelaporan tayangan | Waktu minimum sebelum menghapus pilihan iklan dari persistensi | 24 jam |
Jumlah maksimum pemilihan iklan penyimpanan | Ditentukan Nanti | |
Ukuran maksimum URL output pelaporan | Ditentukan Nanti | |
Waktu maksimum untuk pelaporan tayangan | Ditentukan Nanti | |
Jumlah maksimum percobaan ulang untuk panggilan notifikasi | Ditentukan Nanti | |
Waktu tunggu koneksi habis | 5 detik | |
Waktu eksekusi keseluruhan maksimum untuk reportImpression |
2 detik | |
Tarif panggilan maksimum untuk reportImpressions |
1 QPS | |
Pelaporan peristiwa | Jumlah maksimum beacon per pembeli per lelang | 10 |
Jumlah maksimum beacon per penjual per lelang |
10 |
|
Ukuran maksimum kunci peristiwa |
40 byte |
|
Ukuran maksimum data peristiwa |
64 KB |
|
Iklan | Ukuran maksimum daftar iklan | 10 KB digunakan bersama oleh semua
AdData
dalam satu CA untuk konteks |
URL | Panjang maksimum string URL apa pun yang diambil sebagai input | Ditentukan Nanti |
Javascript | Waktu eksekusi maksimum | 1 detik untuk bidding dan penskoran untuk pelaporan tayangan |
Memori maksimum yang digunakan | 10 MB |
Melaporkan bug dan masalah
Masukan Anda adalah bagian penting dari Privacy Sandbox di Android. Beri tahu kami jika Anda menemukan masalah atau memiliki ide untuk meningkatkan kualitas Privacy Sandbox di Android.
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Mendukung penargetan audiens kustom dengan Protected Audience API
- Catatan rilis
- Protected Audience: panduan integrasi