Bắt đầu sử dụng SDK IMA DAI

SDK IMA giúp bạn dễ dàng tích hợp quảng cáo đa phương tiện vào trang web và ứng dụng của mình. SDK IMA có thể yêu cầu quảng cáo từ bất kỳ Máy chủ quảng cáo tuân thủ VAST và quản lý việc phát quảng cáo trong các ứng dụng của bạn. Với SDK IMA DAI, ứng dụng tạo ra yêu cầu phát trực tuyến cho quảng cáo và video nội dung, VOD hoặc nội dung trực tiếp. Sau đó, SDK này sẽ trả về một luồng video kết hợp, để bạn không phải quản lý việc chuyển đổi giữa quảng cáo và video nội dung trong ứng dụng của bạn.

Chọn giải pháp DAI mà bạn quan tâm

DAI (Chèn quảng cáo động) đầy đủ dịch vụ

Hướng dẫn này minh hoạ cách tích hợp SDK IMA DAI vào một trình phát video đơn giản . Nếu bạn muốn xem hoặc theo dõi một mẫu hoàn chỉnh hãy tải xuống BasicExample (Ví dụ cơ bản) trên GitHub.

Tổng quan về IMA DAI

Việc triển khai IMA DAI bao gồm 3 thành phần SDK chính như được minh hoạ trong ví dụ này hướng dẫn:

  • IMAAdDisplayContainer: Đối tượng vùng chứa nằm phía trên phần tử phát video và chứa các phần tử trên giao diện người dùng của quảng cáo.
  • IMAAdsLoader: Một đối tượng yêu cầu luồng và xử lý các sự kiện do các đối tượng phản hồi yêu cầu luồng kích hoạt. Bạn chỉ nên tạo thực thể cho một trình tải quảng cáo. Trình tải này có thể được sử dụng lại trong suốt vòng đời của .
  • IMAStreamRequest – hoặc là IMAVODStreamRequest hoặc một IMALiveStreamRequest: Đối tượng xác định yêu cầu luồng. Các yêu cầu phát trực tiếp có thể là video theo yêu cầu hoặc video theo yêu cầu trực tiếp phát trực tuyến. Các yêu cầu sẽ chỉ định một Content ID, cũng như một khoá API hoặc mã xác thực và các thông tin tham số.
  • IMAStreamManager: Đối tượng xử lý luồng chèn quảng cáo động và hoạt động tương tác với phần phụ trợ DAI. Chiến lược phát hành đĩa đơn Trình quản lý luồng cũng xử lý các ping theo dõi cũng như chuyển tiếp các sự kiện luồng và quảng cáo đến nhà xuất bản.

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

Trước khi bắt đầu, bạn cần có:

Tạo dự án Xcode mới

Trong Xcode, hãy tạo một dự án tvOS mới bằng Mục tiêu-C. Sử dụng BasicExample làm tên dự án.

Thêm SDK IMA DAI vào dự án Xcode

Sử dụng một trong ba phương pháp sau để cài đặt SDK IMA DAI.

Cài đặt SDK bằng CocoaPods (ưu tiên)

CocoaPods là người quản lý phần phụ thuộc cho các dự án Xcode và là ứng dụng được khuyên dùng để cài đặt SDK IMA DAI. Để biết thêm thông tin về cách cài đặt hoặc sử dụng CocoaPods, hãy xem tài liệu về CocoaPods. Khi bạn nếu bạn đã cài đặt CocoaPods, hãy sử dụng hướng dẫn sau để cài đặt SDK IMA DAI:

  1. Trong cùng thư mục với tệp BasicExample.xcodeproj của bạn, hãy tạo một văn bản có tên Podfile và thêm cấu hình sau:

    source 'https://github.com/CocoaPods/Specs.git'
    platform :tvos, '14'
    target "BasicExample" do
      pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.13.0'
    end
    
  2. Từ thư mục chứa Podfile, hãy chạy:

    pod install --repo-update`
    
  3. Xác minh rằng quá trình cài đặt đã thành công bằng cách mở Tệp BasicExample.xcworkspace và xác nhận rằng tệp đó chứa hai dự án: BasicExamplePods (các phần phụ thuộc được cài đặt bởi CocoaPods).

Cài đặt SDK bằng Trình quản lý gói Swift

SDK quảng cáo trên phương tiện truyền thông tương tác hỗ trợ Gói Swift Manager kể từ phiên bản 4.8.2. Làm theo các bước sau các bước để nhập gói Swift.

  1. Trong Xcode, hãy cài đặt Gói GoogleContactMediaAds Swift bằng cách chuyển đến Tệp > Thêm gói.

  2. Khi thông báo nhắc xuất hiện, hãy tìm kiếm cụm từ GoogleContinueMediaAds Swift Kho lưu trữ gói GitHub:

    https://github.com/googleads/swift-package-manager-google-interactive-media-ads-tvos
    
  3. Chọn phiên bản của Gói Google InteractiveMediaAds Swift mà bạn muốn sử dụng. Cho người mới dự án của mình, bạn nên sử dụng phiên bản Up to Next Major Version (Lên phiên bản lớn tiếp theo).

Khi bạn hoàn tất, Xcode sẽ phân giải các phần phụ thuộc của gói và tải chúng xuống trong nền. Để biết thêm thông tin về cách thêm các phần phụ thuộc của gói, hãy xem của Apple bài viết.

Tải xuống và cài đặt SDK theo cách thủ công

Nếu không muốn sử dụng Trình quản lý gói Swift hoặc CocoaPods, bạn có thể tải xuống SDK IMA DAI và thêm nó vào dự án của bạn theo cách thủ công.

Tạo trình phát video đơn giản

Đầu tiên, hãy triển khai trình phát video cơ bản. Ban đầu, trình phát này không sử dụng SDK IMA DAI cũng không chứa bất kỳ phương thức nào để kích hoạt phát lại.

ViewController.m

#import "ViewController.h"

#import <AVKit/AVKit.h>

@interface ViewController ()
@property(nonatomic) AVPlayerViewController *playerViewController;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor blackColor];

  // Create a stream video player.
  AVPlayer *player = [[AVPlayer alloc] init];
  self.playerViewController = [[AVPlayerViewController alloc] init];
  self.playerViewController.player = player;

  // Attach the video player to the view hierarchy.
  [self addChildViewController:self.playerViewController];
  self.playerViewController.view.frame = self.view.bounds;
  [self.view addSubview:self.playerViewController.view];
  [self.playerViewController didMoveToParentViewController:self];
}

@end

Nhập SDK và thêm mã giả lập cho tương tác IMA

Sau khi bạn thêm SDK IMA DAI vào dự án của mình, hãy nhập SDK này và thêm mã giả lập cho các điểm chính của tương tác IMA.

ViewController.m

#import "ViewController.h"

#import <AVKit/AVKit.h>
#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>

@interface ViewController ()
@property(nonatomic) IMAAdsLoader *adsLoader;
@property(nonatomic) UIView *adContainerView;
@property(nonatomic) IMAStreamManager *streamManager;
@property(nonatomic) AVPlayerViewController *playerViewController;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor blackColor];

  [self setupAdsLoader];

  // Create a stream video player.
  AVPlayer *player = [[AVPlayer alloc] init];
  self.playerViewController = [[AVPlayerViewController alloc] init];
  self.playerViewController.player = player;

  // Attach the video player to the view hierarchy.
  [self addChildViewController:self.playerViewController];
  self.playerViewController.view.frame = self.view.bounds;
  [self.view addSubview:self.playerViewController.view];
  [self.playerViewController didMoveToParentViewController:self];

  [self attachAdContainer];
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self requestStream];
}

- (void)setupAdsLoader {}

- (void)attachAdContainer {}

- (void)requestStream {}

@end

Triển khai IMAAdsLoader

Tiếp theo, hãy tạo IMAAdsLoader và đính kèm chế độ xem vùng chứa quảng cáo vào hệ phân cấp khung hiển thị.

ViewController.m

- (void)setupAdsLoader {
  self.adsLoader = [[IMAAdsLoader alloc] init];
  self.adsLoader.delegate = self;
}

- (void)attachAdContainer {
  self.adContainerView = [[UIView alloc] init];
  [self.view addSubview:self.adContainerView];
  self.adContainerView.frame = self.view.bounds;
}

Tạo yêu cầu phát trực tuyến

Tạo một vài hằng số để lưu giữ thông tin luồng rồi triển khai hàm yêu cầu luồng để tạo yêu cầu.

ViewController.m

#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>

static NSString *const kAssetKey = @"sN_IYUG8STe1ZzhIIE_ksA";
static NSString *const kContentSourceID = @"2548831";
static NSString *const kVideoID = @"tears-of-steel";

@interface ViewController ()
...

- (void)requestStream {
  IMAAVPlayerVideoDisplay *videoDisplay =
      [[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.playerViewController.player];
  IMAAdDisplayContainer *adDisplayContainer =
      [[IMAAdDisplayContainer alloc] initWithAdContainer:self.adContainerView];
  IMALiveStreamRequest *request = [[IMALiveStreamRequest alloc] initWithAssetKey:kAssetKey
                                                              adDisplayContainer:adDisplayContainer
                                                                    videoDisplay:videoDisplay];
  // VOD request. Comment out the IMALiveStreamRequest above and uncomment this IMAVODStreamRequest
  // to switch from a livestream to a VOD stream.
  // IMAVODStreamRequest *request =
  //     [[IMAVODStreamRequest alloc] initWithContentSourceId:kContentSourceID
  //                                                  videoId:kVideoID
  //                                       adDisplayContainer:adDisplayContainer
  //                                             videoDisplay:videoDisplay];
  [self.adsLoader requestStreamWithRequest:request];
}

Xử lý sự kiện phát trực tiếp

Các sự kiện kích hoạt IMAAdsLoaderIMAStreamManager được dùng để xử lý khởi chạy, lỗi và thay đổi trong trạng thái luồng. Những sự kiện này được kích hoạt trên giao thức IMAAdsLoaderDelegateIMAStreamManagerDelegate. Nghe một sự kiện quảng cáo đã tải và khởi chạy luồng. Nếu quảng cáo không tải được, hãy phát luồng dự phòng.

ViewController.m

static NSString *const kAssetKey = @"sN_IYUG8STe1ZzhIIE_ksA";
static NSString *const kContentSourceID = @"2548831";
static NSString *const kVideoID = @"tears-of-steel";
static NSString *const kBackupStreamURLString =
    @"https://storage.googleapis.com/interactive-media-ads/media/bbb.m3u8";

@interface ViewController () <IMAAdsLoaderDelegate, IMAStreamManagerDelegate>

...
  [self.adsLoader requestStreamWithRequest:request];
}

- (void)playBackupStream {
  NSURL *backupStreamURL = [NSURL URLWithString:kBackupStreamURLString];
  AVPlayerItem *backupStreamItem = [AVPlayerItem playerItemWithURL:backupStreamURL];
  [self.playerViewController.player replaceCurrentItemWithPlayerItem:backupStreamItem];
  [self.playerViewController.player play];
}

#pragma mark - IMAAdsLoaderDelegate

- (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData {
  // Initialize and listen to stream manager's events.
  self.streamManager = adsLoadedData.streamManager;
  self.streamManager.delegate = self;
  [self.streamManager initializeWithAdsRenderingSettings:nil];
  NSLog(@"Stream created with: %@.", self.streamManager.streamId);
}

- (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData {
  // Fall back to playing the backup stream.
  NSLog(@"Error loading ads: %@", adErrorData.adError.message);
  [self playBackupStream];
}

#pragma mark - IMAStreamManagerDelegate

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {}

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdError:(IMAAdError *)error {}

- (void)streamManager:(IMAStreamManager *)streamManager
  adDidProgressToTime:(NSTimeInterval)time
           adDuration:(NSTimeInterval)adDuration
           adPosition:(NSInteger)adPosition
             totalAds:(NSInteger)totalAds
      adBreakDuration:(NSTimeInterval)adBreakDuration {}

@end

Xử lý việc ghi nhật ký và các sự kiện lỗi

Có một số sự kiện có thể được xử lý bởi người được uỷ quyền của trình quản lý luồng, nhưng cho các hoạt động triển khai cơ bản, cách sử dụng quan trọng nhất là thực hiện ghi nhật ký sự kiện, để ngăn hành động tìm kiếm trong khi quảng cáo đang phát, cũng như để xử lý lỗi.

ViewController.m

#pragma mark - IMAStreamManagerDelegate

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
  NSLog(@"StreamManager event (%@).", event.typeString);
  switch (event.type) {
    case kIMAAdEvent_STARTED: {
      // Log extended data.
      NSString *extendedAdPodInfo = [[NSString alloc]
          initWithFormat:@"Showing ad %zd/%zd, bumper: %@, title: %@, description: %@, contentType:"
                         @"%@, pod index: %zd, time offset: %lf, max duration: %lf.",
                         event.ad.adPodInfo.adPosition, event.ad.adPodInfo.totalAds,
                         event.ad.adPodInfo.isBumper ? @"YES" : @"NO", event.ad.adTitle,
                         event.ad.adDescription, event.ad.contentType, event.ad.adPodInfo.podIndex,
                         event.ad.adPodInfo.timeOffset, event.ad.adPodInfo.maxDuration];

      NSLog(@"%@", extendedAdPodInfo);
      break;
    }
    case kIMAAdEvent_AD_BREAK_STARTED: {
      // Prevent user seek through when an ad starts and show the ad controls.
      self.adContainerView.hidden = NO;
      break;
    }
    case kIMAAdEvent_AD_BREAK_ENDED: {
      // Allow user seek through after an ad ends and hide the ad controls.
      self.adContainerView.hidden = YES;
      break;
    }
    default:
      break;
  }
}

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdError:(IMAAdError *)error {
  // Fall back to playing the backup stream.
  NSLog(@"StreamManager error: %@", error.message);
  [self playBackupStream];
}

@end

Vậy là xong! Giờ đây, bạn đang yêu cầu và hiển thị quảng cáo thông qua SDK IMA DAI. Để tìm hiểu về các tính năng SDK nâng cao khác, hãy xem các hướng dẫn khác hoặc mẫu trên GitHub.