Podczas czytania dokumentacji Piaskownicy prywatności na Androida używaj przycisku Wersja przedpremierowa dla programistów lub Beta, aby wybrać wersję programu, z której korzystasz, ponieważ instrukcje mogą się różnić.
Interfejs Protected Audience API na Androidzie (wcześniej FLEDGE) obejmuje interfejsy Custom Audience API i Ad Selection API. Platformy technologii reklamowych i reklamodawcy mogą używać tych interfejsów API do wyświetlania dostosowanych reklam na podstawie wcześniejszego zaangażowania w aplikacji, co ogranicza udostępnianie identyfikatorów w różnych aplikacjach i udostępnianie informacji o interakcjach użytkownika z aplikacją innym firmom.
Interfejs Custom Audience API opiera się na abstrakcji „niestandardowa lista odbiorców”, która reprezentuje grupę użytkowników o podobnych intencjach. Reklamodawca może zarejestrować użytkownika na liście odbiorców niestandardowych i powiązać z nią odpowiednie reklamy. Te informacje są przechowywane lokalnie i mogą być wykorzystywane do określania stawek reklamodawców, filtrowania reklam i ich renderowania.
Interfejs Ad Selection API udostępnia platformę, która umożliwia wielu deweloperom przeprowadzanie lokalnej aukcji na potrzeby odbiorców niestandardowych. W tym celu system bierze pod uwagę odpowiednie reklamy powiązane z odbiorcami niestandardowymi i przeprowadza dodatkowe przetwarzanie reklam, które platforma technologii reklamowej zwraca na urządzenie.
Platformy technologii reklamowych mogą zintegrować te interfejsy API, aby wdrożyć remarketing, który chroni prywatność użytkowników. W przyszłych wersjach planujemy dodać obsługę kolejnych przypadków użycia, w tym reklam promujących instalację aplikacji. Więcej informacji o interfejsie Protected Audience API na Androidzie znajdziesz w projekcie.
Z tego przewodnika dowiesz się, jak korzystać z interfejsu Protected Audience API na Androidzie, aby:
- Zarządzanie niestandardowymi grupami odbiorców
- Konfigurowanie i przeprowadzanie wyboru reklam na urządzeniu
- Raportowanie wyświetleń reklam
Zanim zaczniesz
Zanim zaczniesz, wykonaj te czynności:
- Skonfiguruj środowisko programistyczne dla Piaskownicy prywatności na Androida.
- Zainstaluj obraz systemu na obsługiwanym urządzeniu lub skonfiguruj emulator, który obsługuje Piaskownicę prywatności na Androidzie.
W terminalu włącz dostęp do Protected Audience API (domyślnie jest wyłączony) za pomocą tego polecenia adb.
adb shell device_config put adservices ppapi_app_allow_list \"*\"W terminalu włącz raportowanie sygnałów za pomocą tych poleceń adb.
adb shell device_config put adservices fledge_beacon_reporting_metrics_enabled true adb shell device_config put adservices fledge_register_ad_beacon_enabled trueDodaj uprawnienia
ACCESS_ADSERVICES_CUSTOM_AUDIENCEdo pliku manifestu aplikacji:<uses-permission android:name="android.permission.ACCESS_ADSERVICES_CUSTOM_AUDIENCE" />Odwołaj się do konfiguracji usług reklamowych w elemencie
<application>pliku manifestu:<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/ad_services_config" />Określ zasób XML usług reklamowych, do którego odwołuje się plik manifestu, np.
res/xml/ad_services_config.xml. Więcej informacji o uprawnieniach usług reklamowych i kontroli dostępu do pakietu SDK<ad-services-config> <custom-audiences allowAllToAccess="true" /> </ad-services-config>Domyślnie interfejs Ad Selection API wymusza limity maksymalnej ilości pamięci, jaką może przydzielić skrypt aukcji lub raportowania wyświetleń. Funkcja ograniczenia pamięci wymaga WebView w wersji 105.0.5195.58 lub nowszej. Platforma wymusza sprawdzanie wersji, a wywołania interfejsów API
selectAdsireportImpressionkończą się niepowodzeniem, jeśli ten warunek nie zostanie spełniony. Możesz to zrobić na 2 sposoby:Opcja 1. Aby dezaktywować to sprawdzanie, uruchom to polecenie adb:
adb device_config put fledge_js_isolate_enforce_max_heap_size falseOpcja 2. Zainstaluj WebView Beta ze Sklepu Google Play. Musi być równa wersji podanej wcześniej lub od niej wyższa.
Dołączanie do grupy odbiorców niestandardowych
Lista odbiorców niestandardowych to grupa użytkowników o podobnych zamiarach lub zainteresowaniach, określonych przez aplikację reklamodawcy. Aplikacja lub pakiet SDK może używać listy odbiorców niestandardowych do wskazywania konkretnych odbiorców, np. osób, które zostawiły produkty w koszyku. Aby utworzyć niestandardową listę odbiorców lub dołączyć do niej asynchronicznie, wykonaj te czynności:
- Zainicjuj obiekt
CustomAudienceManager. - Utwórz obiekt
CustomAudience, podając kluczowe parametry, takie jak pakiet kupującego i odpowiednia nazwa. Następnie zainicjuj obiektJoinCustomAudienceRequestza pomocą obiektuCustomAudience. - Wywołaj asynchroniczną funkcję
joinCustomAudience()z obiektemJoinCustomAudienceRequestoraz odpowiednimi obiektamiExecutoriOutcomeReceiver.
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);
Kombinacja tych parametrów jednoznacznie identyfikuje każdy obiekt CustomAudience na urządzeniu:
owner: nazwa pakietu aplikacji będącej właścicielem. Jest ona niejawnie ustawiona na nazwę pakietu aplikacji wywołującej.buyer: Identyfikator sieci reklamowej kupującego, która zarządza reklamami kierowanymi na tę niestandardową listę odbiorców.name: dowolna nazwa lub identyfikator listy odbiorców niestandardowych.
Wielokrotne wywoływanie funkcji joinCustomAudience() z różnymi instancjami CustomAudience aktualizuje wszystkie istniejące obiekty CustomAudience o pasujących parametrach owner, buyer i name. Aby chronić prywatność, wynik interfejsu API nie rozróżnia „utworzenia” i „aktualizacji”.
Dodatkowo CustomAudience musi być utworzony z tymi wymaganymi parametrami:
- URL codziennej aktualizacji: adres URL HTTPS odpytywany codziennie w tle w celu aktualizowania sygnałów licytowania użytkowników, zaufanych danych o licytowaniu oraz adresów URL renderowania i metadanych reklam na potrzeby niestandardowej listy odbiorców.
- Adres URL logiki określania stawek: adres URL HTTPS, do którego wysyłane jest zapytanie podczas wybierania reklamy w celu pobrania logiki określania stawek w JavaScript kupującego. Wymagane sygnatury funkcji znajdziesz w tym kodzie JavaScript.
- Identyfikatory renderowania reklamy: dowolny identyfikator ustawiony przez technologię reklamową kupującego. Jest to optymalizacja generowania ładunku na potrzeby B&A.
Opcjonalne parametry obiektu CustomAudience mogą obejmować:
- Czas aktywacji: lista odbiorców niestandardowych może uczestniczyć w wybieraniu reklam i codziennych aktualizacjach dopiero po upływie czasu aktywacji. Może to być przydatne np. do ponownego zaangażowania użytkowników, którzy przestali korzystać z aplikacji.
- Czas wygaśnięcia: przyszły czas, po którym lista niestandardowych odbiorców zostanie usunięta z urządzenia.
- Sygnały określania stawek użytkownika: ciąg JSON zawierający sygnały użytkownika, takie jak preferowane ustawienia regionalne użytkownika, które są wykorzystywane przez kod JavaScript logiki określania stawek kupującego do generowania stawek podczas procesu wyboru reklamy. Ten format pomaga platformom technologii reklamowej ponownie wykorzystywać kod na różnych platformach i ułatwia korzystanie z funkcji JavaScriptu.
- Zaufane dane określania stawek: adres URL HTTPS i lista ciągów znaków używane podczas procesu wyboru reklam, które pobierają sygnały określania stawek z zaufanej usługi klucz/wartość.
- Ads: lista obiektów
AdDataodpowiadających reklamom, które biorą udział w wybieraniu reklam. Każdy obiektAdDataskłada się z tych elementów:- Adres URL renderowania: adres URL HTTPS, do którego wysyłane jest zapytanie w celu renderowania ostatecznej reklamy.
- Metadane: obiekt JSON zserializowany jako ciąg znaków zawierający informacje, które będą wykorzystywane przez logikę określania stawek kupującego podczas procesu wyboru reklamy.
- Filtry reklam: klasa zawierająca wszystkie niezbędne informacje do filtrowania reklam zachęcających do instalacji aplikacji i ograniczania częstotliwości wyświetlania podczas wyboru reklam.
Oto przykład utworzenia instancji obiektu 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();
Obsługa wyników wywołania funkcji joinCustomAudience()
Asynchroniczna metoda joinCustomAudience() używa obiektu OutcomeReceiver do sygnalizowania wyniku wywołania interfejsu API.
- Wywołanie zwrotne
onResult()oznacza, że lista odbiorców niestandardowych została utworzona lub zaktualizowana. - Wywołanie zwrotne
onError()oznacza 2 możliwe warunki.- Jeśli
JoinCustomAudienceRequestzostanie zainicjowany z nieprawidłowymi argumentami,AdServicesExceptionwskażeIllegalArgumentExceptionjako przyczynę. - W przypadku wszystkich innych błędów wyświetla się kod
AdServicesExceptionz przyczynąIllegalStateException.
- Jeśli
Oto przykład obsługi wyniku funkcji 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);
}
};
Opuszczanie grupy odbiorców niestandardowych
Jeśli użytkownik nie spełnia już kryteriów biznesowych dla danej listy odbiorców niestandardowych, aplikacja lub pakiet SDK może wywołać funkcję leaveCustomAudience(), aby usunąć listę odbiorców niestandardowych z urządzenia. Aby usunąć CustomAudience na podstawie jego unikalnych parametrów:
- Zainicjuj obiekt
CustomAudienceManager. - Zainicjuj
LeaveCustomAudienceRequestza pomocąbuyerinameniestandardowych odbiorców. Więcej informacji o tych polach do wprowadzania danych znajdziesz w artykule „Dołączanie do odbiorców niestandardowych”. - Wywołaj asynchroniczną metodę
leaveCustomAudience()z obiektemLeaveCustomAudienceRequestoraz odpowiednimi obiektamiExecutoriOutcomeReceiver.
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);
Podobnie jak w przypadku wywołania joinCustomAudience(), znak OutcomeReceiver oznacza koniec wywołania interfejsu API. Aby chronić prywatność, wynik błędu nie rozróżnia błędów wewnętrznych od nieprawidłowych argumentów. onResult()Wywołanie zwrotne jest wywoływane po zakończeniu wywołania interfejsu API, niezależnie od tego, czy pasująca lista odbiorców niestandardowych została usunięta.
Uruchom wybór reklamy
Aby wybrać reklamy za pomocą interfejsu Protected Audience API, wywołaj metodę selectAds():
- Zainicjuj obiekt
AdSelectionManager. - Utwórz obiekt
AdSelectionConfig. - Wywołaj asynchroniczną metodę
selectAds()z obiektemAdSelectionConfigoraz odpowiednimi obiektamiExecutoriOutcomeReceiver.
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);
Metoda selectAds() wymaga danych wejściowych AdSelectionConfig, w których musisz podać te wymagane parametry:
- Sprzedawca: identyfikator sieci reklamowej sprzedawcy, która inicjuje wybór reklamy.
- Adres URL logiki decyzyjnej: adres URL HTTPS, do którego wysyłane jest zapytanie w celu uzyskania logiki JavaScript sieci reklamowej sprzedawcy.
- Adres URL HTTPS: wysyłane jest zapytanie w celu uzyskania logiki JavaScriptu sieci reklamowej sprzedawcy. Sprawdź wymagane sygnatury funkcji.
- Wstępnie utworzony identyfikator URI: zgodny z formatem wyboru reklam FLEDGE.
IllegalArgumentExceptionjest zgłaszany, jeśli przekazany zostanie nieobsługiwany lub nieprawidłowo sformatowany wstępnie utworzony identyfikator URI.
- Kupujący odbiorców niestandardowych: pełna lista identyfikatorów sieci reklamowych kupujących, które sprzedawca dopuszcza do udziału w procesie wyboru reklamy.
Te identyfikatory kupującego odpowiadają
CustomAudience.getBuyer()uczestniczących niestandardowych grup odbiorców.
Aby bardziej dostosować wybieranie reklam, możesz opcjonalnie określić te parametry:
- Sygnały wyboru reklamy: obiekt JSON zserializowany jako ciąg znaków zawierający sygnały, które mają być wykorzystywane przez logikę określania stawek kupującego w JavaScript pobranym z
CustomAudience.getBiddingLogicUrl(). - Sygnały sprzedawcy: obiekt JSON zserializowany jako ciąg znaków zawierający sygnały wykorzystywane przez pobraną logikę decyzyjną JavaScript sprzedawcy z
AdSelectionConfig.getDecisionLogicUrl(). - Sygnały dotyczące poszczególnych kupujących: mapa obiektów JSON zserializowanych jako ciągi tekstowe, zawierająca sygnały, które mają być wykorzystywane przez logikę określania stawek w JavaScript poszczególnych kupujących pobraną z
CustomAudience.getBiddingLogicUrl(), zidentyfikowaną przez pola kupującego w uczestniczących niestandardowych listach odbiorców. - Reklamy kontekstowe: zbiór kandydatów do wyświetlenia reklam, którzy są zbierani bezpośrednio od kupujących podczas aukcji odbywającej się poza aukcją Protected Audience.
Po wybraniu reklamy wyniki, stawki i sygnały są przechowywane wewnętrznie na potrzeby raportowania. Wywołanie zwrotne OutcomeReceiver.onResult() zwraca wartość AdSelectionOutcome, która zawiera:
- Adres URL renderowania zwycięskiej reklamy uzyskany z parametru
AdData.getRenderUrl(). - Identyfikator wyboru reklamy unikalny dla użytkownika urządzenia. Ten identyfikator jest używany do raportowania wyświetleń reklamy.
Jeśli wybór reklamy nie może zostać ukończony z powodów takich jak nieprawidłowe argumenty, przekroczenie limitu czasu lub nadmierne zużycie zasobów, wywołanie zwrotne OutcomeReceiver.onError() zapewnia AdServicesException z następującymi zachowaniami:
- Jeśli wybór reklamy zostanie zainicjowany z nieprawidłowymi argumentami, wartość
AdServicesExceptionbędzie wskazywaćIllegalArgumentExceptionjako przyczynę. - W przypadku wszystkich innych błędów wyświetla się kod
AdServicesExceptionz przyczynąIllegalStateException.
Reklamy kontekstowe
Protected Audience API może uwzględniać reklamy kontekstowe w aukcji chronionej.
Reklamy kontekstowe muszą być wybierane na serwerze technologii reklamowych i zwracane do urządzenia poza interfejsami Protected Audience API. Reklamy kontekstowe można następnie uwzględnić w aukcji za pomocą parametru AdSelectionConfig, w którym to momencie działają one tak samo jak reklamy na urządzeniu, w tym kwalifikują się do filtrowania reklam wykluczających. Po zakończeniu aukcji Protected Audience API musisz wywołać funkcję reportImpression(). Wywołuje to funkcję reportWin() w wygrywającej reklamie kontekstowej, w taki sam sposób jak raportowanie wyświetleń, aby wyświetlić wygrywającą reklamę na urządzeniu. Każda reklama kontekstowa wymaga kupującego, stawki, linku do logiki raportowania, adresu URL renderowania i metadanych reklamy.
Aby wdrożyć w aplikacji reklamy kontekstowe, aplikacja docelowa musi utworzyć obiekt
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();
Powstały obiekt ContextualAds można następnie przekazać podczas tworzenia 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);
Filtrowanie reklam promujących instalacje aplikacji
Filtrowanie reklam promujących instalację aplikacji pomaga filtrować reklamy promujące instalację aplikacji, które są już zainstalowane na urządzeniu.
Pierwszym krokiem w tym procesie jest określenie, którzy reklamodawcy mogą filtrować zainstalowany pakiet. Musisz to zrobić w aplikacji, na którą chcesz kierować reklamę.
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);
}
});
Gdy powyższy kod zostanie wykonany, reklamodawcy będą mogli odfiltrować zainstalowane aplikacje, które określisz podczas generowania przez nich stawek. Jeśli chcesz odebrać reklamodawcy dostęp do stanu instalacji tej aplikacji, ponownie uruchom ten kod, usuwając informacje o reklamodawcy.
Następnym krokiem jest skonfigurowanie filtrowania reklam w aplikacji wydawcy. Podmiot, który wyświetla reklamę w aplikacji wydawcy (najprawdopodobniej pakiet SDK platformy SSP), musi zainicjować swój obiekt AdFilters, podając informacje o tym, które reklamy związane z aplikacjami mają być odfiltrowane:
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();
Wydawcy korzystający z platformy DSP mogą też ustawić AdFilter w przypadku reklam wyświetlanych w ramach ich odbiorców niestandardowych.
AdFilters można też przekazać w momencie tworzenia instancji nowego obiektu AdData:
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();
Filtrowanie według limitu wyświetleń na użytkownika
Filtrowanie według limitu wyświetleń umożliwia platformom reklamowym ograniczenie liczby wyświetleń reklamy. Filtrowanie według ograniczenia liczby wyświetleń zmniejsza nadmierną ekspozycję reklam i optymalizuje wybór alternatywnych reklam w danej kampanii reklamowej.
Filtr limitu wyświetleń składa się z 2 głównych komponentów: typu zdarzenia reklamy i klucza licznika reklam. Dostępne typy zdarzeń reklamowych, których można używać:
- Wygrana: zdarzenie wygranej wskazuje, że reklama wygrała aukcję. Zdarzenia wygranej są automatycznie aktualizowane przez Protected Audience API i nie mogą być wywoływane bezpośrednio przez dewelopera. Dane o wygranych są widoczne tylko w przypadku reklam w danej grupie odbiorców niestandardowych.
- Wyświetlenie: niezależnie od
reportImpressionwywołujący na urządzeniu (platforma SSP lub MMP) używaupdateAdCounterHistogram()do wywoływania zdarzeń wyświetlenia w wybranym przez siebie miejscu w kodzie. Zdarzenia wyświetlenia są widoczne dla wszystkich reklam należących do danej platformy DSP i nie są ograniczone do reklam na tej samej liście odbiorców niestandardowych. - Wyświetlenie: zdarzenie jest wywoływane przez podmiot wywołujący na urządzeniu (platformę SSP lub MMP) w wybranym przez niego miejscu w kodzie za pomocą wywołania funkcji
updateAdCounterHistogram(). Wyświetlenia są widoczne dla wszystkich reklam należących do danej platformy DSP i nie są ograniczone do reklam na tej samej liście odbiorców niestandardowych. - Kliknięcie: zdarzenie jest wywoływane przez podmiot wywołujący na urządzeniu (platformę SSP lub MMP) w wybranym przez niego miejscu w kodzie za pomocą wywołania funkcji
updateAdCounterHistogram(). Zdarzenia kliknięć są widoczne dla wszystkich reklam należących do danej platformy DSP, a nie tylko dla reklam na tej samej liście odbiorców niestandardowych.
W aplikacji wydawcy platforma SSP lub MMP, która jest obecna na urządzeniu, wywołuje zdarzenia reklamowe. Gdy wywoływana jest funkcja updateAdCounterHistogram(), licznik filtra ograniczenia liczby wyświetleń jest zwiększany, aby przyszłe aukcje miały aktualne informacje o wyświetleniach danej reklamy przez użytkownika. Typy zdarzeń związanych z reklamami nie są powiązane z odpowiednimi działaniami użytkowników i stanowią wytyczne, które pomagają wywołującym w strukturyzacji systemu zdarzeń. Aby zwiększać liczniki reklam w momencie zdarzenia, podmiot działający na urządzeniu podaje identyfikator wyboru reklamy zwycięskiej aukcji reklam.
Klucze licznika reklam to dowolne 32-bitowe liczby całkowite ze znakiem przypisywane przez technologię reklamową kupującego. Odpowiadają one danemu zestawowi reklam zdefiniowanemu przez platformę DSP. Klucze licznika reklam są ograniczone tylko do reklam należących do danej platformy DSP, więc można je wybierać bez nakładania się na histogramy z innej technologii reklamowej. Klucze licznika reklam służą do zwiększania identyfikatorów specyficznych dla platformy DSP w reklamach tej platformy lub w danej grupie odbiorców niestandardowych, aby odfiltrowywać reklamy z przyszłych aukcji.
Klucze licznika mogą służyć do określania priorytetów reklam, które z większym prawdopodobieństwem zainteresują danego użytkownika na podstawie jego interakcji z innymi reklamami pochodzącymi z technologii reklamowych danego kupującego. Na przykład reklama, która uzyskała wysoki poziom zaangażowania w wygrywanych aukcjach reklam, wyświetleniach i kliknięciach, stanowi wywnioskowany punkt danych. Aby to zilustrować: reklama kijów golfowych dla osób leworęcznych może wskazywać, że użytkownik nie jest zainteresowany kijami dla osób praworęcznych. Filtr limitu wyświetleń na użytkownika ustawiony dla klucza licznika przypisanego do reklam dla osób leworęcznych może odfiltrować reklamy klubów dla osób praworęcznych.
Aby używać w aukcji limitu wyświetleń na użytkownika, musisz najpierw utworzyć te obiekty:KeyedFrequencyCap
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();
Po utworzeniu obiektów KeyedFrequencyCap możesz przekazać je do obiektu 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();
Gdy obiekt AdFilters jest wypełniony filtrami ograniczenia liczby wyświetleń, można go przekazać podczas tworzenia niestandardowej listy odbiorców:
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();
Gdy w przypadku niestandardowej listy odbiorców zostaną wdrożone filtry limitu częstotliwości, platforma SSP może wywołać niezbędne zdarzenia kliknięcia, wyświetlenia lub wyświetlenia reklamy.
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();
Reklamy, które osiągnęły wstępnie ustawione limity filtrowania ograniczeń liczby wyświetleń, są odfiltrowywane z aukcji. Filtrowanie odbywa się przed wykonaniem logiki ustalania stawek w przypadku aukcji na urządzeniu oraz podczas generowania ładunku w przypadku aukcji w usługach ustalania stawek i aukcji.Ten zestaw narzędzi daje dostawcom technologii reklamowych elastyczność w zakresie wykorzystywania interakcji między użytkownikami a reklamami w ramach ich niestandardowych odbiorców do kierowania reklam przy jednoczesnym minimalizowaniu nadmiernej ekspozycji reklam.
Filtrowanie reklam kontekstowych bez wywołań sieciowych
Jeśli na urządzeniu nie ma zapotrzebowania na remarketing, możesz przeprowadzić wybór reklam kontekstowych bez wywołań sieciowych. Dzięki gotowym identyfikatorom URI i liście reklam kontekstowych ze stawkami platforma może pominąć pobieranie logiki ustalania stawek, sygnałów dotyczących stawek i sygnałów oceny. Platforma używa gotowego identyfikatora URI, aby wybrać reklamę kontekstową z najwyższą stawką.
Aby zmniejszyć opóźnienie, dostawcy technologii reklamowych mogą uruchamiać proces wyboru reklam, który obejmuje tylko reklamy kontekstowe z funkcją filtrowania reklam bez wywołań sieciowych. Osiąga się to dzięki używaniu gotowych adresów URI do sygnałów oceny. Listę implementacji scoreAds znajdziesz w sekcji Obsługiwane przypadki użycia i nazwy gotowych identyfikatorów URI.
Aby przeprowadzić wybór reklamy bez wywołań sieciowych:
- Konfigurowanie filtrowania reklam
- Tworzenie reklam kontekstowych
Utwórz obiekt
AdSelectionConfigz tymi ustawieniami:- pusta lista kupujących,
- Gotowy identyfikator URI do wybierania najwyższej stawki
- Reklamy kontekstowe
- Pusty identyfikator URI sygnałów oceny. Pusty identyfikator URI jest dozwolony, aby wskazać, że nie chcesz używać pobierania zaufanych sygnałów do określania wyniku:
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();Uruchom wybór reklamy:
adSelectionManager.selectAds( adSelectionConfig, executor, outcomeReceiver);
Uruchamianie własnego kodu JavaScript do raportowania podczas korzystania z gotowych identyfikatorów URI
Obecnie platforma Piaskownicy prywatności ma tylko podstawową implementację JavaScriptu do raportowania dostępną w przypadku gotowych identyfikatorów URI. Jeśli chcesz uruchamiać własny kod JavaScript do raportowania, ale nadal używać gotowych identyfikatorów URI do wyboru reklam o niskim opóźnieniu, możesz zastąpić DecisionLogicUri między wyborem reklamy a raportowaniem.
- Wykonaj czynności , aby uruchomić wybieranie reklam kontekstowych za pomocą gotowych identyfikatorów URI.
Przed wygenerowaniem raportu utwórz kopię
AdSelectionConfigadSelectionConfigWithYourReportingJS = adSelectionConfig.cloneToBuilder() // Replace <urlToFetchYourReportingJS> with your own URL: .setDecisionLogicUri(Uri.parse(<urlToFetchYourReportingJS>)) .build();Generowanie raportów o wyświetleniach
// adSelectionId is from the result of the previous selectAds run ReportImpressionRequest request = new ReportImpressionRequest( adSelectionId, adSelectionConfigWithYourReportingJS); adSelectionManager.reportImpression( request, executor, outcomeReceiver);
Uruchamianie zapośredniczenia kaskadowego
Zapośredniczenie kaskadowe wymaga, aby wiele pakietów SDK firm zewnętrznych (sieci innych firm) było zarządzanych przez pakiet SDK sieci zapośredniczenia firmy. Mediacja kaskadowa działa tak samo niezależnie od tego, czy aukcja odbyła się na urządzeniu, czy w usługach Bidding & Auction (B&A).
Sieci 3P
Sieci zewnętrzne muszą udostępniać adapter, który umożliwia sieci mediacyjnej wywoływanie metod niezbędnych do przeprowadzania aukcji:
- Uruchom wybór reklamy
- Wyświetlenia raportu
Oto przykład adaptera sieci mediacyjnej:
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() {...}
}
Każdy pakiet SDK ma własnych menedżerów i klientów usługi wyboru reklam oraz własną implementację selectAds i reportImpressions. Dostawcy pakietów SDK mogą zapoznać się z sekcjami dotyczącymi przeprowadzania wyboru reklam w przypadku aukcji na urządzeniu lub z wyjaśnieniem dotyczącym aukcji B&A. Postępuj zgodnie z instrukcjami raportowania wyświetleń reklam (w przypadku raportowania postępuj zgodnie z instrukcjami raportowania wyświetleń w przypadku pojedynczej platformy SSP).
Sieć zapośredniczeń
Podobnie jak sieci zewnętrzne, sieci zapośredniczenia wymagają implementacji selectAds i reportImpression. Więcej informacji znajdziesz w sekcjach dotyczących przeprowadzania wyboru reklamy i raportowania wyświetleń reklam.
Sieci zapośredniczeń odpowiadają za uruchamianie łańcucha zapośredniczenia i umieszczanie się w nim. W następnej sekcji znajdziesz informacje o tym, jak skonfigurować i przeprowadzić ten proces.
Pobieranie łańcucha zapośredniczenia i minimalnych stawek
Sieć zapośredniczeń jest odpowiedzialna za pobieranie reklam kontekstowych własnych (1P), łańcucha zapośredniczeń i minimalnych stawek sieci innych firm (3P). Może to nastąpić w żądaniu pobrania reklam kontekstowych wykonanym przez sieć zapośredniczenia. Łańcuch zapośredniczenia określa, jak iterować sieci innych firm, a minimalne stawki mogą być przekazywane do procesu aukcji jako adSelectionSignals.
Pozycja sieci w łańcuchu zapośredniczenia
Pakiet SDK do zapośredniczenia może umieścić się w łańcuchu zapośredniczenia na podstawie wartości eCPM w czasie rzeczywistym
w przypadku stawek za reklamy własne. W interfejsie Protected Audience API stawki za reklamy są nieprzejrzyste. Pakiet SDK zapośredniczenia powinien używać AdSelectionFromOutcomesConfig, aby móc porównać stawkę danej reklamy własnej z najniższą stawką w następnej sieci zewnętrznej w łańcuchu. Jeśli stawka 1P jest wyższa niż minimalna stawka, oznacza to, że pakiet SDK do zapośredniczenia jest umieszczony przed tą siecią zewnętrzną.
Uruchom wybór reklamy
Aby pobrać kandydata na reklamę własną, sieć zapośredniczenia może przeprowadzić aukcję na urządzeniu, wykonując czynności opisane w sekcji Przeprowadzanie wyboru reklamy. Generuje to kandydata na reklamę własną, stawkę i AdSelectionId, które są używane w procesie zapośredniczenia.
Tworzenie obiektu AdSelectionFromOutcomesConfig
AdSelectionFromOutcomesConfig umożliwia sieci mediacyjnej przekazywanie listy AdSelectionIds (wyników poprzednich aukcji), sygnałów wyboru reklamy i identyfikatora URI do pobierania JavaScriptu, który wybiera reklamę spośród wielu kandydatów. Lista identyfikatorów wyboru reklamy wraz z ich stawkami i sygnałami jest przekazywana do kodu JavaScript, który może zwrócić jeden z identyfikatorów AdSelectionIds, jeśli przekroczy on minimalną stawkę, lub żaden, jeśli łańcuch zapośredniczenia powinien być kontynuowany.
Sieci mediacyjne tworzą AdSelectionFromOutcomesConfig, używając AdSelectionId z sekcji powyżej oraz ceny minimalnej dla rozważanej sieci zewnętrznej. Dla każdego kroku w łańcuchu zapośredniczenia należy utworzyć nowy AdSelectionFromOutcomesConfig.
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){}
}
Zastąpienie metody selectAds() w przypadku mediacji kaskadowej wymaga podania danych wejściowych AdSelectionFromOutcomesConfig, w których musisz określić te wymagane parametry:
- Sprzedawca: identyfikator sieci reklamowej sprzedawcy, która inicjuje wybór reklamy.
- AdSelectionIds: lista pojedynczych identyfikatorów poprzedniego uruchomienia
selectAds()w przypadku reklamy własnej. - Sygnały wyboru reklamy: obiekt JSON zserializowany jako ciąg znaków zawierający sygnały, które mają być używane przez logikę określania stawek kupującego. W takim przypadku uwzględnij minimalną stawkę pobraną dla danej sieci zewnętrznej.
- Identyfikator URI logiki wyboru: adres URL HTTPS, do którego wysyłane jest zapytanie podczas wyboru reklamy w celu pobrania kodu JavaScript sieci mediacyjnej do wyboru zwycięskiej reklamy. Wymagane sygnatury funkcji znajdziesz w tym kodzie JavaScript. Jeśli stawka jest wyższa niż minimalna, JavaScript powinien zwrócić reklamę podmiotu zewnętrznego, a w przeciwnym razie –
null. Umożliwia to pakietowi SDK do zapośredniczenia skracanie łańcucha zapośredniczenia po znalezieniu zwycięzcy.
Po utworzeniu AdSelectionOutcomesConfig wywołaj metodę selectAds() sieci zewnętrznej, która jest pierwsza w łańcuchu.
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);
Orkiestracja kaskady zapośredniczenia
Poniżej przedstawiamy kolejność działań w procesie zapośredniczenia.
- Uruchom wybieranie reklam z danych własnych.
- Iteruj po łańcuchu zapośredniczenia. W przypadku każdej sieci zewnętrznej wykonaj te czynności:
- Ustal
AdSelectionFromOutcomeConfig, w tym cenę minimalnąoutcomeIdpakietu SDK podmiotu 1. i 3. - Wywołaj funkcję
selectAds()z konfiguracją z poprzedniego kroku. - Jeśli wynik nie jest pusty, zwróć reklamę.
- Wywołaj metodę
selectAds()bieżącego adaptera sieciowego pakietu SDK. Jeśli wynik nie jest pusty, zwróć reklamę.
- Ustal
- Jeśli w łańcuchu nie zostanie znaleziony żaden zwycięzca, zwróć reklamę 1P.
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) { ... }
}
Raportowanie wyświetleń reklam
Istnieją 2 sposoby zgłaszania wyświetlenia reklamy w zależności od tego, jak przebiega aukcja. Jeśli jesteś pojedynczą platformą SSP, która przeprowadza aukcję, postępuj zgodnie z instrukcjami w tej sekcji. Jeśli zamierzasz wdrożyć kaskadowe zapośredniczenie, wykonaj czynności opisane w sekcji raportowania wyświetleń w przypadku kaskadowego zapośredniczenia.
Raportowanie wyświetleń z pojedynczej platformy SSP
Po wybraniu zwycięskiej reklamy w procesie wyboru reklam możesz zgłosić wyświetlenie do uczestniczących platform po stronie kupującego i sprzedającego za pomocą metody AdSelectionManager.reportImpression(). Aby zgłosić wyświetlenie reklamy:
- Zainicjuj obiekt
AdSelectionManager. - Utwórz obiekt
ReportImpressionRequestz identyfikatorem wyboru reklamy. - Wywołaj asynchroniczną metodę
reportImpression()z obiektemReportImpressionRequestoraz odpowiednimi obiektamiExecutoriOutcomeReceiver.
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)
Zainicjuj ReportImpressionRequest za pomocą tych wymaganych parametrów:
- Identyfikator wyboru reklamy: identyfikator unikalny tylko dla użytkownika urządzenia, który identyfikuje udany wybór reklamy.
- Konfiguracja wyboru reklamy: ta sama konfiguracja, która jest używana w wywołaniu
selectAds()zidentyfikowanym przez podany identyfikator wyboru reklamy.
Asynchroniczna metoda reportImpression() używa obiektu OutcomeReceiver do sygnalizowania wyniku wywołania interfejsu API.
- Funkcja zwrotna
onResult()wskazuje, czy utworzono adresy URL raportowania wyświetleń i czy zaplanowano wysłanie żądania. - Wywołanie zwrotne
onError()wskazuje te możliwe warunki:- Jeśli wywołanie zostanie zainicjowane z nieprawidłowym argumentem wejściowym, kod błędu
AdServicesExceptionbędzie wskazywaćIllegalArgumentExceptionjako przyczynę. - W przypadku wszystkich innych błędów wyświetla się kod
AdServicesExceptionz przyczynąIllegalStateException.
- Jeśli wywołanie zostanie zainicjowane z nieprawidłowym argumentem wejściowym, kod błędu
Raportowanie wyświetleń w przypadku zapośredniczenia kaskadowego
Pakiet SDK do zapośredniczenia musi śledzić zwycięski pakiet SDK, aby uruchamiać przepływy raportowania. Zestawy SDK uczestniczące w łańcuchu zapośredniczenia powinny udostępniać metodę, którą zapośredniczenie może wywołać, aby uruchomić własny proces raportowania. Pakiet SDK uczestniczący w aukcji z mediacją może wykonać powyższe czynności, aby wdrożyć własne raportowanie.
Platformy SSP mogą użyć tego przykładowego kodu pakietu SDK firmy zewnętrznej jako prototypu sposobu dołączania do przepływów mediacji:
Pair<AdSelectionOutcome, NetworkAdapter> winnerOutcomeAndNetwork =
mediationSdk.orchestrateMediation(mediationChain);
if (winner.first.hasOutcome()) {
winner.second.reportImpressions(winner.first.getAdSelectionId());
Punkty końcowe raportowania wyświetleń
Interfejs API do wyświetleń raportu wysyła żądania HTTPS GET do punktów końcowych udostępnianych przez platformę sprzedającą i wygrywającą platformę kupującą:
Punkt końcowy platformy po stronie kupującego:
- Interfejs API używa adresu URL logiki określania stawek podanego w grupie odbiorców niestandardowych, aby pobrać dostarczony przez kupującego kod JavaScript, który zawiera logikę zwracania adresu URL raportowania wyświetleń.
- Wywołaj funkcję JavaScript
reportWin(), która powinna zwrócić adres URL raportowania wyświetleń kupującego.
Punkt końcowy platformy SSP:
- Użyj adresu URL logiki decyzyjnej określonego w obiekcie
AdSelectionConfig, aby pobrać kod JavaScript logiki decyzyjnej sprzedawcy. - Wywołaj funkcję JavaScript
reportResult(), która powinna zwrócić adres URL raportowania wyświetleń sprzedawcy.
Raportowanie usług określania stawek i aukcji
Aukcja przeprowadzona w usługach ustalania stawek i aukcji będzie zawierać wszystkie niezbędne informacje do raportowania, w tym wygenerowane adresy URL do raportowania interakcji z reklamami, które będą uwzględnione w zaszyfrowanej odpowiedzi z aukcji po stronie serwera. Po odszyfrowaniu odpowiedzi odpowiednie adresy URL są rejestrowane na platformie, więc raportowanie reklam i wyświetleń przebiega w ten sam sposób.
Raportowanie wyświetleń w ramach możliwie najlepszej obsługi
Metoda reportImpression() ma na celu jak najdokładniejsze ukończenie raportowania.
Raportowanie interakcji z reklamami
Protected Audience umożliwia raportowanie bardziej szczegółowych interakcji z wyświetloną reklamą. Mogą to być interakcje takie jak czas wyświetlania, kliknięcia, najechania kursorem myszy lub inne przydatne dane, które można zebrać. Proces otrzymywania tych raportów składa się z 2 etapów. Najpierw kupujący i sprzedawcy muszą zarejestrować się, aby otrzymywać te raporty w swoim JavaScript do raportowania. Następnie klient musi zgłosić te zdarzenia.
Rejestrowanie się w celu otrzymywania zdarzeń interakcji
Rejestracja zdarzeń interakcji odbywa się w funkcjach JavaScriptu kupującego reportWin() i sprzedawcy reportResult() za pomocą funkcji JavaScriptu udostępnianej przez platformę: registerAdBeacon. Aby zarejestrować się w celu otrzymywania raportu o wydarzeniu, wywołaj funkcję JavaScript platformy z JavaScriptu raportowania. W tym fragmencie kodu użyto reportWin() kupującego, ale to samo podejście można zastosować w przypadku reportResult().
reportWin(
adSelectionSignals,
perBuyerSignals,
signalsForBuyer,
contextualSignals,
customAudienceSignals) {
...
// Calculate reportingUri, clickUri, viewUri, and hoverUri
registerAdBeacon({"click": clickUri, "view": viewUri, "hover": hoverUri});
return reportingUri;
}
Raportowanie zdarzeń interakcji
Po zgłoszeniu wyświetlenia klienci mogą zgłaszać interakcje do wcześniej zarejestrowanych zwycięskich platform kupujących i sprzedających za pomocą metody AdSelectionManager.reportInteraction(). Aby zgłosić zdarzenie związane z reklamą:
- Zainicjuj obiekt
AdSelectionManager. - Utwórz obiekt
ReportInteractionRequestz identyfikatorem wyboru reklamy, kluczem interakcji, danymi interakcji i miejscem docelowym raportowania. - Wywołaj asynchroniczną metodę
reportInteraction()z obiektemrequestoraz odpowiednimi obiektamiExecutoriOutcomeReceiver.
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);
Zainicjuj ReportInteractionRequest za pomocą tych wymaganych parametrów:
- Identyfikator wyboru reklamy: identyfikator wyboru reklamy pobrany z wcześniej zwróconego
AdSelectionOutcome. - Klucz interakcji: ciąg znaków zdefiniowany przez klienta, który opisuje zgłaszane działanie. Musi on być zgodny z kluczem zarejestrowanym przez sprzedawcę lub kupującego w funkcjach JavaScript raportowania.
- Interaction Data: ciąg znaków zawierający dane, które mają być uwzględnione w raporcie o zdarzeniu i przesłane z powrotem na serwery raportowania.
- Miejsca docelowe raportowania: maska bitowa określająca, czy zdarzenia mają być raportowane kupującemu, sprzedawcy czy obu tym podmiotom. Te flagi są udostępniane przez platformę, a maskę miejsca docelowego można utworzyć za pomocą operacji bitowych. Aby wysyłać raporty do jednego miejsca docelowego, możesz bezpośrednio użyć flagi udostępnionej przez platformę. Aby wysyłać raporty do wielu miejsc docelowych, możesz użyć operatora bitowego OR (
|) do połączenia wartości flag.
Asynchroniczna metoda reportInteraction() używa obiektu OutcomeReceiver do sygnalizowania wyniku wywołania interfejsu API.
- Wywołanie zwrotne
onResult()wskazuje, że wywołanie interakcji z raportem jest prawidłowe. - Wywołanie zwrotne
onError()wskazuje te możliwe warunki:- Jeśli połączenie zostanie nawiązane, gdy aplikacja działa w tle, zwracany jest błąd
IllegalStateExceptionz opisem problemu. - Jeśli klient nie może wywołać funkcji
reportInteraction(), zwracana jest wartośćLimitExceededException. - Jeśli pakiet nie jest zarejestrowany do wywoływania interfejsów Privacy Preserving API, zwracana jest wartość
SecurityException(). - Jeśli aplikacja zgłaszająca interakcje jest inna niż aplikacja, która wywołała funkcję
selectAds(), zwracana jest wartośćIllegalStateException.
- Jeśli połączenie zostanie nawiązane, gdy aplikacja działa w tle, zwracany jest błąd
- Jeśli użytkownik nie wyraził zgody na włączenie interfejsów API Piaskownicy prywatności, wywołanie zakończy się bez powiadomienia o błędzie.
Punkty końcowe raportowania interakcji
Interfejs API interakcji z raportem wysyła żądania HTTPS POST do punktów końcowych udostępnianych przez platformę sprzedającą i platformę kupującą, która wygrała aukcję. Protected Audience dopasuje klucze interakcji do adresów URI zadeklarowanych w raportującym kodzie JavaScript i wyśle żądanie POST do każdego punktu końcowego dla każdej raportowanej interakcji.
Content-Type żądania to zwykły tekst, a treść to dane interakcji.
Raportowanie interakcji z możliwie najlepszą obsługą
reportInteraction() ma na celu zapewnienie możliwie najlepszego uzupełniania raportów za pomocą żądań HTTP POST.
Codzienna aktualizacja w tle
Podczas tworzenia listy niestandardowych odbiorców aplikacja lub pakiet SDK może inicjować metadane listy niestandardowych odbiorców. Dodatkowo platforma może aktualizować te elementy metadanych niestandardowych list odbiorców w ramach codziennego procesu aktualizacji w tle.
- Sygnały dotyczące określania stawek przez użytkowników
- Dane dotyczące określania stawek, którym ufasz
AdDatalista
W tym procesie wysyłane jest zapytanie do adresu URL codziennej aktualizacji zdefiniowanego na liście odbiorców niestandardowych, a adres URL może zwrócić odpowiedź JSON.
- Odpowiedź JSON może zawierać dowolne obsługiwane pola metadanych, które wymagają aktualizacji.
- Każde pole JSON jest weryfikowane niezależnie. Klient ignoruje nieprawidłowo sformatowane pola, co powoduje, że w odpowiedzi nie ma aktualizacji dotyczących tych pól.
- Pusta odpowiedź HTTP lub pusty obiekt JSON „
{}” nie powodują aktualizacji metadanych. - Rozmiar wiadomości z odpowiedzią musi być ograniczony do 10 KB.
- Wszystkie identyfikatory URI muszą używać protokołu HTTPS.
trusted_bidding_urimusi mieć taką samą domenę ETLD+1 jak kupujący.
Przykład: odpowiedź JSON dotycząca codziennej aktualizacji w tle
{
"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 do wybierania reklam
Proces wyboru reklamy koordynuje wykonywanie kodu JavaScript dostarczonego przez kupującego i sprzedawcę.
Dostarczony przez kupującego kod JavaScript jest pobierany z adresu URL logiki ustalania stawek określonego w niestandardowej liście odbiorców. Zwrócony kod JavaScript powinien zawierać te funkcje:
Kod JavaScript dostarczony przez sprzedawcę jest pobierany z adresu URL logiki decyzyjnej określonego w parametrze AdSelectionConfig interfejsu API do wyboru reklam. Zwrócony kod JavaScript powinien zawierać te funkcje:
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 };
}
Parametry wejściowe:
ad: obiekt JSON w formacievar ad = { 'render_url': url, 'metadata': json_metadata };auction_signals, per_buyer_signals: obiekty JSON określone w obiekcie konfiguracji aukcji.custom_audience_bidding_signals: obiekt JSON wygenerowany przez platformę. Format tego obiektu JSON jest następujący: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" }gdzie:
owner,buyerinameto ciągi znaków pobrane z właściwości o tej samej nazwie na niestandardowej liście odbiorców biorącej udział w wyborze reklamy.activation_timeiexpiration_timeto czas aktywacji i wygaśnięcia listy odbiorców niestandardowych wyrażony w sekundach od epoki uniksowej.ca_user_bidding_signalsto ciąg JSON określony w poluuserBiddingSignalsobiektuCustomAudiencew momencie tworzenia.trusted_bidding_signals, contextual_signalsiuser_signalsto obiekty JSON. Są one przekazywane jako puste obiekty i będą wypełniane w przyszłych wersjach. Ich format nie jest wymuszany przez platformę i jest zarządzany przez technologię reklamową.
Wynik:
ad: to reklama, do której odnosi się stawka. Skrypt może zwrócić kopię otrzymanej reklamy z innymi metadanymi. Właściwośćrender_urlreklamy powinna pozostać niezmieniona.bid: wartość zmiennoprzecinkowa reprezentująca wartość stawki za tę reklamę.status: wartość całkowita, która może być:0: w przypadku pomyślnego wykonania1: (lub dowolna wartość różna od zera), jeśli którykolwiek z sygnałów wejściowych jest nieprawidłowy. Jeśli funkcja generate-bid zwróci wartość inną niż zero, proces ustalania stawek zostanie unieważniony w przypadku wszystkich reklam CA.
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 };
}
Parametry wejściowe:
ad: zobacz dokumentacjęgenerateBidbid: wartość stawki za reklamę;ad_selection_config: obiekt JSON reprezentujący parametrAdSelectionConfiginterfejsuselectAdsAPI. Format jest następujący: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: obiekty JSON odczytane z parametru interfejsu APIsellerSignalsAdSelectionConfigtrusted_scoring_signal: odczyt z polaadSelectionSignalsw parametrze interfejsu APIAdSelectionConfigcontextual_signals, user_signals: obiekty JSON. Są one przekazywane jako puste obiekty i zostaną wypełnione w przyszłych wersjach. Platforma nie wymusza ich formatu, a zarządza nim technologia reklamowa.per_buyer_signals: obiekt JSON odczytany z mapyperBuyerSignalw parametrze interfejsu APIAdSelectionConfig, w którym jako klucz używany jest bieżący kupujący odbiorców niestandardowych. Pusta, jeśli mapa nie zawiera żadnego wpisu dla danego kupującego.
Dane wyjściowe:
score: wartość zmiennoprzecinkowa reprezentująca wartość wyniku tej reklamy.status: wartość całkowita, która może być:- 0: w przypadku udanego wykonania
- 1. w przypadku nieprawidłowych
customAudienceSignals. - 2. w przypadku nieprawidłowego parametru
AdSelectionConfig; - 3. w przypadku, gdy którykolwiek z pozostałych sygnałów jest nieprawidłowy.
- Każda wartość różna od zera powoduje niepowodzenie procesu. Wartość określa typ zgłoszonego wyjątku.
selectOutcome()
function selectOutcome(
outcomes,
selection_signals) {
return {'status': 0, 'result': null};
}
Parametry wejściowe:
outcomes: obiekt JSON{"id": id_string, "bid": bid_double}selection_signals: obiekty JSON określone w konfiguracji aukcji.
Dane wyjściowe:
status:0– w przypadku powodzenia, wartość różna od zera w przypadku niepowodzeniaresult: jeden z wyników przekazanych lub wartość 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 }
};
}
Parametry wejściowe:
ad_selection_config: zapoznaj się z dokumentacjąscoreAdsrender_url: adres URL renderowania zwycięskiej reklamy;bid: stawka za zwycięską reklamę;contextual_signals: zapoznaj się z dokumentacjągenerateBid
Dane wyjściowe:
status: 0w przypadku powodzenia i wartość różną od zera w przypadku niepowodzenia.results: obiekt JSON zawierający:signals_for_buyer: obiekt JSON przekazywany do funkcjireportWin.reporting_url: adres URL używany przez platformę do powiadamiania kupującego o wyświetleniu.
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 } };
}
Parametry wejściowe:
ad_selection_signals, per_buyer_signals: zapoznaj się z dokumentacją dotyczącąscoreAdsignals_for_buyer: obiekt JSON zwrócony przezreportResultcontextual_signals, custom_audience_signals: zapoznaj się z dokumentacją dotyczącągenerateBid
Dane wyjściowe:
status: 0w przypadku powodzenia i wartość różną od zera w przypadku niepowodzenia.results: obiekt JSON zawierający:reporting_url: adres URL używany przez platformę do powiadamiania sprzedawcy o wyświetleniu.
registerAdBeacon()
function registerAdBeacon(
beacons
)
Parametry wejściowe:
beacons: obiekt zawierający pary klucz-wartość kluczy interakcji i identyfikatorów URI raportowania. Format:let beacons = { 'interaction_key': 'reporting_uri', 'interaction_key': 'reporting_uri', ... }interaction_key: ciąg znaków reprezentujący zdarzenie. Platforma używa tego parametru później podczas raportowania interakcji ze zdarzeniami, aby wyszukaćreporting_uri, które powinny otrzymać powiadomienie. Klucz musi być zgodny z tym, co rejestruje kupujący lub sprzedawca, oraz z tym, co zgłasza sprzedawca.reporting_uri: Identyfikator URI do otrzymywania raportów o zdarzeniach. Powinno to być konkretne zdarzenie związane z rodzajem zgłaszanego zdarzenia. Musi akceptować żądanie POST, aby obsługiwać wszystkie dane zgłaszane wraz ze zdarzeniem.
Na przykład:
let beacons = { 'click': 'https://reporting.example.com/click_event', 'view': 'https://reporting.example.com/view_event' }
Wbudowane identyfikatory URI wyboru reklamy
Wstępnie utworzone identyfikatory URI umożliwiają dostawcom technologii reklamowych wyznaczanie funkcji JavaScript do logiki podejmowania decyzji o wyborze reklamy w klasach AdSelectionConfig i AdSelectionFromOutcomesConfig. Wstępnie utworzone identyfikatory URI nie wymagają wywołań sieciowych, aby pobrać odpowiedni kod JavaScript. Technologie reklamowe mogą używać gotowych identyfikatorów URI bez konieczności konfigurowania zarejestrowanej domeny do hostowania kodu JavaScript.
Gotowy identyfikator URI jest tworzony w tym formacie:
ad-selection-prebuilt:<use-case>/<name>?<required-script-generation-parameters>
Platforma Piaskownicy prywatności udostępnia JavaScript, korzystając z informacji z tego adresu URI w czasie działania.
Wyjątek IllegalArgumentException jest zgłaszany, jeśli:
- w identyfikatorze URI brakuje któregokolwiek z wymaganych parametrów;
- w identyfikatorze URI występują nierozpoznane parametry.
Obsługiwane gotowe przypadki użycia i nazwy identyfikatorów URI
Przypadek użycia 1: wybór reklamy
Gotowe identyfikatory URI w przypadku użycia ad-selection są obsługiwane w przepływie selectAds(AdSelectionConfig).
Nazwa gotowego identyfikatora URI: highest-bid-wins
Ten gotowy identyfikator URI zawiera kod JavaScript, który po zakończeniu licytacji wybiera reklamę z najwyższą stawką. Udostępnia też podstawową funkcję raportowania, która pozwala zgłaszać render_uri i bid zwycięzcy.
Parametry wymagane
reportingUrl: podstawowy adres URL raportowania, który jest sparametryzowany za pomocą render_uri i bid zwycięskiej reklamy:
<reportingUrl>?render_uri=<renderUriOfWinnigAd>&bid=<bidOfWinningAd>
Wykorzystanie
Jeśli podstawowy adres URL raportowania to https://www.ssp.com/reporting, gotowy adres URI będzie wyglądać tak:
`ad-selection-prebuilt://ad-selection/highest-bid-wins/?reportingUrl=https://www.ssp.com/reporting`
Przypadek użycia 2. Wybieranie reklam na podstawie wyników
Gotowe identyfikatory URI w przypadku użycia ad-selection-from-outcomes obsługują przepływ pracy selectAds(AdSelectionFromOutcomesConfig).
Nazwa gotowego identyfikatora URI: waterfall-mediation-truncation
Wstępnie utworzony identyfikator URI waterfall-mediation-truncation zawiera kod JavaScript, który implementuje logikę skracania kaskady zapośredniczenia. Kod JavaScript zwraca reklamę własną, jeśli wartość bid jest większa lub równa wartości bid floor, a w przeciwnym razie zwraca wartość null.
Parametry wymagane
bidFloor: klucz wartości ceny minimalnej przekazanej w parametrze getSelectionSignals()
porównywanej z reklamą pakietu SDK do zapośredniczenia.
Wykorzystanie
Jeśli sygnały wyboru reklamy wyglądają tak: {"bid_floor": 10}, gotowy adres URI będzie wyglądać tak:
`ad-selection-prebuilt://ad-selection-from-outcomes/waterfall-mediation-truncation/?bidFloor=bid_floor`
Testowanie
Aby ułatwić Ci rozpoczęcie pracy z interfejsem Protected Audience API, utworzyliśmy przykładowe aplikacje w językach Kotlin i Java, które znajdziesz na GitHub.
Wymagania wstępne
Interfejs Protected Audience API wymaga użycia JavaScriptu podczas wyboru reklamy i raportowania wyświetleń. W środowisku testowym możesz udostępnić ten kod JavaScript na 2 sposoby:
- Uruchom serwer z wymaganymi punktami końcowymi HTTPS, który zwraca JavaScript.
- Zastąp zdalne pobieranie, podając niezbędny kod ze źródła lokalnego
Oba podejścia wymagają skonfigurowania punktu końcowego HTTPS do obsługi raportowania wyświetleń.
Punkty końcowe HTTPS
Aby przetestować wybieranie reklam i raportowanie wyświetleń, musisz skonfigurować 7 punktów końcowych HTTPS, do których będzie mieć dostęp urządzenie testowe lub emulator:
- Punkt końcowy kupującego, który obsługuje skrypt JavaScript z logiką określania stawek.
- Punkt końcowy, który obsługuje sygnały określania stawek.
- Punkt końcowy sprzedawcy, który obsługuje JavaScript z logiką podejmowania decyzji.
- Punkt końcowy, który udostępnia sygnały oceny.
- Punkt końcowy raportowania wyświetleń kupującego, który wygrał.
- Punkt końcowy raportowania wyświetleń sprzedawcy.
- Punkt końcowy do wyświetlania codziennych aktualności dla odbiorców niestandardowych.
W repozytorium GitHub znajdziesz podstawowy kod JavaScript na potrzeby testowania. Zawiera też definicje usług OpenAPI, które można wdrożyć na obsługiwanej platformie mikroserwisów lub platformie do testowania. Więcej informacji znajdziesz w pliku README projektu.
Zastępowanie zdalnego pobierania JavaScriptu
Ta funkcja jest przeznaczona do kompleksowego testowania. Aby zastąpić zdalne pobieranie, aplikacja musi działać w trybie debugowania z włączonymi opcjami programisty.
Aby włączyć tryb debugowania aplikacji, dodaj ten wiersz do atrybutu aplikacji w pliku AndroidManifest.xml:
<application
android:debuggable="true">
Przykład użycia tych zastąpień znajdziesz w przykładowej aplikacji interfejsu Protected Audience API w GitHubie.
Musisz dodać własny kod JavaScript, który będzie obsługiwać procedury wyboru reklam, takie jak ustalanie stawek, podejmowanie decyzji dotyczących oceny i raportowanie. Podstawowe przykłady kodu JavaScript, które obsługują wszystkie wymagane żądania, znajdziesz w repozytorium GitHub. Przykładowa aplikacja interfejsu Protected Audience API pokazuje, jak odczytać kod z tego pliku i przygotować go do użycia jako zastąpienie.
Możesz niezależnie zastępować pobieranie JavaScriptu po stronie sprzedawcy i po stronie kupującego, ale potrzebujesz punktu końcowego HTTPS, aby wyświetlać JavaScript, dla którego nie podajesz zastąpień. Więcej informacji o konfigurowaniu serwera, który obsługuje te przypadki, znajdziesz w pliku README.
Zastąpienie pobierania JavaScriptu jest możliwe tylko w przypadku list odbiorców niestandardowych, które należą do Twojego pakietu.
Zastępowanie kodu JavaScript po stronie sprzedawcy
Aby skonfigurować zastąpienie kodu JavaScript po stronie sprzedawcy, wykonaj te czynności, jak pokazano w tym przykładzie kodu:
- Zainicjuj obiekt
AdSelectionManager. - Uzyskaj odwołanie do
TestAdSelectionManagerz obiektuAdSelectionManager. - Utwórz obiekt
AdSelectionConfig. - Utwórz obiekt
AddAdSelectionOverrideRequestza pomocą obiektuAdSelectionConfigi obiektuStringreprezentującego kod JavaScript, którego chcesz użyć jako zastąpienia. - Wywołaj asynchroniczną metodę
overrideAdSelectionConfigRemoteInfo()z obiektemAddAdSelectionOverrideRequesti odpowiednimi obiektamiExecutoriOutcomeReceiver.
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);
Więcej informacji o znaczeniu poszczególnych pól w sekcji AdSelectionConfig znajdziesz w sekcji Uruchamianie wyboru reklamy. Kluczowa różnica polega na tym, że w przypadku parametru decisionLogicUrl można ustawić wartość zastępczą, ponieważ zostanie ona zignorowana.
Aby zastąpić JavaScript używany podczas wybierania reklam, element decisionLogicJs musi zawierać odpowiednie sygnatury funkcji po stronie sprzedawcy.
Przykład odczytywania pliku JavaScript jako ciągu znaków znajdziesz w przykładowej aplikacji Protected Audience API w GitHubie.
Metoda asynchroniczna overrideAdSelectionConfigRemoteInfo() używa obiektu OutcomeReceiver do sygnalizowania wyniku wywołania interfejsu API.
Wywołanie zwrotne onResult() oznacza, że zastąpienie zostało zastosowane.
Przyszłe wywołania funkcji selectAds() będą korzystać z logiki decyzji i raportowania przekazanej przez Ciebie jako zastąpienie.
Wywołanie zwrotne onError() oznacza 2 możliwe warunki:
- Jeśli zastąpienie zostanie podjęte z nieprawidłowymi argumentami,
AdServiceExceptionwskazujeIllegalArgumentExceptionjako przyczynę. - Jeśli zastąpienie zostanie podjęte w przypadku aplikacji, która nie działa w trybie debugowania z włączonymi opcjami programisty,
AdServiceExceptionwskażeIllegalStateExceptionjako przyczynę.
Resetowanie zastąpień po stronie sprzedawcy
W tej sekcji zakładamy, że zastąpiono JavaScript po stronie sprzedawcy i masz odwołanie do zmiennych TestAdSelectionManager i AdSelectionConfig użytych w poprzedniej sekcji.
Aby zresetować zmiany w przypadku wszystkich AdSelectionConfigs:
- Wywołaj asynchroniczną metodę
resetAllAdSelectionConfigRemoteOverrides()z odpowiednim obiektemOutcomeReceiver.
Kotlin
// Resets overrides for all AdSelectionConfigs
testAadSelectionManager.resetAllAdSelectionConfigRemoteOverrides(
outComeReceiver)
Java
// Resets overrides for all AdSelectionConfigs
testAdSelectionManager.resetAllAdSelectionConfigRemoteOverrides(
outComeReceiver);
Po zresetowaniu zastąpień po stronie sprzedawcy wywołania funkcji selectAds() używają adresu decisionLogicUrl przechowywanego w parametrze AdSelectionConfig, aby spróbować pobrać wymagany kod JavaScript.
Jeśli wywołanie funkcji resetAllAdSelectionConfigRemoteOverrides() się nie powiedzie, wywołanie zwrotne OutComeReceiver.onError() zwraca wartość AdServiceException.
Jeśli usunięcie zastąpień zostanie podjęte w przypadku aplikacji, która nie działa w trybie debugowania z włączonymi opcjami programisty, AdServiceException wskaże IllegalStateException jako przyczynę.
Zastępowanie kodu JavaScript po stronie kupującego
- Aby dołączyć do listy odbiorców niestandardowych, wykonaj te czynności.
- Utwórz
AddCustomAudienceOverrideRequestz kupującym i nazwą listy odbiorców niestandardowych, którą chcesz zastąpić, a także logiką określania stawek i danymi, których chcesz użyć jako zastąpienia. - Wywołaj asynchroniczną metodę
overrideCustomAudienceRemoteInfo()z obiektemAddCustomAudienceOverrideRequestoraz odpowiednimi obiektamiExecutoriOutcomeReceiver.
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);
Wartości parametrów buyer i name są takie same jak te, które zostały użyte do utworzenia niestandardowej grupy odbiorców. Więcej informacji o tych polach
Możesz też określić 2 dodatkowe parametry:
biddingLogicJs: kod JavaScript zawierający logikę kupującego, która jest używana podczas wyboru reklamy. Wymagane sygnatury funkcji znajdziesz w tym kodzie JavaScript.trustedBiddingSignals: sygnały określania stawek, które mają być używane podczas wybierania reklam. Na potrzeby testowania może to być pusty ciąg znaków.
Metoda asynchroniczna overrideCustomAudienceRemoteInfo() używa obiektu OutcomeReceiver do sygnalizowania wyniku wywołania interfejsu API.
Wywołanie zwrotne onResult() oznacza, że zastąpienie zostało zastosowane.
Kolejne wywołania funkcji selectAds() będą korzystać z logiki określania stawek i raportowania, którą przekażesz jako zastąpienie.
Wywołanie zwrotne onError() oznacza 2 możliwe warunki.
- Jeśli zastąpienie zostanie podjęte z nieprawidłowymi argumentami,
AdServiceExceptionwskazujeIllegalArgumentExceptionjako przyczynę. - Jeśli zastąpienie zostanie podjęte w przypadku aplikacji, która nie działa w trybie debugowania z włączonymi opcjami programisty,
AdServiceExceptionwskażeIllegalStateExceptionjako przyczynę.
Resetowanie zastąpień po stronie kupującego
W tej sekcji zakładamy, że masz zastąpiony JavaScript po stronie kupującego i masz odniesienie do zmiennej TestCustomAudienceManager użytej w poprzedniej sekcji.
Aby zresetować zastąpienia wszystkich list odbiorców niestandardowych:
- Wywołaj asynchroniczną metodę
resetAllCustomAudienceOverrides()z odpowiednimi obiektamiExecutoriOutcomeReceiver.
Kotlin
// Resets overrides for all custom audiences
testCustomAudienceManager.resetCustomAudienceRemoteInfoOverride(
executor,
outComeReceiver)
Java
// Resets overrides for all custom audiences
testCustomAudienceManager.resetCustomAudienceRemoteInfoOverride(
executor,
outComeReceiver)
Po zresetowaniu zastąpień po stronie kupującego kolejne wywołania funkcji selectAds() będą używać wartości biddingLogicUrl i trustedBiddingData przechowywanych w CustomAudience, aby spróbować pobrać wymagany kod JavaScript.
Jeśli wywołanie funkcji resetCustomAudienceRemoteInfoOverride() się nie powiedzie, wywołanie zwrotne OutComeReceiver.onError() zwraca wartość AdServiceException.
Jeśli usunięcie zastąpień zostanie podjęte w przypadku aplikacji, która nie działa w trybie debugowania z włączonymi opcjami programisty, przyczyną będzie AdServiceExceptionIllegalStateException.
Konfigurowanie serwera raportowania
Gdy używasz zastąpień zdalnego pobierania, musisz skonfigurować serwer, do którego urządzenie lub emulator będzie mieć dostęp, aby odpowiadać na zdarzenia raportowania. Do testowania wystarczy punkt końcowy, który zwraca kod 200. Repozytorium GitHub zawiera definicje usług OpenAPI, które można wdrożyć na obsługiwanej platformie mocków lub mikroserwisów. Więcej informacji znajdziesz w pliku README projektu.
Podczas wyszukiwania definicji OpenAPI poszukaj pliku reporting-server.json.
Ten plik zawiera punkt końcowy, który zwraca kod 200, co oznacza kod odpowiedzi HTTP. Ten punkt końcowy jest używany podczas selectAds() i sygnalizuje interfejsowi Protected Audience API, że raportowanie wyświetleń zostało zakończone.
Funkcje do przetestowania
- Ćwiczenie dołączania do niestandardowej grupy odbiorców i opuszczania jej oraz konfigurowania jej na podstawie wcześniejszych działań użytkowników.
- Uruchamiać inicjowanie wyboru reklam na urządzeniu za pomocą skryptów JavaScript hostowanych zdalnie.
- Obserwuj, jak powiązanie aplikacji z ustawieniami odbiorców niestandardowych może wpływać na wyniki wyboru reklam.
- Raportowanie wyświetleń ćwiczeń po wybraniu reklamy.
Ograniczenia
W tabeli poniżej znajdziesz ograniczenia dotyczące przetwarzania w Protected Audience API. Podane limity mogą ulec zmianie na podstawie opinii. Informacje o funkcjach, które są w trakcie wdrażania, znajdziesz w informacjach o wersji.
| Komponent | Opis limitu | Wartość limitu |
|---|---|---|
| Niestandardowa lista odbiorców (CA) | Maksymalna liczba reklam w przypadku każdego klienta reklamowego | 100 |
| Maksymalna liczba urzędów certyfikacji na aplikację | 1000 | |
| Maksymalna liczba aplikacji, które mogą utworzyć urząd certyfikacji | 1000 | |
| Maksymalne opóźnienie czasu aktywacji urzędu certyfikacji od czasu jego utworzenia | 60 dni | |
| Maksymalny czas ważności urzędu certyfikacji od momentu aktywacji | 60 dni | |
| Maksymalna liczba urzędów certyfikacji na urządzeniu | 4000 | |
| Maksymalny rozmiar nazwy urzędu certyfikacji | 200 bajtów | |
| Maksymalny rozmiar adresu URI pobierania dziennego | 400 bajtów | |
| Maksymalny rozmiar URI logiki ustalania stawek | 400 bajtów | |
| Maksymalny rozmiar danych z zaufanego określania stawek | 10 KB | |
| Maksymalny rozmiar sygnałów ustalania stawek przez użytkowników | 10 KB | |
Maksymalna stawka za połączenie w wysokości leaveCustomAudience na kupującego |
1 na sekundę | |
Maksymalna stawka za połączenie w wysokości joinCustomAudience na kupującego |
1 na sekundę | |
| CA Background Fetch | Przekroczenie limitu czasu oczekiwania na połączenie | 5 sekund |
| Limit czasu odczytu HTTP | 30 sekund | |
| Maksymalny łączny rozmiar pobierania | 10 KB | |
| Maksymalny czas trwania iteracji pobierania | 5 minut | |
| Maksymalna liczba zaktualizowanych urzędów certyfikacji w ramach jednego zadania | 1000 | |
| Wybór reklamy | Maksymalna liczba kupujących | Do ustalenia |
| Maksymalna liczba CA na kupującego | Do ustalenia | |
| Maksymalna liczba reklam w aukcji | Do ustalenia | |
| Początkowy limit czasu połączenia | 5 sekund | |
| Czas oczekiwania na odczyt połączenia | 5 sekund | |
Maksymalny czas wykonania ogólnego AdSelection |
10 sekund | |
Maksymalny czas wykonania ustalania stawek w przypadku każdego klienta w AdSelection |
5 sekund | |
Maksymalny czas wykonania oceny w AdSelection |
5 sekund | |
Maksymalny czas wykonywania w przypadku kupującego w AdSelection |
Do ustalenia | |
| Maksymalny rozmiar sygnałów dotyczących wyboru reklamy, sprzedawcy lub kupującego | Do ustalenia | |
| Maksymalny rozmiar skryptów sprzedawcy lub kupującego | Do ustalenia | |
Maksymalna stawka za połączenie w przypadku słowa kluczowego selectAds |
1 zapytanie/s | |
| Raportowanie wyświetleń | Minimalny czas przed usunięciem wyboru reklamy z pamięci trwałej | 24 godz. |
| Maksymalna liczba wyborów reklam dotyczących miejsca na dane | Do ustalenia | |
| Maksymalny rozmiar adresu URL danych wyjściowych raportowania | Do ustalenia | |
| Maksymalny czas raportowania wyświetleń | Do ustalenia | |
| Maksymalna liczba ponownych prób wywołania powiadomienia | Do ustalenia | |
| Limit czasu połączenia | 5 sekund | |
Maksymalny łączny czas wykonania dla reportImpression |
2 sekundy | |
Maksymalna stawka za połączenie w przypadku słowa kluczowego reportImpressions |
1 zapytanie/s | |
| Raporty o zdarzeniach | Maksymalna liczba sygnałów na kupującego na aukcję | 10 |
Maksymalna liczba sygnałów na sprzedawcę na aukcję |
10 |
|
Maksymalny rozmiar klucza zdarzenia |
40 bajtów |
|
Maksymalny rozmiar danych zdarzenia |
64 KB |
|
| Reklamy | Maksymalny rozmiar listy reklam | 10 KB udostępniane przez wszystkie
AdData
w jednym urzędzie certyfikacji na potrzeby reklam kontekstowych |
| Adresy URL | Maksymalna długość dowolnego ciągu adresu URL podanego jako dane wejściowe | Do ustalenia |
| JavaScript | Maksymalny czas wykonania | 1 sekunda w przypadku określania stawek i oceny na potrzeby raportowania wyświetleń. |
| Maksymalne użycie pamięci | 10 MB |
Zgłaszanie błędów i problemów
Twoje opinie są kluczową częścią Piaskownicy prywatności na Androida. Daj nam znać o wszelkich problemach, które napotkasz, lub o pomysłach na ulepszenie Piaskownicy prywatności na Androida.
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy język JavaScript jest wyłączony.
- Obsługa kierowania na niestandardowych odbiorców za pomocą interfejsu Protected Audience API
- Informacje o wersji
- Protected Audience: przewodnik po integracji