Desarrollo de adaptadores de ofertas

Esta guía está dirigida a las redes de publicidad que buscan crear un adaptador de ofertas. para participar en la licitación en tiempo real (RTB) dentro de la mediación de Google. Si si es publicador, consulte la página de mediación para editores instrucciones.

El adaptador de ofertas es la parte del cliente de la integración. El adaptador permite que el SDK de la red de publicidad se comunique con el SDK de anuncios de Google para dispositivos móviles para cargar anuncios publicados por su ofertante

Para que las ofertas funcionen correctamente, tu adaptador deberá controlar la inicialización, la recopilación de indicadores, la carga de anuncios y la retransmisión de su ciclo de vida eventos. En esta guía, te explicaremos cómo debería ser tu adaptador para manejar estas operaciones.

Flujo de trabajo de un adaptador de ofertas

Inicialización

Un flujo detallado de todo el ciclo de vida de la renderización de solicitudes y respuestas de un adaptador se muestra a continuación:

El adaptador es responsable de las siguientes partes del flujo de trabajo:

  • Pasos 4 a 7: Inicializa tu adaptador y vuelve a llamar al SDK de anuncios de Google para dispositivos móviles una vez completada la inicialización.

  • Pasos de 10 a 13: Recopila indicadores del SDK de tu red de publicidad para enviarlos a tu participar en una solicitud de RTB y reenviarlo a la SDK de Google Ads.

  • Pasos 18 a 21: Si el ofertante debe devolver la oferta ganadora, cargue el anuncio según corresponda a la respuesta del ofertante. Una vez cargado, notifica al SDK de anuncios de Google para dispositivos móviles de que se cargó el anuncio.

  • Paso 23 y posteriores: mientras se muestra su anuncio, notificar a los anuncios de Google para celulares SDK de eventos de impresiones y clics, así como otros eventos de anuncios que ocurren durante el ciclo de vida de presentación de tu anuncio.

Cómo implementar el adaptador de ofertas

Para crear un adaptador de ofertas para el SDK de anuncios de Google para dispositivos móviles, debes extiende la clase abstracta RtbAdapter. Las siguientes secciones explicar cada método abstracto en RtbAdapter

getSDKVersionInfo()

Aquí deberías mostrar la versión de tu SDK. Esta versión se pasa a tu ofertante como parte de la solicitud de OpenRTB.

Este método requiere que muestres un VersionInfo. En el siguiente ejemplo, se muestra cómo puedes convertir la versión de cadena de tu SDK en 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()

Aquí deberías mostrar la versión de tu adaptador. Esta versión se pasa a tu ofertante como parte de la solicitud de OpenRTB.

Google de código abierto y con control de versiones adaptadores usa un esquema de versión de adaptador de 4 dígitos, pero el VersionInfo solo permite 3 dígitos. Para solucionar este problema, se recomienda combinar los dos últimos dígitos. a la versión del parche, como se muestra a continuación.

@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()

Tiempo de espera: 30 segundos

El método initialize() es el primer método al que se llama en el adaptador. Sí se llama una sola vez por sesión. Este método te proporciona una lista de MediationConfiguration que representan la lista completa de las posiciones de esta aplicación que están configuradas para su red de publicidad Puedes repetir indefinidamente a través de esta lista para analizar las credenciales para cada ubicación y pasar datos relevantes a tu SDK para la inicialización.

Una vez que se inicialice el SDK y esté listo para recibir solicitudes de anuncios, invoca el SDK método onInitializationSucceeded() de InitializationCompleteCallback Esta devolución de llamada se reenvía a los publicadores de la app para que sepan que pueden comenzar a cargar anuncios.

@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()

Tiempo de espera: 1 segundo

Cada vez que el publicador solicita un anuncio, se genera una nueva instancia de tu RtbAdapter. y se llama al método collectSignals(). Esta instancia de Se usará RtbAdapter durante la solicitud de anuncio, la respuesta y el ciclo de vida de renderización de ese anuncio. El método collectSignals() habilita tu para proporcionar señales del dispositivo que se enviarán al ofertante en un Solicitud de OpenRTB.

Se llama a collectSignals() en un subproceso en segundo plano. El SDK de anuncios de Google para dispositivos móviles solicita indicadores de manera simultánea a todos los adaptadores que participa en la licitación. Respeta las llamadas y limita las llamadas al subproceso de IU. durante este tiempo. Cualquier trabajo pesado que tu adaptador o SDK deba hacer para recopilar Los indicadores deben hacerse en el método initialize() y almacenarse en caché.

Una vez que tengas listos los indicadores, llama a la devolución de llamada onSuccess() con tu indicadores codificados.

Este es un ejemplo de implementación:

@Override
public void collectSignals(RtbSignalData rtbSignalData,
                           SignalCallbacks signalCallbacks) {
  String signals = YourSdk.getSignals();
  signalCallbacks.onSuccess(signals);
}

Si el adaptador no recopila señales, llama a signalCallbacks.onFailure() con una cadena que explica el error que se produjo.

Implementa métodos de carga de anuncios

Tiempo de espera: 10 segundos

Si el ofertante devuelve la oferta ganadora, el SDK de anuncios de Google para dispositivos móviles llama a tu adaptador para cargar el anuncio ganador y te pasa los datos que tu el ofertante mostró que tu SDK necesita cargar ese anuncio.

El método de carga exacto al que se llama depende del anuncio formato para el que es esta solicitud:

Formato del anuncio Método de carga
Banner loadBannerAd()
Intersticial loadInterstitialAd()
Recompensado loadRewardedAd()

Implementa estos métodos para los formatos de anuncios que admite tu adaptador.

Se llama al método de carga en el subproceso de IU, en la misma instancia de la adaptador a partir del cual proporcionaste los indicadores. Este método te proporciona lo siguiente parámetros:

  • Un MediationAdConfiguration, que contiene los parámetros que tu SDK necesita Para cargar el anuncio de la oferta ganadora, como la respuesta a la oferta y las credenciales el publicador configurado en la IU de AdMob.

  • Un objeto MediationAdLoadCallback que se usa para notificar al SDK de anuncios de Google para dispositivos móviles cuando la carga es exitosa o falla.

Una vez que el SDK cargue el anuncio, llama a mediationAdLoadCallback.onSuccess(). En la no se puede cargar el anuncio de evento, llama a mediationAdLoadCallback.onFailure() con un cadena que explica el error que ocurrió.

El método mediationAdLoadCallback.onSuccess() requiere que pases un que se confirma con uno de los objetos "Ad" definidas por la API de Google Mobile SDK de Google Ads. Estas interfaces de anuncios le solicitan que proporcione información sobre el anuncio.

MediationAdConfiguration también tiene un getWatermark(). para mostrar una cadena codificada en base64 que representa una imagen PNG. Esta imagen deben estar en mosaico en una superposición transparente en sus anuncios. Comunícate con Google para obtener orientación adicional sobre cómo renderizar la marca de agua. Contiene metadatos sobre el anuncio que se muestra para que los publicadores los usen para determinar la fuente de los anuncios que se muestran.

En el caso de los banners, se te pedirá que proporciones la vista del banner. Para anuncios intersticiales y anuncios recompensados, se te pedirá que implementes un método show() para mostrar el anuncio en en un momento posterior. Como práctica recomendada, te sugerimos hacer que tu clase ¿La carga de anuncios también es responsable de implementar estos métodos de anuncios?

A continuación, se muestra un ejemplo de implementación de loadBannerAd(). Recuerda que la implementación del adaptador se verá diferente, ya que el adaptador se integra en un SDK diferente.

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

Retransmitir eventos de ciclo de vida de presentaciones de anuncios

La última responsabilidad del adaptador es notificar al SDK de anuncios de Google para dispositivos móviles. de cualquier evento del ciclo de vida de una presentación, para que pueda reenviarse al publicador. El publicador espera estas devoluciones de llamada en momentos específicos, sin importar qué red de publicidad publica el anuncio, por lo que es importante que la misma devoluciones de llamada se invocan como sea posible y en el momento correcto, para que el servidor de El SDK de anuncios para dispositivos móviles puede reenviarlos al publicador.

Los adaptadores deben invocar los siguientes eventos cuando corresponda:

Común para todos los formatos
Método Cuándo llamar
reportAdClicked() Se hizo clic en el anuncio.
reportAdImpression() El anuncio renderizó una impresión.
onAdOpened() El anuncio presentó una vista de pantalla completa.
onAdClosed() Se cerró la vista de pantalla completa del anuncio.
onAdLeftApplication() El anuncio hizo que el usuario abandonara la aplicación.
Anuncios recompensados
onRewarded() El usuario recibe una recompensa.
Devoluciones de llamada de video (anuncios recompensados y nativos)
onVideoStarted() Se inició el video del anuncio.
onVideoCompleted() El video del anuncio finalizó.

El adaptador obtiene un MediationAdLoadCallback<MediationAdT, MediationAdCallbackT> objeto de respuesta después de llamar a mediationAdLoadCallback.onSuccess(). Los adaptadores son se espera retener este objeto y usarlo para invocar eventos de presentación que ocurren en tu anuncio.

Por lo general, la mayoría de estos eventos se generan mediante el SDK de tu red de publicidad. El adaptador es simplemente asignar las devoluciones de llamada del SDK de tu red de publicidad al SDK de anuncios de Google para dispositivos móviles.

El siguiente ejemplo demuestra cómo reenviarías devoluciones de llamada desde tu Objeto de escucha de anuncios del SDK para el SDK de anuncios de Google para dispositivos móviles:

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

Elementos obligatorios para el seguimiento de impresiones de anuncios nativos

El SDK de anuncios de Google para dispositivos móviles registra una impresión para un anuncio nativo cuando se ubica 1 px de la el anuncio esté visible. Si el SDK de tu red de publicidad requiere que se muestren recursos específicos para procesar una impresión válida, su ofertante puede indicar estos elementos recursos nativos en la respuesta a la oferta. Luego, el SDK de anuncios de Google para dispositivos móviles valida que se muestren los recursos nativos necesarios antes de registrar una impresión.

Consulta los elementos nativos obligatorios documentación para más información sobre cómo especificar los recursos adicionales requeridos en la oferta respuesta.

Mostrar errores de anuncios

Para los formatos de pantalla completa, como anuncios intersticiales y recompensados, en la etapa exitosa de devolución de llamada de carga, proporcionarás una implementación de MediationInterstitialAd o MediationRewardedAd para que el SDK de Google Mobile Ads pueda pedir a tu adaptador que muestre el anuncio.

El SDK de anuncios de Google para dispositivos móviles espera que, si un adaptador El anuncio está listo para mostrarse cuando el publicador lo solicite. Esto significa que cada llamada a un programa debería generar una impresión.

Sin embargo, puede haber casos excepcionales en los que no puedas mostrar un anuncio. Si no puede mostrar el anuncio, llame al onAdFailedToShow() para cancelar la impresión.

La siguiente tabla muestra cómo las devoluciones de llamada de la presentación afectan la grabación de impresiones para los formatos de anuncios de pantalla completa:

Devolución de llamada Resultado
onAdOpened() Impression recorded
onAdFailedToShow() Impression failure1
Ninguna de las anteriores durante varios segundos Impression recorded

1 Para errores impresiones, a tu red de publicidad no se le cobra por la impresión, pero afecta tu ajuste de tarifa de eventos facturables. Ver solicitud de oferta indicadores para obtener más información información.

En el siguiente ejemplo de ejemplo, se muestra un ciclo de vida de carga y programa en el que un anuncio “Show call” podría generar un error.

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