Ten przewodnik jest przeznaczony dla sieci reklamowych, które chcą tworzyć adaptery ustalania stawek, aby brać udział w określaniu stawek w czasie rzeczywistym (RTB) w ramach zapośredniczenia Google. Jeśli jesteś wydawcą, zapoznaj się z instrukcjami dotyczącymi pośrednictwa.
Adapter ustalania stawek to część integracji po stronie klienta. Umożliwia on pakietowi SDK sieci reklamowej komunikowanie się z pakietem SDK do reklam mobilnych Google w celu wczytywania reklam wyświetlanych przez licytującego.
Aby określanie stawek działało prawidłowo, adapter musi obsługiwać inicjowanie, zbieranie sygnałów, wczytywanie reklam i przekazywanie zdarzeń związanych z cyklem życia reklamy. W tym przewodniku opiszemy, jak zaimplementować adapter do obsługi tych operacji.
Proces działania adaptera ustalania stawek
Zdarzenie inicjujące
Poniżej przedstawiamy szczegółowy przepływ całego cyklu życia adaptera od żądania do odpowiedzi i wyświetlenia:
Adapter odpowiada za te części procesu:
Kroki 4–7. Po zakończeniu inicjalizacji zainicjuj adapter i wywołaj pakiet SDK do reklam mobilnych Google.
Kroki 10–13. Zbieraj sygnały z pakietu SDK sieci reklamowej, aby wysyłać je do oferenta w ramach żądania RTB, i przesyłaj je do pakietu SDK do reklam mobilnych Google.
Kroki 18–21. Jeśli licytujący zwróci zwycięską stawkę, wyświetl reklamę zgodnie z odpowiedzią licytującego. Po załadowaniu powiadomi pakiet SDK do reklam mobilnych Google o załadowaniu reklamy.
Krok 23 i później: podczas wyświetlania reklamy informuj pakiet SDK do reklam mobilnych Google o zdarzeniach wyświetlenia i kliknięcia, a także o innych zdarzeniach reklamy, które występują w trakcie jej cyklu życia.
Wdrażanie adaptera ustalania stawek
Aby utworzyć adapter określania stawek dla pakietu SDK do reklam mobilnych Google, musisz rozszerzyć abstrakcyjną klasę RtbAdapter
. W sekcjach poniżej opisano każdą abstrakcyjną metodę w RtbAdapter
.
getSDKVersionInfo()
Tutaj powinieneś podać wersję pakietu SDK. Ta wersja jest przekazywana licytującemu w ramach żądania OpenRTB.
Ta metoda wymaga zwrócenia VersionInfo
. Przykład poniżej pokazuje, jak możesz przekonwertować wersję ciągu w pakiecie SDK na VersionInfo.
@Override
public VersionInfo getSDKVersionInfo() {
// Get your SDK's version as a string. E.g. "1.2.3"
// String versionString = YourSdk.getVersion();
String splits[] = versionString.split("\\.");
if (splits.length >= 3) {
int major = Integer.parseInt(splits[0]);
int minor = Integer.parseInt(splits[1]);
int micro = Integer.parseInt(splits[2]);
return new VersionInfo(major, minor, micro);
}
String logMessage = String.format("Unexpected SDK version format: %s." +
"Returning 0.0.0 for SDK version.", sdkVersion);
Log.w(TAG, logMessage);
return new VersionInfo(0, 0, 0);
}
getVersionInfo()
Tutaj powinieneś podać wersję adaptera. Ta wersja jest przekazywana licytującemu w ramach żądania OpenRTB.
Karta graficzna Google z otwartym kodem źródłowym i wersją używa 4-cyfrowego schematu wersji karty graficznej, ale VersionInfo
obsługuje tylko 3 cyfry. Aby tego uniknąć, zalecamy połączenie ostatnich 2 cyfr z wersją poprawki, jak pokazano poniżej.
@Override
public VersionInfo getVersionInfo() {
// Get your adapters's version as a string. E.g. "1.2.3.0"
String versionString = BuildConfig.VERSION_NAME;
String splits[] = versionString.split("\\.");
if (splits.length >= 4) {
int major = Integer.parseInt(splits[0]);
int minor = Integer.parseInt(splits[1]);
int micro = Integer.parseInt(splits[2]) * 100 + Integer.parseInt(splits[3]);
return new VersionInfo(major, minor, micro);
}
String logMessage = String.format("Unexpected adapter version format: %s." +
"Returning 0.0.0 for adapter version.", versionString);
Log.w(TAG, logMessage);
return new VersionInfo(0, 0, 0);
}
initialize()
Czas oczekiwania: 30 sekund
Metoda initialize()
jest pierwszą metodą wywoływaną w Twoim adapterze. Jest wywoływany tylko raz na sesję. Ta metoda udostępnia listę obiektów MediationConfiguration
, która zawiera pełną listę dostępnych w aplikacji miejsc docelowych skonfigurowanych pod kątem Twojej sieci reklamowej. Możesz przejrzeć tę listę, aby przeanalizować dane logowania dla każdego miejsca docelowego, a następnie przekazać odpowiednie dane do pakietu SDK na potrzeby jego inicjowania.
Gdy pakiet SDK zostanie zainicjowany i będzie gotowy do odbierania żądań reklam, wywołaj metodę onInitializationSucceeded()
klasy InitializationCompleteCallback
.
Ten wywołanie zwrotne jest przekazywane wydawcom aplikacji, aby mogli oni rozpocząć wczytywanie reklam.
@Override
public void initialize(Context context,
InitializationCompleteCallback initializationCompleteCallback,
List<MediationConfiguration> mediationConfigurations) {
// Initialize your ad network's SDK.
...
// Invoke the InitializationCompleteCallback once initialization completes.
initializationCompleteCallback.onInitializationSucceeded();
}
collectSignals()
Czas oczekiwania: 1 sekunda
Za każdym razem, gdy wydawca żąda reklamy, tworzony jest nowy egzemplarz klasy RtbAdapter
i wywoływana jest metoda collectSignals()
. Ten egzemplarz
RtbAdapter
będzie używany przez cały czas trwania żądania reklamy, odpowiedzi i cyklu renderowania tej reklamy. Metoda collectSignals()
umożliwia adapterowi dostarczanie sygnałów z urządzenia do kupującego w ramach żądania OpenRTB.
Funkcja collectSignals()
jest wywoływana w wątku w tle.
Pakiet SDK do reklam mobilnych Google wysyła jednocześnie żądania sygnałów ze wszystkich adapterów uczestniczących w określaniu stawek. Prosimy o kulturę i o ograniczenie wywołań w tym czasie do wątku dotyczącego interfejsu. Wszystkie intensywne działania, które musi wykonać adapter lub pakiet SDK, aby zbierać sygnały, powinny być wykonywane w ramach metody initialize()
i przechowywane w pamięci podręcznej.
Gdy sygnały są gotowe, wywołaj funkcję onSuccess()
z zakodowanymi sygnałami.
Oto przykładowy kod:
@Override
public void collectSignals(RtbSignalData rtbSignalData,
SignalCallbacks signalCallbacks) {
String signals = YourSdk.getSignals();
signalCallbacks.onSuccess(signals);
}
Jeśli adapter nie uda się zebrać sygnałów, wywołaj funkcję signalCallbacks.onFailure()
z ciągiem wyjaśniającym błąd.
Wdrażanie metod wczytywania reklam
Czas oczekiwania: 10 sekund
Jeśli licytujący zwróci zwycięską stawkę, pakiet SDK do reklam mobilnych Google wywoła Twój adapter, aby załadować zwycięską reklamę, przekazując mu wszystkie dane z licytującego, których potrzebuje pakiet SDK do załadowania tej reklamy.
Dokładna metoda wczytywania zależy od formatu reklamy, do której odnosi się to żądanie:
Format reklamy | Metoda wczytywania |
---|---|
Baner | loadBannerAd()
|
Pełnoekranowa | loadInterstitialAd()
|
Z nagrodą | loadRewardedAd()
|
Zaimplementuj te metody w przypadku formatów reklam obsługiwanych przez adapter.
Metoda load jest wywoływana w wątku interfejsu użytkownika w tej samej instancji adaptera, z którego pochodzą sygnały. Ta metoda udostępnia te parametry:
MediationAdConfiguration
, który zawiera parametry potrzebne pakietowi SDK do załadowania reklamy dla zwycięskiej stawki, np. odpowiedź na stawkę i dane logowania wydawcy skonfigurowane w interfejsie AdMob.Obiekt
MediationAdLoadCallback
służy do powiadamiania pakietu SDK do reklam mobilnych Google o skutku wczytywania (udanym lub nieudanym).
Gdy pakiet SDK wczyta reklamę, wywołaj funkcję mediationAdLoadCallback.onSuccess()
. Jeśli wczytywanie reklamy się nie powiedzie, wywołaj funkcję mediationAdLoadCallback.onFailure()
, podając ciąg znaków wyjaśniający błąd.
Metoda mediationAdLoadCallback.onSuccess()
wymaga przekazania obiektu, który potwierdza jeden z interfejsów „Ad” zdefiniowanych przez pakiet SDK do reklam mobilnych Google. Te interfejsy reklam proszą o podanie pewnych informacji o reklamie.
Obiekt MediationAdConfiguration
ma też metodę getWatermark()
, która zwraca ciąg tekstowy z kodowaniem base64 reprezentujący obraz PNG. Ten obraz powinien być układany w siatkę w przezroczystej nakładce w reklamach.
Aby uzyskać dodatkowe wskazówki dotyczące renderowania znaku wodnego, skontaktuj się z Google.
Zawiera metadane reklamy wyświetlanej na potrzeby wydawców, którzy mogą na ich podstawie określić źródło wyświetlanych reklam.
W przypadku banerów pojawi się prośba o podanie widoku banera. W przypadku reklam pełnoekranowych i reklam z nagrodą musisz zaimplementować metodę show()
, aby wyświetlać reklamy w późniejszym terminie. Zgodnie ze sprawdzoną metodą klasa, która ładuje reklamy, powinna też być odpowiedzialna za implementowanie tych metod reklam.
Poniżej znajdziesz przykładową implementację loadBannerAd()
. Pamiętaj, że implementacja adaptera będzie wyglądać inaczej, ponieważ adapter jest zintegrowany z innym pakietem SDK.
public final class SampleRtbAdapter extends RtbAdapter {
...
@Override
public void loadBannerAd(
MediationBannerAdConfiguration adConfiguration,
MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> callback) {
SampleBannerRenderer bannerRenderer =
new SampleBannerRenderer(adConfiguration, callback);
bannerRenderer.render();
}
}
// Renders a banner ad, and forwards callbacks to the Google Mobile Ads SDK.
public class SampleBannerRenderer implements MediationBannerAd {
private MediationBannerAdConfiguration adConfiguration;
private final MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> adLoadCallback;
private AdView adView;
private MediationBannerAdCallback callback;
public SampleRtbBannerRenderer(
MediationBannerAdConfiguration adConfiguration,
MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> adLoadCallback) {
this.adConfiguration = adConfiguration;
this.adLoadCallback = adLoadCallback;
}
public void render() {
adView = new AdView(adConfiguration.getContext());
adView.setAdSize(adConfiguration.getAdSize());
// serverParameters are the parameters entered in the AdMob UI for your network.
adView.setAdUnitId(adConfiguration.getServerParameters().getString("adUnitId"));
// Map the callbacks from your SDK to Google's SDK.
adView.setAdListener(new AdListener() {
// See the next step for more information on callback mapping.
// ...
});
// Get the bid response and watermark from the ad configuration and
// pass the relevant information to your SDK.
String ad = adConfiguration.getBidResponse();
String watermark = adConfiguration.getWatermark();
Bundle extras = new Bundle();
extras.putString("bid", ad);
extras.putString("watermark", watermark);
AdRequest request = new AdRequest.Builder()
.addNetworkExtrasBundle(AdMobAdapter.class, extras)
.build();
adView.loadAd(request);
}
// MediationBannerAd implementation
@NonNull
@Override
public View getView() {
return adView;
}
}
Przekazywanie zdarzeń cyklu życia prezentacji reklamy
Ostateczną odpowiedzialnością adaptera jest powiadomienie pakietu SDK do reklam mobilnych Google o wszystkich zdarzeniach cyklu życia prezentacji, aby można je było przekazać wydawcy. Wydawca oczekuje tych wywołań w określonych momentach, niezależnie od tego, która sieć reklamowa wyświetla reklamę. Dlatego ważne jest, aby wywołać jak najwięcej tych wywołań w odpowiednim czasie, aby pakiet SDK do reklam mobilnych Google mógł je przekazać wydawcy.
W razie potrzeby adaptery powinny wywoływać te zdarzenia:
Wspólne dla wszystkich formatów | |
---|---|
Metoda | Kiedy zadzwonić |
reportAdClicked()
|
Reklama została kliknięta. |
reportAdImpression()
|
Reklama została wyświetlona. |
onAdOpened()
|
Reklama była wyświetlana na pełnym ekranie. |
onAdClosed()
|
Zamknięto widok pełnoekranowy reklamy. |
onAdLeftApplication()
|
Reklama spowodowała, że użytkownik opuścił aplikację. |
Reklamy z nagrodą | |
onRewarded()
|
Użytkownik otrzymuje nagrodę. |
wywołania zwrotne dotyczące filmów (reklam wideo z nagrodą i reklam natywnych), | |
onVideoStarted()
|
Rozpoczęło się odtwarzanie filmu reklamy. |
onVideoCompleted()
|
Film reklamy został do końca odtworzony. |
Po wywołaniu mediationAdLoadCallback.onSuccess()
adapter otrzyma obiekt MediationAdLoadCallback<MediationAdT, MediationAdCallbackT>
. Adaptery powinny przechowywać ten obiekt i wykorzystywać go do wywoływania zdarzeń prezentacji występujących w reklamie.
Zwykle większość z nich jest wywoływana przez pakiet SDK sieci reklamowej. Rolą adaptera jest mapowanie wywołań zwrotnych z pakietu SDK sieci reklamowej na pakiet SDK do reklam mobilnych Google.
Ten przykład pokazuje, jak przekazywać wywołania zwrotne z interfejsu ad listener pakietu SDK do pakietu SDK do reklam mobilnych Google:
adView.setAdListener(new AdListener() {
public void onAdLoaded() {
callback = adLoadCallback.onSuccess(SampleBannerRenderer.this);
}
public void onAdImpression() {
if (callback != null) {
callback.reportAdImpression();
}
}
public void onAdFailedToLoad(LoadAdError adError) {
adLoadCallback.onFailure("Error: " + adError.toString());
}
public void onAdClosed() {
if (callback != null) {
callback.onAdClosed();
}
}
public void onAdOpened() {
if (callback != null) {
callback.onAdOpened();
callback.reportAdClicked();
}
}
public void onAdLeftApplication() {
if (callback != null) {
callback.onAdLeftApplication();
}
}
});
Wymagane komponenty do śledzenia wyświetleń reklam natywnych
Pakiet SDK do reklam mobilnych Google rejestruje wyświetlenie reklamy natywnej, gdy jest widoczny 1 piksel reklamy. Jeśli pakiet SDK sieci reklamowej wymaga wyświetlania określonych komponentów, aby renderować prawidłowe wyświetlenie, licytujący może wskazać te wymagane komponenty natywnych reklam w odpowiedzi na stawkę. Następnie pakiet SDK do reklam mobilnych Google sprawdza, czy wymagane komponenty natywne są wyświetlane przed zarejestrowaniem wyświetlenia.
Więcej informacji o tym, jak określać dodatkowe wymagane komponenty w odpowiedzi na zapytanie o cenę, znajdziesz w dokumentacji dotyczącej komponentów wymaganych do kreacji natywnych.
Wyświetlanie błędów reklam
W przypadku formatów pełnoekranowych, takich jak reklamy pełnoekranowe i reklamy z nagrodą, w wywołaniu zwrotnym success pakietu SDK do reklam mobilnych Google należy zaimplementować metodę MediationInterstitialAd
lub MediationRewardedAd
, aby pakiet SDK do reklam mobilnych Google mógł poprosić adapter o wyświetlenie reklamy.
Pakiet SDK do reklam mobilnych Google zakłada, że jeśli adapter wczytał reklamę, to reklama jest gotowa do wyświetlenia, gdy wydawca poprosi o jej wyświetlenie. Oznacza to, że każde wywołanie wyświetlania powinno skutkować wyświetleniem.
Mogą jednak wystąpić wyjątkowe przypadki, w których nie będziesz mieć możliwości wyświetlenia reklamy. Jeśli nie możesz wyświetlić reklamy, wywołaj funkcję onAdFailedToShow()
callback, aby anulować wyświetlenie.
W tabeli poniżej widać, jak wywołania zwrotne dotyczące wyświetlania wpływają na rejestrowanie wyświetleń w przypadku formatów reklam pełnoekranowych:
Oddzwanianie | Wynik |
---|---|
onAdOpened() | Impression recorded
|
onAdFailedToShow() | Impression failure1
|
Żadna z tych odpowiedzi przez kilka sekund | Impression recorded
|
1 W przypadku nieudanych wyświetleń sieć reklamowa nie jest obciążana opłatą za wyświetlenie, ale ma wpływ na korektę stawki zdarzenia podlegającego rozliczeniu. Więcej informacji znajdziesz w sekcji sygnały żądań reklam.
Ten przykładowy przykład pokazuje cykl wczytywania i wyświetlania, w którym wywołanie wyświetlania reklamy może zakończyć się niepowodzeniem.
final class SampleRtbAdapter extends RtbAdapter implements MediationRewardedAd {
private MediationRewardedAdCallback callback;
private RewardedAd rewardedAd;
...
@Override
public void loadRewardedAd(
MediationRewardedAdConfiguration adConfiguration,
final MediationAdLoadCallback<MediationRewardedAd, MediationRewardedAdCallback> loadCallback) {
// Load an ad. This mock example uses Google's SDK, but in practice
// your adapter will load the ad using your ad network's SDK.
RewardedAd.load(adConfiguration.getContext(),
"ca-app-pub-3940256099942544/5224354917",
new AdRequest.Builder().build(),
new RewardedAdLoadCallback() {
@Override
public void onAdLoaded(@NonNull RewardedAd rewardedAd) {
// When the ad loads, invoke the load success callback.
callback = loadCallback.onSuccess(SampleRtbAdapter.this);
}
});
}
@Override
public void showAd(Context context) {
// In this mock example, your ad network requires an activity context, but
// didn't receive one, making you unable to show the ad.
if (!(context instanceof Activity)) {
AdError error = new AdError(1, "Context must be an activity",
"com.google.ads.mediation.sample");
callback.onAdFailedToShow(error);
}
// This example shows Google SDK's callbacks, but it's likely your SDK
// has similar presentation callbacks.
rewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() {
@Override
public void onAdShowedFullScreenContent() {
// Your ad network SDK successfully showed the ad. Call onAdOpened().
callback.onAdOpened();
}
@Override
public void onAdFailedToShowFullScreenContent(AdError adError) {
// Your ad network SDK failed to show the ad, invoke onAdFailedToShow.
// In practice, you will map your SDK's error to an AdError.
AdError error = new AdError(adError.getCode(), adError.getMessage(),
adError.getDomain());
callback.onAdFailedToShow(adError);
}
});
rewardedAd.show((Activity) context, ...);
}
}