Pencere içinde pencere

Bu kılavuz, Resim eklemek isteyen IMA yayıncılarına yöneliktir. Mevcut IMA uygulamaları için resim desteği.

Ön koşullar

Uygulamanıza pencere içinde pencere desteği ekleme

IMA, SDK 3.1.0 sürümü itibarıyla iPad için Apple'ın Pencere İçinde Pencere modunu destekler. Uygulamanıza Pencere İçinde Pencere desteği eklemek için aşağıdaki gibi birkaç ayarı değiştirmeniz ve birkaç yeni IMA sınıfı uygulamanız gerekir.

Ayarlar, arka planda oynatmaya izin verecek şekilde güncelleniyor

Pencere içinde pencere modu, uygulamanızda arka planda medya oynatmaya izin vermenizi gerektirir.

  1. Ses, AirPlay ve Pencere İçinde Pencere için Arka Plan Modları'nı aşağıda gösterildiği gibi AÇIK olarak ayarlayın:

  2. AVAudioSession mülklerini arka planda oynatmayı destekleyecek şekilde ayarlayın ve IMASettings'te arka planda oynatmayı etkinleştirin:

    ...
    – (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;
    }

Pencere içinde pencere için yeni iOS ve IMA nesneleri oluşturma

Apple, Pencerede Pencere özelliğini desteklemek için AVPictureInPictureController ve AVPictureinPictureControllerDelegate sınıflarını ekledi. IMA ise IMAPictureInPictureProxy değerini ekledi. Bu sınıfları projenize dahil etmek için kodunuza aşağıdaki ifadeleri ekleyin:

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

Reklam isteğinizi değiştirme

Oluşturulacak bir yeni nesne daha var: IMAAVPlayerVideoDisplay. Bu değer, IMAAdsRequest kurucunuza iletilir ve videonuz Pencere İçinde Pencere modunda oynatıldığında SDK'nın PiP penceresine reklam eklemesine olanak tanır:

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

Reklam başlatma

IMA SDK reklamları, pencere içinde pencere modunda başlatılamaz. Bu nedenle, [adsManager start] işlevini yalnızca videonuz standart oynatma modundayken çağırmanız gerekir:

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

Pencere içinde pencere moduna geçme

AVPlayerViewController olmadan AVPlayer kullanıyorsanız kendi Pencere İçinde Pencere düğmenizi eklemeniz gerekir. İleri Seviye Örneğimizde aşağıdaki gibi bir tane uyguladık:

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

SSS

Video Pencere İçinde Pencere modundayken nasıl reklam başlatabilirim?
Video, Pencere İçinde Pencere modundayken reklamlar başlatılamaz. Yalnızca standart oynatma modunda başlatılabilir.
Mevcut Pencere İçinde Pencere entegrasyonum için self.pictureInPictureController.delegate değerinin kendi sınıfım olarak ayarlanması gerekiyor. IMA reklamlarını, Büyük Resim modunda uygularken nasıl temsilci olmaya devam edebilirim?
Reklam oynatmanın Pencere İçinde Pencere modunda etkinleştirilebilmesi için IMA SDK'sının AVPictureinPictureControllerDelegate mesajları da alması gerekir. Bu nedenle, AVPictureinPictureController için temsilciyi IMAPictureInPicturyProxy örneğine ayarlamanızı rica ediyoruz. Bu proxy nesnesi, tüm AVPictureinPictureControllerDelegate mesajlarını uygulamanıza iletir ancak Pencere İçinde Pencere desteğini etkinleştirmek için çağrıları IMA'ya da iletir. Ayrıca şunu da unutmayın: AVPlayerKatman'ınızın yerel bir herkese açık kullanıcı adı olmasını sağlayın.