Hỗ trợ tính năng Hình trong hình

SDK Quảng cáo trên phương tiện truyền thông (IMA) dành cho iOS.

Hướng dẫn này dành cho những nhà xuất bản IMA muốn thêm chế độ hỗ trợ Hình trong hình vào chế độ triển khai IMA hiện có.

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

Thêm tính năng hỗ trợ 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. Để thêm chế độ hỗ trợ cho chế độ Hình trong hình vào ứng dụng, bạn cần điều chỉnh một số chế độ cài đặt và triển khai một số lớp IMA mới, như minh hoạ dưới đây.

Cập nhật 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 nghe nhìn trong nền trong ứng dụng của mình.

  1. Đặt Chế độ nền thành BẬT cho Âm thanh, AirPlay và Hình trong hình như minh hoạ bên dưới:

  2. Đặt các thuộc tính AVAudioSession để hỗ trợ chế độ phát trong nền, cũng như bật chế độ 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 các đối tượng iOS và IMA mới cho chế độ hình trong hình

Để hỗ trợ chế độ 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 vào dự án của bạn, hãy thêm các câu lệnh sau vào mã:

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

Bạn cần tạo thêm một đối tượng mới nữa: IMAAVPlayerVideoDisplay. Tham số 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 của bạn đ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 chạy quảng cáo

Không thể bắt đầu quảng cáo IMA SDK ở chế độ hình trong hình. Do đó, bạn cần đảm bảo rằng bạn 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;
  }
}

Chuyển sang 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 chế độ Hình trong hình của riêng mình. Chúng tôi đã triển khai một trong Advanced Sample (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 quảng cáo khi video ở chế độ Hình trong hình?
Không thể bắt đầu quảng cáo khi video ở chế độ Hình trong hình; quảng cáo chỉ có thể bắt đầu ở chế độ phát thông thường.
Chế độ tích hợp Hình trong hình hiện tại của tôi cần đặt self.pictureInPictureController.delegate cho lớp của riêng tôi. Làm cách nào để triển khai quảng cáo IMA ở chế độ Hình trong hình mà vẫn là đại biểu?
SDK IMA cũng cần nhận 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 phiên bản của IMAPictureInPicturyProxy. Đối tượng proxy này chuyển tiếp tất cả các thông báo AVPictureinPictureControllerDelegate đến ứng dụng của bạn, nhưng cũng chuyển tiếp các lệnh gọi đến IMA để bật tính năng hỗ trợ chế độ Hình trong hình. Xin lưu ý rằng bạn cũng phải duy trì một đối tượng xử lý cục bộ cho AVPlayerLayer.