2) iOS
아래 API 호출을 위해서는 우선 TnkAd SDK 관련 설정이 필요합니다.
[iOS Settings] 내용을 우선 확인해 주세요.
- 2015.05.19 : SDK v4.0 부터 전면광고 용 API가 아래와 같이 변경되었습니다. 구 API는 계속 제공되지만 기능 업데이트는 더 이상 되지 않으므로 꼭 새로운 API를 적용해주시기 바랍니다.
[TnkInterstitialAd 객체]
전면광고를 띄우는 작업은 1) TnkInterstitialAd 객체 생성, 2) prepare 호출 3) show 호출 의 3단계를 통해서 이루어 집니다. 아래는 비보상 전면 광고를 띄우기 위한 가장 간단한 예제입니다.
TnkInterstitialAd
@implementation ViewController {
TnkInterstitialAd *tnkInterstitial;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 1) 전면광고 용 객체 생성
tnkInterstitial = [[TnkInterstitialAd alloc] init];
// 2) 전면광고 요청
[tnkInterstitial prepare];
// 3) 전면광고 화면의 띄우기
[tnkInterstitial show];
}
만약 보상형 전면광고를 띄우고자 할 경우에는 prepare 호출시 TNK_PPI 파라메터를 전달하시면 됩니다.
Incentive Ad Sample
@implementation ViewController {
TnkInterstitialAd *tnkInterstitial;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 1) 전면광고 용 객체 생성
tnkInterstitial = [[TnkInterstitialAd alloc] init];
// 2) 전면광고 요청 (보상형 전면광고)
[tnkInterstitial prepare:TNK_PPI];
// 3) 전면광고 화면의 띄우기
[tnkInterstitial show];
}
[Display Logic]
보상형 또는 비보상형 전면 광고를 앱 내에 고정하여 코딩하시는 경우 해당 전면광고를 제어할 수 있는 방법이 없으므로 보다 효과적으로 관리하기 위하여 Display Logic을 사용하실 것을 권장합니다. Display Logic 을 사용하시려면 로직 명칭을 prepare 호출시 파라메터로 전달합니다.
Display Logic을 사용하시면 전면 광고 노출기간, 빈도수, 광고의 종류 등을 자유롭게 제어하실 수 있습니다. 또한 타사와 크로스 광고를 진행하시고자 할 경우에는 Display Logic을 반드시 적용하여야 합니다. 자세한 내용은 5) Display Logic 을 참고하세요.
Display Logic Sample
@implementation ViewController {
TnkInterstitialAd *tnkInterstitial;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 1) 전면광고 용 객체 생성
tnkInterstitial = [[TnkInterstitialAd alloc] init];
// 2) 전면광고 요청 (Display Logic 지정)
[tnkInterstitial prepare:@"cross_first"];
// 3) 전면광고 화면의 띄우기
[tnkInterstitial show];
}
[Delegate 이용하기]
전면광고의 로딩이 완료되거나 사용자가 전면광고 화면을 닫는 경우 해당 이벤트 발생시점에 필요한 로직을 구현하기 위해서
아래의 TnkInterstitialDelegate 프로토콜을 이용할 수 있습니다.
TnkInterstitialDelegate protocol
// Interstitial TnkAdViewDelegate 관련 상수값 정의
#define AD_CLOSE_SIMPLE 0 // 사용자가 닫기버튼을 눌러서 광고화면을 닫은 경우
#define AD_CLOSE_CLICK 1 // 사용자가 광고를 클릭해서 화면이 닫히는 경우
#define AD_FAIL_NO_AD -1 // no ad available
#define AD_FAIL_NO_IMAGE -2 // ad image not available
#define AD_FAIL_TIMEOUT -3 // ad arrived after 5 secs.
#define AD_FAIL_CANCEL -4 // ad frequency settings
#define AD_FAIL_NOT_PREPARED -5 // not prepared
#define AD_FAIL_SYSTEM -9
#define TNK_PPI @"__tnk_ppi__"
#define TNK_CPC @"__tnk_cpc__"
@protocol TnkInterstitialDelegate <NSObject>
@optional
// 전면광고 화면 닫힐 때 호출됩니다. 해당 객체와 화면이 닫히는 이유를 파라메터로 전달해 줍니다.
- (void)didInterstitialClose:(TnkInterstitialAd *)ad close:(int)type;
// 전면 광고를 화면에 띄우지 못했을 경우 호출됩니다.
// 시스템 오류나 광고가 없어서 광고를 띄우지 못했을 경우,
// 광고가 늦게 도착하여 광고가 뜨지 않은 경우 등 해당 사유가 파라메터로 전달됩니다.
- (void)didInterstitialFail:(TnkInterstitialAd *)ad error:(int)errCode;
// 전면광고 화면이 나타나는 시점에 호출됩니다.
- (void)didInterstitialShow:(TnkInterstitialAd *)ad;
// 전면 광고 prepare: API 호출 후 show: API 호출 전에 광고가 도착하면 호출됩니다.
// 만약 광고 도착 전에 show: API 가 먼저 호출된 경우에는 나중에 광고가 도착하였을 때
// 바로 광고가 표시되고 didInterstitialShow:가 호출됩니다.
- (void)didInterstitialLoad:(TnkInterstitialAd *)ad;
@end
TnkInterstitialDelegate는 prepare 호출시 두번째 파라미터로 지정하거나 TnkInterstitialAd 객체에 별도로 지정할 수 있습니다.
아래의 예시는 TnkInterstitialDelegate를 사용하여 광고가 로딩되는 시점에 앱의 상태를 판단하여 광고를 띄울지 말지 결정하는 방식의 구현 예시입니다.
TnkAdViewDelegate Sample
#import "tnksdk.h"
@interface ViewController : UIViewController <TnkInterstitialDelegate> {
// ...
}
@end
@implementation ViewController {
TnkInterstitialAd *tnkInterstitial;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 1) 전면광고 용 객체 생성
tnkInterstitial = [[TnkInterstitialAd alloc] init];
// 2) 전면광고 요청 (Delegate 지정하여 호출함)
[tnkInterstitial prepare:@"cross_first" delegate:self];
}
#pragma mark - TnkInterstitialDelegate
- (void) didInterstitialLoad:(TnkInterstitialAd *)ad {
NSLog(@"Interstitial Loaded : %@", ad.logicName);
if (okToShow) {
// 전면광고를 화면에 띄운다.
[ad show];
}
}
[TnkInterstitialAd Interface]
TnkInterstitialAd Interface
@interface TnkInterstitialAd : NSObject <TnkServiceCallback>
@property (nonatomic, weak) UIViewController *viewControllerToShow;
@property (nonatomic, weak) id<TnkInterstitialDelegate> delegate;
@property (nonatomic, strong) NSString *logicName;
@property (nonatomic, assign) NSTimeInterval timeoutSec;
- (void) prepare;
- (void) prepare:(NSString *)logicName;
- (void) prepare:(NSString *)logicName delegate:(id<TnkInterstitialDelegate>) delegate;
- (void) show:(UIViewController *)viewController;
- (void) show;
@end
- properties
- prepare
Method
- (void) prepare
- (void) prepare:(NSString *)logicName
- (void) prepare:(NSString *)logicName delegate:(id<TnkInterstitialDelegate>)delegate
Description
전면광고를 서버에서 한건 로딩합니다. logicName 과 delegate 파라메터는 properties에 설명된 것과 같습니다.
전면광고가 로딩이 완료되면 delegate의 didInterstitialLoad: 가 호출되며
로딩이 실패하면 didInterstitialFail:error: 가 호출됩니다.
만약에 prepare 를 호출하고 로딩된 광고가 화면에 표시되기 전에 다시 prepare 를 호출하면 그 prepare는 무시됩니다.
- show
Method
- (void) show
- (void) show:(UIViewController *)viewController
Description
prepare 를 호출하여 로딩된 전면광고를 화면에 띄웁니다. viewController를 지정하면 viewController.view 에 전면광고를 띄우며, 지정하지 않은 경우에는 현재 UIWindow 를 이용하여 내부적으로 viewController 객체를 판단하여 띄웁니다.
전면광고가 화면에 나타나면 delegate의 didIntersititalShow: 가 호출되며,
전면광고가 닫히게 되면 didInterstitialClose:type: 이 호출됩니다. 이때 사용자가 닫기버튼을 클릭하여 닫혔는지(0, AD_CLOSE_SIMPLE) 또는 전면광고를 클릭하여 닫혔는지(1, AD_CLOSE_CLICK) 여부가 type 파라메터로 전달됩니다.
만약 이전에 prepare 를 호출하지 않은 상태에서 show를 호출하게되면 didInterstitialFail:error: 가 호출되며 errorCode는 -5(AD_FAIL_NOT_PREPARED) 가 전달됩니다.
또한 설정된 전면광고 노출 간격 시간 이내에 show가 호출되면 didInterstitialFail:error: 가 호출되며 이때 errorCode 는 -4 (AD_FAIL_CANCEL) 가 전달됩니다.
[화면 Orientation 처리]
화면의 방향을 세로 또는 가로로 고정하지 않은 경우 전면광고 노출된 상태에서 화면이 회전하게 되면 전면광고가 닫히도록 아래와 같이 코딩을 하셔야합니다.
화면 Orientation 처리
// for iOS 5,6,7
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[[TnkSession sharedInstance] removeCurrentInterstitialAd];
// 또는 아래와 같이 호출 (show 호출 방식에 맞추어 호출합니다.)
// [[TnkSession sharedInstance] removeCurrentInterstitialAd:self];
}
// for iOS 8,9
- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[[TnkSession sharedInstance] removeCurrentInterstitialAd];
// 또는 아래와 같이 호출 (show 호출 방식에 맞추어 호출합니다.)
// [[TnkSession sharedInstance] removeCurrentInterstitialAd:self];
}