Pencere içinde pencere

Bu kılavuz, mevcut IMA uygulamalarına Pencere İçinde Pencere desteği eklemek isteyen IMA yayıncıları için hazırlanmıştır.

Ön koşullar

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

IMA, SDK sürüm 3.1.0'dan itibaren iPad için Apple'ın Ekran İçinde Pencere modunu desteklemektedir. Uygulamanıza Pencere İçinde Pencere desteği eklemek için aşağıda gösterildiği gibi birkaç ayarda ince ayar yapmanız ve birkaç yeni IMA sınıfı uygulamanız gerekir.

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

Pencere İç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 özelliklerini arka planda oynatmayı destekleyecek şekilde ayarlayın ve IMASettings ürününde 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, Pencere İçinde Pencere özelliğini desteklemek için AVPictureInPictureController ve AVPictureinPictureControllerDelegate sınıflarını ekledi. IMA, kendi tarafında IMAPictureInPictureProxy özelliğini ekledi. Bu sınıfları projenize dahil etmek için aşağıdaki ifadeleri kodunuza 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 oluşturucunuza iletilir ve videonuz Resim İçinde Pencere modunda oynatılırken 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];
}

Reklamları başlatma

IMA SDK reklamları pencere içinde pencere modunda başlatılamaz. Bu nedenle, [adsManager start] yöntemini yalnızca videonuz standart oynatma modundayken çağırdığınızdan emin olmanı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 giriliyor

AVPlayerViewController içermeyen bir AVPlayer kullanıyorsanız kendi Resim İçinde Pencere düğmenizi eklemeniz gerekir. Gelişmiş Örneğimizde aşağıdaki gibi bir örnek uyguladık:

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

SSS

Video Pencere İçinde Pencere modundayken reklamları nasıl başlatırım?
Reklamlar, video Pencere İçinde Pencere modundayken başlatılamaz; yalnızca standart oynatma modunda başlatılabilir.
Mevcut Pencere İçinde Pencere entegrasyonumun self.pictureInPictureController.delegate ayarını kendi sınıfım olarak ayarlaması gerekiyor. IMA reklamları Pencere İçinde Pencerede kullanırken nasıl yetki verebilirim?
Pencere içinde pencere modunda reklam oynatmayı etkinleştirmek için IMA SDK'nın AVPictureinPictureControllerDelegate mesaj alması da gerekir. Bu nedenle, AVPictureinPictureController için temsilciyi IMAPictureInPicturyProxy örneğiyle ayarlamanızı rica ediyoruz. Bu proxy nesnesi, tüm AVPictureinPictureControllerDelegate mesajlarını uygulamanıza yönlendirir ancak Pencere İçinde Pencere desteğini etkinleştirmek için çağrıları IMA'ya yönlendirir. Ayrıca AVPlayerKatman için yerel bir herkese açık kullanıcı adı sağlamanız gerektiğini unutmayın.