Pencere içinde pencere özelliğini destekleme

Media Ads (IMA) SDK'sı (iOS)

Bu kılavuz, mevcut IMA uygulamalarına resim içinde resim desteği eklemek isteyen IMA yayıncıları içindir.

Ön koşullar

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

IMA, SDK sürümü 3.1.0'dan itibaren iPad'de Apple'ın resim içinde resim modunu desteklemektedir. Uygulamanıza resim içinde resim desteği eklemek için aşağıdaki örnekte gösterildiği gibi birkaç ayarı değiştirmeniz ve birkaç yeni IMA sınıfı uygulamanız gerekir.

Arka planda oynatmaya izin vermek için ayarları güncelleme

Pencere içinde pencere modu için uygulamanızda arka planda medya oynatmaya izin vermeniz gerekir.

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

  2. Arka planda oynatmayı desteklemek için AVAudioSession özelliklerini ayarlayın ve IMASettings'da 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, resim içinde resim özelliğini desteklemek için AVPictureInPictureController ve AVPictureinPictureControllerDelegate sınıflarını ekledi. IMA ise IMAPictureInPictureProxy 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şturulması gereken bir yeni nesne daha var: IMAAVPlayerVideoDisplay. Bu, IMAAdsRequest oluşturucunuza iletilir ve SDK'nın, videonuz pencere içinde pencere modunda oynatılırken 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, yalnızca videonuz standart oynatma modundayken [adsManager start] işlevini ç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 geçme

AVPlayerViewController olmadan AVPlayer kullanıyorsanız kendi resim içinde resim düğmenizi eklemeniz gerekir. AdvancedSample'da bunu şu şekilde uyguladık:

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

SSS

Video, ekran içinde ekran modundayken reklamları nasıl başlatırım?
Video, ekran içinde ekran modundayken reklamlar başlatılamaz. Reklamlar yalnızca standart oynatma modunda başlatılabilir.
Mevcut resim içinde resim entegrasyonumun self.pictureInPictureController.delegate değerini kendi sınıfıma ayarlaması gerekiyor. Resim İçinde Resim'de IMA reklamlarını nasıl uygulayabilirim ve yine de temsilci olabilir miyim?
IMA SDK'nın, resim içinde resim modunda reklam oynatmayı etkinleştirmek için AVPictureinPictureControllerDelegate mesajlarını da alması gerekir. Bu nedenle, AVPictureinPictureController için temsilciyi IMAPictureInPicturyProxy örneği olarak ayarlamanızı istiyoruz. Bu proxy nesnesi, tüm AVPictureinPictureControllerDelegate mesajları uygulamanıza yönlendirir ancak Resim İçinde Resim desteğini etkinleştirmek için IMA'ya yapılan çağrıları da yönlendirir. AVPlayerLayer'ınız için yerel bir tutma yeri de bulundurmanız gerektiğini unutmayın.