从 DAI v3 升级到 v4

适用于 tvOS DAI 和 tvOS 客户端的 IMA SDK 已在版本 4 中合并,并已重新处理为 iOS SDK 的一个确切子集。这极大地缩短了 iOS 开发者的学习难度。因此,DAI 用户所需的一些代码发生了变化,以便与我们的其他 SDK 更加一致。

本指南介绍了将现有 v3 实现升级到新的 v4 SDK 所需的过程。

如有疑问,请参阅 iOS DAI 示例 - tvOS v4 API 是相同的(但随播广告和画中画除外,它们在 tvOS 上不可用)。

更改模块名称

为了与 iOS SDK 匹配,我们已将模块名称从 InteractiveMediaAds 更改为 GoogleInteractiveMediaAds

变更
旧优惠

#import <InteractiveMediaAds/InteractiveMediaAds.h>

新观看者

#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>

旧优惠

@import InteractiveMediaAds;

新观看者

@import GoogleInteractiveMediaAds;

创建新的广告容器

IMAAdDisplayContainer 负责管理广告容器视图和用于广告播放的随播广告位。

变更
旧优惠 之前没有对应项。
新观看者

self.adDisplayContainer =
    [[IMAAdDisplayContainer alloc] initWithAdContainer:self.videoView];

将 IMAVideoDisplay 和 IMAAdDisplayContainer 传递到 IMAStreamRequest 中

现在您已经有了视频显示屏和 IMAAdDisplayContainer,,接下来需要将它们传递给视频流请求,以便 IMA SDK 可以管理它们。

变更
旧优惠

IMALiveStreamRequest *streamRequest =
    [[IMALiveStreamRequest alloc] initWithAssetKey:kAssetKey];
IMAVODStreamRequest *streamRequest =
    [[IMAVODStreamRequest alloc] initWithContentSourceID:kContentSourceID
                                                 videoID:kVideoID];

新观看者

IMALiveStreamRequest *streamRequest =
    [[IMALiveStreamRequest alloc] initWithAssetKey:kAssetKey
                                adDisplayContainer:self.adDisplayContainer
                                      videoDisplay:self.videoDisplay];
IMAVODStreamRequest *streamRequest =
      [[IMAVODStreamRequest alloc] initWithContentSourceId:kContentSourceID
                                                   videoId:kVideoID
                                        adDisplayContainer:self.adDisplayContainer
                                              videoDisplay:self.videoDisplay];

使用 IMAAdsLoader 发出请求

变更
旧优惠

self.streamManager =
    [[IMAStreamManager alloc] initWithVideoDisplay:self.videoDisplay];
self.streamManager.delegate = self;
[self.streamManager requestStream:streamRequest];

新观看者

self.adsLoader = [[IMAAdsLoader alloc] init];
self.adsLoader.delegate = self;
[self.adsLoader requestStreamWithRequest:streamRequest];

实现 IMAAdsLoaderDelegate 以进行视频流初始化

这些函数已被重命名和修改,以与 iOS SDK 保持一致。视频流管理器与视频流之间的关系也发生了变化。在 v3 SDK 中,单个视频流管理器可用于管理多个视频流。在 v4 中,每个数据流管理器只能管理一个数据流。

变更
旧优惠

- (void)streamManager:(IMAStreamManager *)streamManager
    didInitializeStream:(NSString *)streamID {
  NSLog(@"Stream initialized with streamID: %@", streamID);
}

- (void)streamManager:(IMAStreamManager *)streamManager
      didReceiveError:(NSError *)error {
  NSLog(@"Error: %@", error);
  [self playBackupStream];
}

新观看者

- (void)adsLoader:(IMAAdsLoader *)loader
    adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData {
  self.streamManager = adsLoadedData.streamManager;
  self.streamManager.delegate = self;
  [self.streamManager initializeWithAdsRenderingSettings:nil];
  NSLog(@"Stream initialized with streamID: %@", self.streamManager.streamId);
}

- (void)adsLoader:(IMAAdsLoader *)loader
    failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData {
  NSLog(@"Error: %@", adErrorData.adError);
  [self playBackupStream];
}

实现 IMAStreamManagerDelegate

为了与 iOS SDK 保持一致,tvOS SDK 现在提供了单个流管理器委托 IMAStreamManagerDelegate,用于处理流事件。现在,您需要在该委托中使用 switch 语句来管理特定事件。

变更
旧优惠

- (void)streamManager:(IMAStreamManager *)streamManager
      adBreakDidStart:(IMAAdBreakInfo *)adBreakInfo {
  NSLog(@"Ad break started");
  self.playerViewController.requiresLinearPlayback = YES;
}

- (void)streamManager:(IMAStreamManager *)streamManager
        adBreakDidEnd:(IMAAdBreakInfo *)adBreakInfo {
  NSLog(@"Ad break ended");
  self.playerViewController.requiresLinearPlayback = NO;
}

新观看者

- (void)streamManager:(IMAStreamManager *)streamManager
    didReceiveAdEvent:(IMAAdEvent *)event {
  NSLog(@"StreamManager event (%@).", event.typeString);
  switch (event.type) {
    case kIMAAdEvent_AD_BREAK_STARTED: {
      NSLog(@"Ad break started");
      self.playerViewController.requiresLinearPlayback = YES;
      break;
    }
    case kIMAAdEvent_AD_BREAK_ENDED: {
      NSLog(@"Ad break ended");
      self.playerViewController.requiresLinearPlayback = NO;
      break;
    }
    // And so on for other events.
    default:
      break;
  }
}