Hình trong hình

Hướng dẫn này dành cho các nhà xuất bản IMA muốn thêm tính năng hỗ trợ Hình trong hình vào hoạt động triển khai IMA hiện tại.

Điều kiện tiên quyết

Thêm tính năng hỗ trợ tính năng hình trong hình vào ứng dụng

Kể từ phiên bản SDK 3.1.0, IMA hỗ trợ chế độ Hình trong hình của Apple cho iPad. Để hỗ trợ thêm tính năng Hình trong hình vào ứng dụng, bạn cần điều chỉnh một vài chế độ cài đặt và triển khai một vài lớp IMA mới, như thể hiện dưới đây.

Đang cập nhật các chế độ cài đặt để cho phép phát trong nền

Chế độ Hình trong hình yêu cầu bạn cho phép phát nội dung đa phương tiện ở chế độ nền trong ứng dụng.

  1. Đặt Chế độ nền thành BẬT cho tính năng Âm thanh, AirPlay và Hình trong hình như sau:

  2. Đặt các thuộc tính AVAudioSession để hỗ trợ tính năng phát trong nền cũng như cho phép phát trong nền trong 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;
    }

Tạo đối tượng iOS và IMA mới cho chế độ hình trong hình

Để hỗ trợ tính năng Hình trong hình, Apple đã thêm các lớp AVPictureInPictureControllerAVPictureinPictureControllerDelegate. Về phần mình, IMA đã thêm IMAPictureInPictureProxy. Để kết hợp các lớp này trong dự án, hãy thêm các câu lệnh sau vào mã của bạn:

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

Sửa đổi yêu cầu quảng cáo của bạn

Bạn cần tạo một đối tượng mới nữa: IMAAVPlayerVideoDisplay. Thông tin này được truyền đến hàm khởi tạo IMAAdsRequest và cho phép SDK chèn quảng cáo vào cửa sổ PiP khi video đang phát ở chế độ Hình trong hình:

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

Bắt đầu quảng cáo

Quảng cáo SDK IMA không thể bắt đầu trong chế độ hình trong hình. Do đó, bạn cần đảm bảo chỉ gọi [adsManager start] khi video ở chế độ phát tiêu chuẩn:

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

Vào chế độ hình trong hình

Nếu đang sử dụng AVPlayer mà không có AVPlayerViewController, bạn cần thêm nút Hình trong hình của riêng bạn. Chúng tôi đã triển khai một phương thức trong Mẫu nâng cao như sau:

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

Câu hỏi thường gặp

Làm cách nào để bắt đầu chạy quảng cáo khi video ở chế độ Hình trong hình?
Quảng cáo không thể bắt đầu phát khi video đang ở chế độ Hình trong hình; quảng cáo chỉ có thể bắt đầu ở chế độ phát tiêu chuẩn.
Công cụ tích hợp Hình trong hình hiện có của tôi cần đặt self.pictureInPictureController.delegate thành lớp của riêng tôi. Làm cách nào để tôi triển khai quảng cáo IMA ở chế độ Hình trong hình mà vẫn được uỷ quyền?
SDK IMA cũng cần nhận được các thông báo AVPictureinPictureControllerDelegate để cho phép phát quảng cáo ở chế độ Hình trong hình. Đó là lý do chúng tôi yêu cầu bạn đặt uỷ quyền cho AVPictureinPictureController thành một thực thể của IMAPictureInPicturyProxy. Đối tượng proxy này chuyển tiếp mọi thông báo AVPictureinPictureControllerDelegate đến ứng dụng của bạn, nhưng cũng chuyển tiếp lệnh gọi đến IMA để bật tính năng hỗ trợ Hình trong hình. Xin lưu ý rằng bạn cũng phải duy trì một tên người dùng cục bộ cho AVPlayerLayer.