Mendukung Picture-in-Picture

Media Ads (IMA) SDK untuk iOS.

Panduan ini ditujukan untuk penayang IMA yang ingin menambahkan dukungan Picture in Picture ke implementasi IMA yang ada.

Prasyarat

Menambahkan dukungan picture-in-picture ke aplikasi Anda

Mulai dari versi SDK 3.1.0, IMA mendukung mode Picture in Picture Apple untuk iPad. Untuk menambahkan dukungan Picture in Picture ke aplikasi Anda, Anda perlu mengubah beberapa setelan dan menerapkan beberapa class IMA baru, seperti yang ditunjukkan di bawah.

Memperbarui setelan untuk mengizinkan pemutaran di latar belakang

Mode Picture in Picture mengharuskan Anda mengizinkan pemutaran media di latar belakang di aplikasi Anda.

  1. Setel Background Modes ke ON untuk Audio, AirPlay and Picture in Picture seperti yang ditunjukkan di bawah:

  2. Tetapkan properti AVAudioSession untuk mendukung pemutaran di latar belakang, serta mengaktifkan pemutaran di latar belakang di IMASettings:

    ... (void)viewDidLoad {
     [super viewDidLoad];
    
     self.playButton.layer.zPosition = MAXFLOAT;
    
     [[AVAudioSession sharedInstance] setActive:YES error:nil];
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    
     [self setupAdsLoader];
     [self setUpContentPlayer];
    } (void)setupAdsLoader {
     IMASettings *settings = [[IMASettings alloc] init];
     settings.enableBackgroundPlayback = YES;
     self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:settings];
     self.adsLoader.delegate = self;
    }

Membuat objek iOS dan IMA baru untuk picture-in-picture

Untuk mendukung Picture in Picture, Apple menambahkan class AVPictureInPictureController dan AVPictureinPictureControllerDelegate. IMA, untuk bagiannya, menambahkan IMAPictureInPictureProxy. Untuk menggabungkan class ini dalam project Anda, tambahkan pernyataan berikut ke kode Anda:

...
@interface VideoViewController () <AVPictureInPictureControllerDelegate,
                                   IMAAdsLoaderDelegate,
                                   IMAAdsManagerDelegate,
                                   UIAlertViewDelegate>
...
// PiP objects.
@property(nonatomic, strong) IMAPictureInPictureProxy *pictureInPictureProxy;
@property(nonatomic, strong) AVPictureInPictureController *pictureInPictureController;
...
@end

- (void)setUpContentPlayer {
  ...
  self.pictureInPictureProxy =
      [[IMAPictureInPictureProxy alloc] initWithAVPictureInPictureControllerDelegate:self];
  self.pictureInPictureController =
      [[AVPictureInPictureController alloc] initWithPlayerLayer:self.contentPlayerLayer];
  self.pictureInPictureController.delegate = self.pictureInPictureProxy;
}

Mengubah permintaan iklan Anda

Ada satu objek baru lagi yang perlu dibuat: IMAAVPlayerVideoDisplay. Objek ini diteruskan ke konstruktor IMAAdsRequest Anda dan memungkinkan SDK menyisipkan iklan ke jendela PiP saat video Anda diputar dalam mode Picture in Picture:

...
- (void)requestAdsWithTag:(NSString *)adTagUrl {
  [self logMessage:@"Requesting ads"];
  // Create an ad request with our ad tag, display container, and optional user context.
  IMAAdsRequest *request = [[IMAAdsRequest alloc]
           initWithAdTagUrl:adTagUrl
         adDisplayContainer:[self createAdDisplayContainer]
       avPlayerVideoDisplay:[[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.contentPlayer]
      pictureInPictureProxy:self.pictureInPictureProxy
                userContext:nil];
  [self.adsLoader requestAdsWithRequest:request];
}

Memulai iklan

Iklan IMA SDK tidak dapat dimulai selama mode picture-in-picture. Oleh karena itu, Anda harus memastikan bahwa Anda hanya memanggil [adsManager start] saat video Anda berada dalam mode pemutaran standar:

...
- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event {
  [self logMessage:@"AdsManager event (%s).", AdEventNames[event.type]];
  // When the SDK notified you that ads have been loaded, play them.
  switch (event.type) {
    case kIMAAdEvent_LOADED:
      if (![self.pictureInPictureController isPictureInPictureActive]) {
        [adsManager start];
      }
      break;
    ...
    default:
      break;
  }
}

Memasuki mode picture-in-picture

Jika Anda menggunakan AVPlayer tanpa AVPlayerViewController, Anda perlu menambahkan tombol Picture in Picture Anda sendiri. Kami telah mengimplementasikannya di Contoh Lanjutan kami seperti ini:

- (IBAction)onPipButtonClicked:(id)sender {
  if ([self.pictureInPictureController isPictureInPictureActive]) {
    [self.pictureInPictureController stopPictureInPicture];
  } else {
    [self.pictureInPictureController startPictureInPicture];
  }
}

FAQ

Bagaimana cara memulai iklan saat video berada dalam mode Picture in Picture?
Iklan tidak dapat dimulai saat video berada dalam mode Picture in Picture; iklan hanya dapat dimulai dalam mode pemutaran standar.
Integrasi Picture in Picture yang ada harus menetapkan self.pictureInPictureController.delegate ke class saya sendiri. Bagaimana cara mengimplementasikan iklan IMA di Picture in Picture dan tetap menjadi delegasi?
IMA SDK juga perlu menerima pesan AVPictureinPictureControllerDelegate untuk mengaktifkan pemutaran iklan dalam mode Picture in Picture. Itulah sebabnya kami meminta Anda untuk menetapkan delegasi untuk AVPictureinPictureController ke instance IMAPictureInPicturyProxy. Objek proxy ini meneruskan semua pesan AVPictureinPictureControllerDelegate ke aplikasi Anda, tetapi juga meneruskan panggilan ke IMA untuk mengaktifkan dukungan Picture in Picture. Perhatikan bahwa Anda juga harus mempertahankan pengendali lokal ke AVPlayerLayer Anda.