Obraz w obrazie

Ten przewodnik jest przeznaczony dla wydawców IMA, którzy chcą dodać obsługę obrazu w obrazie do swojej implementacji IMA.

Wymagania wstępne

Dodawanie obsługi obrazu w obrazie do aplikacji

Od pakietu SDK w wersji 3.1.0 pakiet IMA obsługuje tryb Apple „Obraz w obrazie” na iPadach. Aby dodać do aplikacji obsługę obrazu w obrazie, musisz dostosować kilka ustawień i wdrożyć kilka nowych klas IMA, jak pokazano poniżej.

zaktualizowanie ustawień, aby umożliwić odtwarzanie w tle;

Tryb obrazu w obrazie wymaga zezwolenia na odtwarzanie multimediów w tle.

  1. Ustaw Tryby w tle na WŁ. dla funkcji Dźwięk, AirPlay i obraz w obrazie, jak pokazano poniżej:

  2. Ustaw właściwości AVAudioSession, aby umożliwić odtwarzanie w tle i włączyć odtwarzanie w tle w usłudze 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;
    }

Tworzenie nowych obiektów iOS i IMA do funkcji obraz w obrazie

Aby umożliwić obsługę funkcji Obraz w obrazie, firma Apple dodała do tego klasy AVPictureInPictureController i AVPictureinPictureControllerDelegate. Z kolei IMA zostało dodane IMAPictureInPictureProxy. Aby włączyć te zajęcia do swojego projektu, dodaj do kodu te instrukcje:

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

Modyfikowanie żądania reklam

Musisz utworzyć jeszcze jeden nowy obiekt: IMAAVPlayerVideoDisplay. Informacje te są przekazywane do konstruktora IMAAdsRequest. Dzięki temu pakiet SDK może wstawiać reklamy do okna funkcji obraz w obrazie, gdy film jest odtwarzany w trybie obraz w obrazie:

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

Reklamy startowe

Reklam IMA SDK nie można uruchamiać w trybie obraz w obrazie. Dlatego musisz wywoływać funkcję [adsManager start] tylko wtedy, gdy film jest w standardowym trybie odtwarzania:

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

Włączam tryb obrazu w obrazie

Jeśli korzystasz z usługi AVPlayer bez AVPlayerViewController, musisz dodać własny przycisk obraz w obrazie. Zaimplementowaliśmy go w próbce zaawansowanej w ten sposób:

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

Najczęstsze pytania

Jak wyświetlać reklamy, gdy film jest w trybie obraz w obrazie?
Reklam nie można wyświetlać w trybie obraz w obrazie – można je uruchomić tylko w standardowym trybie odtwarzania.
Moja obecna integracja z obrazem w obrazie musi ustawić self.pictureInPictureController.delegate na moją klasę. Jak mogę wdrożyć reklamy IMA w obrazie, nie tracąc uprawnień do przedstawiciela?
Pakiet IMA SDK musi też otrzymywać komunikaty AVPictureinPictureControllerDelegate, aby umożliwić odtwarzanie reklam w trybie obraz w obrazie. Dlatego prosimy o ustawienie przedstawicieli AVPictureinPictureController na wystąpienie IMAPictureInPicturyProxy. Ten obiekt proxy przekierowuje wszystkie wiadomości AVPictureinPictureControllerDelegate do Twojej aplikacji, a także przekazuje wywołania do IMA, by włączyć obsługę obrazu w obrazie. Pamiętaj, że musisz też zachować lokalny nick elementu AVPlayerLayer.