Как реализовать объявления с функцией "Картинка в картинке" (бета-версия)

Выберите платформу: Android iOS

Картинка в картинке

Объявления типа "Картинка в картинке" показываются в плавающем окне, которое всегда находится поверх контента на экране, например статей, фидов или игрового процесса. Этот формат позволяет пользователям взаимодействовать с приложением, пока объявление остаётся видимым. Этот формат позволяет показывать объявления, которые не занимают весь экран.

В этом руководстве рассказывается, как запрашивать и показывать в приложении объявления в режиме "Картинка в картинке", используя Google Mobile Ads SDK.

Подготовка

Прежде чем продолжить, выполните следующие действия:

Как загрузить объявление

Чтобы загрузить объект GADPictureInPictureAd, создайте запрос объявления и вызовите метод load:

Swift

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

Замените adUnitID идентификатором рекламного блока.

Objective-C

- (void)loadAdManagerPictureInPictureAd {
  GAMRequest *request = [GAMRequest 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;
      }];
}

Замените kAdUnitID идентификатором рекламного блока.

Показ объявления

Чтобы показать объявление в режиме "Картинка в картинке", настройте параметры этого режима и вызовите метод show. В следующем примере задается позиция объявления по умолчанию и область показа на экране:

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

Как задать положение

По умолчанию Google Mobile Ads SDK показывает плавающее окно с объявлением в правом нижнем углу экрана при первом показе или в последнем известном положении, если оно уже показывалось. Чтобы настроить место показа объявления, задайте позицию в параметрах режима "Картинка в картинке". В следующем примере показано, как разместить элемент поверх контента в верхнем левом углу экрана:

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

Список всех доступных позиций можно найти в GADPictureInPictureAdPosition.

Как задать область действия презентации

По умолчанию Google Mobile Ads SDK привязывает объявление в режиме "Картинка в картинке" к текущему экрану хоста. Google Mobile Ads SDK отклоняет объявление, когда иерархия View экрана организатора больше не хранится в памяти. Чтобы объявление оставалось видимым после того, как экран хоста будет удален из памяти, задайте область показа на уровне приложения:

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

Подробнее о том, как сделать объявление видимым на разных экранах…

Как задать обратный вызов события объявления

Чтобы обрабатывать события жизненного цикла рекламы в режиме "картинка в картинке", задайте обратный вызов события для объявления до его показа. Этот метод обратного вызова сообщает о стандартных событиях, таких как клики и показы. Этот обратный вызов также сообщает о событиях, связанных с режимом "Картинка в картинке", например о том, когда объявление показывается или скрывается:

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

скрыть объявление;

Чтобы удалить плавающее объявление с экрана, вызовите метод hide. Этот метод вызывает обратный вызов события скрытия объявления:

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

Как удалить рекламные ресурсы

Чтобы избежать утечек памяти, удалите ссылку на объект объявления, когда приложение перестанет его использовать. Например, когда ваше приложение перестает показывать объявление или взаимодействовать с ним. Для объявлений с областью действия на экране удалите ссылку, когда приложение удалит из памяти экран, на котором показывается объявление. Для объявлений, относящихся к приложению, сохраняйте ссылку на объявление, пока пользователь переходит между экранами, и удаляйте ссылку, когда пользователь закрывает объявление:

Swift

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

Objective-C

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

Как сделать так, чтобы объявление было видно на разных экранах

Если задать в качестве области показа приложение, то реклама в режиме "картинка в картинке" будет видна, даже если приложение удалит из памяти экран, на котором она показывается. Чтобы пользователь мог взаимодействовать с объявлением или закрыть его, когда он переходит с основного экрана, приложению необходимо сохранить доступ к объявлению в режиме "Картинка в картинке". Мы рекомендуем хранить объявление в одноэлементном объекте на уровне приложения или в общем менеджере состояний, а не в переменной экземпляра одного экрана.

Примеры того, как обеспечить видимость объявления на разных экранах, можно найти в следующих приложениях: