ピクチャー イン ピクチャー

このガイドは、既存の IMA 実装にピクチャー イン ピクチャーのサポートを追加することを検討している IMA パブリッシャーを対象としています。

前提条件

アプリにピクチャー イン ピクチャーのサポートを追加する

SDK バージョン 3.1.0 では、IMA は Apple の iPad 向けピクチャー イン ピクチャー モードをサポートしています。 アプリにピクチャー イン ピクチャーのサポートを追加するには、以下に示すように、いくつかの設定を調整し、新しい IMA クラスをいくつか実装する必要があります。

バックグラウンド再生を許可する設定の更新

ピクチャー イン ピクチャー モードでは、アプリでバックグラウンドでのメディア再生を許可する必要があります。

  1. 次のように、[Audio, AirPlay, Picture in Picture] の [Background Modes] を [ON] に設定します。

  2. バックグラウンド再生をサポートするとともに、IMASettings でバックグラウンド再生を有効にするように AVAudioSession プロパティを設定します。

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

ピクチャー イン ピクチャー用に新しい iOS オブジェクトと IMA オブジェクトを作成する

ピクチャー イン ピクチャーをサポートするため、Apple は AVPictureInPictureController クラスと AVPictureinPictureControllerDelegate クラスを追加しました。IMA の一部である IMAPictureInPictureProxy が追加されました。これらのクラスをプロジェクトに組み込むには、次のステートメントをコードに追加します。

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

広告リクエストを修正する

作成する新しいオブジェクトをもう 1 つ、IMAAVPlayerVideoDisplay としています。これは IMAAdsRequest コンストラクタに渡され、動画がピクチャー イン ピクチャー モードで再生されているときに SDK で PIP ウィンドウに広告を挿入できるようになります。

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

広告の開始

IMA SDK 広告は、ピクチャー イン ピクチャー モードのときは開始できません。そのため、動画が標準再生モードの場合にのみ [adsManager start] を呼び出すようにする必要があります。

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

ピクチャー イン ピクチャー モードに切り替える

AVPlayerViewController なしで AVPlayer を使用する場合は、独自のピクチャー イン ピクチャー ボタンを追加する必要があります。高度なサンプルには、次のような実装が用意されています。

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

よくある質問

動画がピクチャー イン ピクチャー モードのときに広告掲載を開始するにはどうすればよいですか?
動画がピクチャー イン ピクチャー モードになっている間は、広告を開始できません。標準の再生モードでのみ開始できます。
既存のピクチャー イン ピクチャーの統合では、self.pictureInPictureController.delegate を自分のクラスに設定する必要があります。ピクチャー イン ピクチャーで IMA 広告を実装した状態でデリゲートするには、どうすればよいですか?
ピクチャー イン ピクチャー モードでの広告再生を有効にするには、IMA SDK が AVPictureinPictureControllerDelegate メッセージを受信する必要もあります。AVPictureinPictureController のデリゲートを IMAPictureInPicturyProxy のインスタンスに設定する必要があるのは、このためです。このプロキシ オブジェクトは、すべての AVPictureinPictureControllerDelegate メッセージのアプリへの転送に加えて、ピクチャー イン ピクチャーのサポートを有効にするために IMA の呼び出しも転送します。また、AVPlayerLayer のローカル ハンドルも保持する必要があることにご注意ください。