Implementa anuncios de pantalla en pantalla (beta)

Selecciona la plataforma: Android iOS

Pantalla en pantalla

Los anuncios de pantalla en pantalla (PIP) se muestran en una ventana flotante que permanece sobre el contenido de la pantalla, como artículos, feeds o partidas. Este formato permite que los usuarios interactúen con tu app mientras el anuncio permanece visible. Elige este formato para mostrar anuncios que no ocupen toda la pantalla. Obtén más información sobre los anuncios de imagen en imagen.

En esta guía, se explica cómo solicitar y mostrar anuncios de imagen en imagen en tu app con Google Mobile Ads SDK.

Antes de comenzar

Antes de continuar, haz lo siguiente:

Carga un anuncio

Para cargar un objeto GADPictureInPictureAd, crea una solicitud de anuncio y llama al método load:

Swift

private func loadPictureInPictureAd() async {
  do {
    // Capture the PictureInPictureAd reference for later use.
    pipAd = try await PictureInPictureAd.load(
      with: adUnitID, request: Request())
    // Set the delegate to be notified of ad events.
    pipAd?.delegate = self
  } catch {
    print(
      "Picture-in-Picture ad failed to load: \(error.localizedDescription)")
  }
}

Reemplaza adUnitID por tu ID de unidad de anuncios.

Objective-C

- (void)loadPictureInPictureAd {
  GADRequest *request = [GADRequest request];

  [GADPictureInPictureAd
       loadWithAdUnitID:kAdUnitID
                request:request
      completionHandler:^(GADPictureInPictureAd *_Nullable ad, NSError *_Nullable error) {
        if (error) {
          NSLog(@"Picture-in-Picture ad failed to load: %@", error);
          return;
        }
        // Capture the PictureInPictureAd reference for later use.
        self.pipAd = ad;
        // Set the delegate to be notified of ad events.
        self.pipAd.delegate = self;
      }];
}

Reemplaza kAdUnitID por tu ID de unidad de anuncios.

Muestra el anuncio

Para mostrar el anuncio de pantalla en pantalla en la pantalla, configura las opciones de pantalla en pantalla y llama al método show. En el siguiente ejemplo, se establece la posición predeterminada del anuncio y el alcance de la presentación en la pantalla:

Swift

private func showPictureInPictureAd() {
  // Use the loaded PictureInPictureAd instance.
  guard let pipAd else {
    print("No ad to show.")
    return
  }
  let options = PictureInPictureAdOptions()
  // Uses the Google Mobile Ads SDK's default screen position.
  options.position = .default
  // Binds the ad lifecycle to the host screen.
  options.presentationScope = .screen

  pipAd.show(with: options)
}

Objective-C

- (void)showPictureInPictureAd {
  // Use the loaded PictureInPictureAd instance.
  if (!self.pipAd) {
    NSLog(@"No ad to show.");
    return;
  }
  GADPictureInPictureAdOptions *options =
      [[GADPictureInPictureAdOptions alloc] init];
  // Uses the Google Mobile Ads SDK's default screen position.
  options.position = GADPictureInPictureAdPositionDefault;
  // Binds the ad lifecycle to the host screen.
  options.presentationScope = GADPictureInPictureAdPresentationScopeScreen;

  [self.pipAd showWithOptions:options];
}

Cómo establecer la posición

De forma predeterminada, Google Mobile Ads SDK muestra un anuncio de Picture-in-Picture en la esquina inferior derecha de la pantalla cuando se muestra por primera vez o en la última posición conocida si se mostró anteriormente. Para personalizar la posición en la que aparece el anuncio, configura la posición en las opciones de pantalla en pantalla. En el siguiente ejemplo, se establece la posición sobre el contenido en la esquina superior izquierda de la pantalla:

Swift

private func createTopLeftPositionOptions() -> PictureInPictureAdOptions {
  let options = PictureInPictureAdOptions()
  // Sets the ad position to the top-left corner of the screen.
  options.position = .topLeft
  return options
}

Objective-C

- (GADPictureInPictureAdOptions *)createTopLeftPositionOptions {
  GADPictureInPictureAdOptions *options =
      [[GADPictureInPictureAdOptions alloc] init];
  // Sets the ad position to the top-left corner of the screen.
  options.position = GADPictureInPictureAdPositionTopLeft;
  return options;
}

Para ver todos los puestos disponibles, consulta GADPictureInPictureAdPosition.

Establece el alcance de la presentación

De forma predeterminada, Google Mobile Ads SDK vincula un anuncio de pantalla en pantalla a la pantalla del host actual. Google Mobile Ads SDK descarta el anuncio cuando la jerarquía de vistas de la pantalla del host ya no está en la memoria. Para que el anuncio siga visible después de que se quite la pantalla del host de la memoria, establece el alcance de la presentación en la aplicación:

Swift

private func createApplicationScopedOptions() -> PictureInPictureAdOptions {
  let options = PictureInPictureAdOptions()
  // Keeps the ad visible beyond the host screen's lifecycle.
  options.presentationScope = .application
  return options
}

Objective-C

- (GADPictureInPictureAdOptions *)createApplicationScopedOptions {
  GADPictureInPictureAdOptions *options =
      [[GADPictureInPictureAdOptions alloc] init];
  // Keeps the ad visible beyond the host screen's lifecycle.
  options.presentationScope = GADPictureInPictureAdPresentationScopeApplication;
  return options;
}

Para obtener más información, consulta Cómo mantener el anuncio visible en todas las pantallas.

Configura la devolución de llamada del evento de anuncio

Para controlar los eventos del ciclo de vida de los anuncios en pantalla en pantalla, establece la devolución de llamada del evento en tu anuncio antes de mostrarlo. Esta devolución de llamada informa eventos estándar, como clics e impresiones. Este callback también informa eventos específicos del modo de pantalla en pantalla, como cuando se muestra o se oculta el anuncio:

Swift

func pictureInPictureAdDidShow(_ pictureInPictureAd: PictureInPictureAd) {
  print("Picture-in-Picture ad shown.")
}

func pictureInPictureAdDidHide(_ pictureInPictureAd: PictureInPictureAd) {
  print("Picture-in-Picture ad hidden.")
}

func pictureInPictureAdDidFailToShow(
  _ pictureInPictureAd: PictureInPictureAd, error: Error
) {
  print("Picture-in-Picture ad failed to show: \(error.localizedDescription)")
}

func pictureInPictureAdDidRecordImpression(
  _ pictureInPictureAd: PictureInPictureAd
) {
  print("Picture-in-Picture ad recorded an impression.")
}

func pictureInPictureAdDidRecordClick(
  _ pictureInPictureAd: PictureInPictureAd
) {
  print("Picture-in-Picture ad recorded a click.")
}

func pictureInPictureAdWillPresentScreen(
  _ pictureInPictureAd: PictureInPictureAd
) {
  print("Picture-in-Picture ad will present screen.")
}

func pictureInPictureAdWillDismissScreen(
  _ pictureInPictureAd: PictureInPictureAd
) {
  print("Picture-in-Picture ad will dismiss screen.")
}

func pictureInPictureAdDidDismissScreen(
  _ pictureInPictureAd: PictureInPictureAd
) {
  print("Picture-in-Picture ad dismissed screen.")
}

Objective-C

- (void)pictureInPictureAdDidShow:(GADPictureInPictureAd *)pictureInPictureAd {
  NSLog(@"Picture-in-Picture ad shown.");
}

- (void)pictureInPictureAdDidHide:(GADPictureInPictureAd *)pictureInPictureAd {
  NSLog(@"Picture-in-Picture ad hidden.");
}

- (void)pictureInPictureAdDidFailToShow:(GADPictureInPictureAd *)pictureInPictureAd
                              withError:(NSError *)error {
  NSLog(@"Picture-in-Picture ad failed to show: %@", error);
}

- (void)pictureInPictureAdDidRecordImpression:(GADPictureInPictureAd *)pictureInPictureAd {
  NSLog(@"Picture-in-Picture ad recorded an impression.");
}

- (void)pictureInPictureAdDidRecordClick:(GADPictureInPictureAd *)pictureInPictureAd {
  NSLog(@"Picture-in-Picture ad recorded a click.");
}

- (void)pictureInPictureAdWillPresentScreen:(GADPictureInPictureAd *)pictureInPictureAd {
  NSLog(@"Picture-in-Picture ad will present screen.");
}

- (void)pictureInPictureAdWillDismissScreen:(GADPictureInPictureAd *)pictureInPictureAd {
  NSLog(@"Picture-in-Picture ad will dismiss screen.");
}

- (void)pictureInPictureAdDidDismissScreen:(GADPictureInPictureAd *)pictureInPictureAd {
  NSLog(@"Picture-in-Picture ad dismissed screen.");
}

Ocultar el anuncio

Para quitar el anuncio flotante de la pantalla, llama al método hide. Este método invoca la devolución de llamada del evento de anuncio oculto:

Swift

private func hidePictureInPictureAd() {
  // Use the loaded PictureInPictureAd instance.
  guard let pipAd else {
    print("No ad to hide.")
    return
  }
  pipAd.hide()
}

Objective-C

- (void)hidePictureInPictureAd {
  // Use the loaded PictureInPictureAd instance.
  if (!self.pipAd) {
    NSLog(@"No ad to hide.");
    return;
  }
  [self.pipAd hide];
}

Limpia los recursos del anuncio

Para evitar fugas de memoria, descarta la referencia al objeto de anuncio cuando tu app termine de usar el anuncio. Por ejemplo, cuando tu app ya no muestra el anuncio o vuelve a interactuar con él. En el caso de los anuncios segmentados para la pantalla, suelta la referencia cuando tu app quite la pantalla host de la memoria. En el caso de los anuncios segmentados para la app, conserva la referencia del anuncio mientras el usuario navega por las pantallas y descarta la referencia cuando el usuario descarta el anuncio:

Swift

private func cleanUpPictureInPictureAd() {
  pipAd?.hide()
  pipAd = nil
}

Objective-C

- (void)cleanUpPictureInPictureAd {
  [self.pipAd hide];
  self.pipAd = nil;
}

Mantén el anuncio visible en todas las pantallas

Cuando configuras el alcance de la presentación en la aplicación, el anuncio de imagen en imagen permanece visible incluso cuando tu app quita la pantalla de alojamiento de la memoria. Para interactuar con el anuncio o descartarlo cuando el usuario navega fuera de la pantalla host, tu app debe conservar el acceso al anuncio de pantalla en pantalla. Te recomendamos que mantengas el anuncio en un singleton a nivel de la app o en un administrador de estado compartido, en lugar de en la variable de instancia de una sola pantalla.