IMA SDK를 사용하면 웹사이트와 앱에 멀티미디어 광고를 쉽게 통합할 수 있습니다. IMA SDK는 원하는 위치로 <ph type="x-smartling-placeholder"></ph> VAST 호환 광고 서버를 사용하고 앱에서 광고 재생을 관리할 수 있습니다. IMA DAI SDK를 사용하면 앱에서 광고 및 콘텐츠 동영상(VOD 또는 라이브 콘텐츠)에 대한 스트림 요청 그러면 SDK는 광고 동영상과 콘텐츠 동영상 간의 전환을 관리할 필요가 없습니다. 표시할 수 있습니다.
관심 있는 DAI 솔루션을 선택합니다
종합 서비스 DAI
이 가이드에서는 IMA DAI SDK를 간단한 동영상 플레이어 앱에 통합하는 방법을 보여줍니다. 완성된 샘플 통합을 보거나 따라 하려면 GitHub에서 BasicExample을 다운로드하세요.
IMA DAI 개요
IMA DAI를 구현하려면 가이드:
IMAAdDisplayContainer
: 동영상 재생 요소 위에 있고 광고 UI 요소를 포함하는 컨테이너 객체입니다.IMAAdsLoader
: 스트림을 요청하고 스트림 요청 응답 객체에 의해 트리거된 이벤트를 처리하는 객체입니다. 애플리케이션의 전체 수명 주기 동안 재사용할 수 있는 광고 로더는 하나만 인스턴스화해야 합니다.IMAStreamRequest
–IMAVODStreamRequest
또는IMALiveStreamRequest
: 스트림 요청을 정의하는 객체입니다. 스트림 요청은 VOD 또는 라이브 스트림일 수 있습니다. 요청은 콘텐츠 ID는 물론 API 키 또는 인증 토큰 및 기타 매개변수입니다.IMAStreamManager
: 동적 광고 삽입 스트림과 DAI 백엔드와의 상호작용을 처리하는 객체입니다. 이 스트림 관리자는 핑 추적을 처리하고 스트림 및 광고 이벤트를 있습니다.
기본 요건
시작하기 전에 다음이 필요합니다.
- Xcode 13 이상
- CocoaPods(권장), Swift Package Manager 또는 다운로드한 iOS용 IMA DAI SDK 사본
새 Xcode 프로젝트 만들기
Xcode에서 Objective-C를 사용하여 새 iOS 프로젝트를 만듭니다. BasicExample을 다음과 같이 사용합니다. 프로젝트 이름을 지정합니다
Xcode 프로젝트에 IMA DAI SDK 추가
다음 세 가지 방법 중 하나를 사용하여 IMA DAI SDK를 설치합니다.
CocoaPods를 사용하여 SDK 설치(권장)
CocoaPods는 Xcode 프로젝트의 종속 항목 관리자이며 IMA DAI SDK를 설치하는 데 권장되는 방법입니다. 설치 또는 관리 방법에 대한 자세한 내용은 자세한 내용은 CocoaPods 문서를 참조하세요. CocoaPods를 설치한 후 다음 안내에 따라 IMA DAI SDK를 설치합니다.
BasicExample.xcodeproj 파일과 동일한 디렉터리에 Podfile이라는 텍스트 파일을 만들고 다음 구성을 추가합니다.
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '14' target "BasicExample" do pod 'GoogleAds-IMA-iOS-SDK', '~> 3.23.0' end
Podfile이 포함된 디렉터리에서 다음을 실행합니다.
pod install --repo-update`
다음 명령어를 열어 설치가 완료되었는지 확인합니다. BasicExample.xcworkspace 파일을 열고 이 파일에 두 개가 포함되어 있는지 확인합니다. 프로젝트: BasicExample 및 Pods (Google에서 설치한 종속 항목) CocoaPods).
Swift Package Manager를 사용하여 SDK 설치
양방향 미디어 광고 SDK는 버전 3.18.4부터 Swift Package Manager를 지원합니다. Swift 패키지를 가져오려면 다음 단계를 따르세요.
Xcode에서 파일 > 패키지 추가를 참조하세요.
메시지가 표시되면 IMA DAI SDK Swift Package GitHub를 검색합니다. 저장소:
https://github.com/googleads/swift-package-manager-google-interactive-media-ads-ios
사용할 IMA DAI SDK Swift 패키지의 버전을 선택합니다. 새 프로젝트의 경우 Up to Next Major Version(최대 다음 메이저 버전)을 사용하는 것이 좋습니다.
완료되면 Xcode가 패키지 종속 항목을 확인하고 만들 수 있습니다. 패키지 종속 항목을 추가하는 방법에 관한 자세한 내용은 Apple 도움말을 참고하세요.
수동으로 SDK 다운로드 및 설치
Swift Package Manager 또는 CocoaPods를 사용하지 않으려면 IMA DAI SDK를 다운로드하여 프로젝트에 수동으로 추가하면 됩니다.
간단한 동영상 플레이어 만들기
먼저 기본 동영상 플레이어를 구현합니다. 처음에 이 플레이어는 IMA DAI SDK에는 재생을 트리거하는 메서드가 포함되어 있지 않습니다.
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
SDK를 가져오고 IMA 상호작용을 위한 스텁 추가
프로젝트에 IMA DAI SDK를 추가한 후 SDK를 가져오고 스텁을 추가합니다. 를 참조하세요.
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
IMAAdsLoader 구현
다음으로 IMAAdsLoader
를 인스턴스화하고 광고 컨테이너 뷰를
뷰 계층 구조
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;
}
스트림 요청
스트림 정보를 보유할 몇 개의 상수를 만든 다음 스트림 요청 함수를 사용하여 요청을 수행합니다.
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];
}
스트림 이벤트 처리
IMAAdsLoader
및 IMAStreamManager
는
초기화, 오류, 스트림 상태 변경이 포함됩니다. 이러한 이벤트는 IMAAdsLoaderDelegate
및 IMAStreamManagerDelegate
프로토콜을 통해 실행됩니다. 광고 로드 이벤트를 수신하고 스트림을 초기화합니다. 광고가 로드되지 않으면 대신 백업 스트림을 재생합니다.
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
로깅 및 오류 이벤트 처리
스트림 관리자 대리자가 처리할 수 있는 이벤트는 여러 가지 있지만 기본 구현의 경우 가장 중요한 용도는 이벤트 로깅을 실행하고, 광고가 재생되는 동안 탐색 작업을 방지하며, 오류를 처리하는 것입니다.
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
작업이 끝났습니다. 이제 IMA DAI SDK를 사용하여 광고를 요청하고 표시합니다. 받는사람 고급 SDK 기능에 대해 알아보려면 다른 가이드 또는 GitHub의 샘플