버전 | 내용 |
---|---|
5.1.6 (2020.11.12) |
초기 메인 뷰 컨트럴러에서 초기화 가능, 성공 콜백 추가 |
5.1.5 (2020.11.09) |
AppDelegate 초기화 미 호출시, Exception 발생 |
5.1.4 (2020.10.15) |
Dynamic Framework (xcFramework 로 변경) |
5.1.2 (2020.07.24) |
UIWebView -> WKWebView 전환 (AppDelegate 에 초기화 함수 호출 추가) |
5.1.1 (2020.01.20) |
전면배너 iOS 13 Present FullScreen 수정 |
5.1.0.0 (2019.08.20) |
300*250 (하프 배너) 광고 영역 추가 SDK 내부 개선 |
5.0.0.2 (2019.04.05) |
SDK 내부 개선 |
5.0.0.0 (2018.06.08) |
Bitcode 지원 미디에이션 워터폴 방식 변경(광고 노출 성공하는 경우 스케쥴 index 초기화) 중지된 미디에이션 삭제 샘플 프로젝트 업데이트 |
애드립 iOS SDK를 사용하여 애드립 광고를 노출하는 방법을 제공합니다.
또한 기타 광고 플랫폼을 사용하여 미디에이션 기능을 사용하는 방법을 제공합니다.
각 플랫폼의 SDK 버전은 API call 방식이 변경되지 않는한 기존의 애드립 SubView를 통해 상위, 하위 호환이 가능합니다. 실제로 각 플랫폼의 마이너 버전 업데이트가 일어나더라도 애드립 구현부의 변경없이 업데이트 된 SDK 만 새롭게 적용하면 그대로 사용가능하며, 최소한의 구현부 수정으로 큰 수정없이 적용할 수 있도록 구성되었습니다.
플랫폼 | 버전 | SDK 다운로드 | 지원광고형식 |
---|---|---|---|
Admixer | v2.1.0 | 다운로드 | 띠배너 / 전면배너 |
Adfit(Adam) | v3.7.0 | 다운로드 | 띠배너 / 전면배너 / 하프배너 |
Admob | v7.66.0 | 다운로드 | 띠배너 / 전면배너 / 하프배너 |
Cauly | v3.1.11 | 다운로드 | 띠배너 / 전면배너 |
v6.0.0 | 다운로드 | 띠배너 / 전면배너 | |
Inmobi | v9.1.0 | 다운로드 | 띠배너 / 전면배너 |
iOS9 ATS(App Transport Security) 처리. iOS9 이후 부터 ATS(App Transport Security) 기능이 기본으로 설정됩니다.
Application Info.plist 파일의 해당 항목을 설정을 하지않을 경우 광고가 차단되어 정상적으로 노출되지 않을 수 있습니다.
(현재 애드립과 연동된 모든 플랫폼이 https를 지원하지 않는 상황으로 해당 설정이 반드시 필요합니다.)
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Enable Bitcode = YES
ADLibFramework 폴더를 프로젝트에 추가합니다.
해당 폴더에는 애드립 SDK 연동에 필요한 파일들을 포함되어있습니다. (Adlib.xcframework 파일 및 리소스 파일)
Adlib.xcframework - (Embed & Sign)
미디에이션을 사용할 경우 프로젝트에 추가 후 사용하실 미디에이션 플랫폼 어뎁터를 제외하고 나머지 파일들은 제거합니다.
미디에이션을 사용할 경우 프로젝트에 추가할 광고 플랫폼의 라이브러리 파일을 추가합니다.
Ex.) GoogleMobileAds.framework
Project - Build Settings 항목에 Other Linker Flags 추가가 필요합니다. Linking - Other Linker Flags 항목에 -ObjC 를 추가합니다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[ADLibSDK config:self.window];
// ....
return YES;
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
ADLibSDK.config(self.window)
// ....
return true
}
해당 뷰 컨트럴러에서 광고를 바로 띄우고 싶을 때
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[ADLibSDK config:self.view delegate:self];
...
}
#pragma ALAdSetConfigDelegate
- (void)setConfigSuccess
{
[_bannerView setIsTestMode:YES];
[_bannerView setRepeatLoop:YES];
[_bannerView setRepeatLoopWaitTime:5];
[_bannerView setBannerSize:AL_SIZE_BANNER];
[_bannerView startAdViewWithKey:@"5af500b384ae8f4bb4f8ab2e" rootViewController:self adDelegate:self];
}
@end
override func viewDidLoad() {
super.viewDidLoad()
ADLibSDK.config(self.view, delegate: self)
...
}
extension ViewController: ALAdSetConfigDelegate {
func setConfigSuccess() {
bannerView.isTestMode = true
bannerView.repeatLoop = true
bannerView.repeatLoopWaitTime = 5
bannerView.bannerSize = .BANNER
bannerView.startAdView(withKey: "5af500b384ae8f4bb4f8ab2e", rootViewController: self, adDelegate: self)
}
}
애드립 배너를 연동할 ViewController에 애드립 배너 delegate를 선언하고, 애드립 배너 객체들을 선언합니다.
#import "AdlibSampleController.h"
#import <Adlib/Adlib.h>
#define ADLIB_APP_KEY @"5af500b384ae8f4bb4f8ab2e" //TestKey
@interface AdlibSampleController () <ALInterstitialAdDelegate, ALAdBannerViewDelegate>
@property (nonatomic) IBOutlet ALAdBannerView *bannerView;
@property (nonatomic, strong) ALInterstitialAd *interstitialAd;
@end
@implementation AdlibSampleController
...
@end
import Adlib
광고를 호출할 시점에 하단 코드처럼 요청 시작 메소드를 호출합니다.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
//테스트 모드를 설정할 수 있습니다.
_bannerView.isTestMode = YES;
//광고 호출 완료 후 설정된 시간 이후 자동 갱신 요청 여부를 설정합니다.
_bannerView.repeatLoop = NO;
/**
* 배너 광고를 요청한다.
* 요청한 애드립 키값에 해당하는 띠배너 광고 플랫폼들에 대해서 순차적으로 광고를 요청하고 성공/실패 시 콜백을 호출한다.
*
* @param key : 애드립 앱키
* @param rootViewController : 광고를 호출하는 뷰컨트롤러
* @param delegate : 광고 요청 및 수신 상태에 대한 델리게이트
*/
[_bannerView startAdViewWithKey:ADLIB_APP_KEY
rootViewController:self
adDelegate:self];
}
...
bannerView.isTestMode = true
bannerView.repeatLoop = true
bannerView.repeatLoopWaitTime = 5
bannerView.bannerSize = .BANNER
bannerView.startAdView(withKey: "5af500b384ae8f4bb4f8ab2e", rootViewController: self, adDelegate: self)
...
광고 호출을 중단할 시점에 하단 코드처럼 메소드를 호출합니다.
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[_bannerView stopAdView];
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
bannerView.stopAdView()
}
ALAdBannerViewDelegate 프로토콜을 구현한 delegate를 아래와 같이 구현하고, 광고 수신 성공 / 실패 여부를 확인할 수 있습니다.
/**
* 띠 배너 광고요청 재개 상태에서 내부적인 상태 변화를 통지합니다.
*/
- (void)alAdBannerView:(ALAdBannerView *)bannerView didChangeState:(ALMEDIAION_STATE)state withExtraInfo:(id)info
{
NSLog(@"bannerView state : %@, info = %@", [ALMediationDefine descriptionOfState:state], info);
}
/**
* 플랫폼에 요청한 띠배너 광고의 성공 상태를 반환합니다.
*/
- (void)alAdBannerView:(ALAdBannerView *)bannerView didReceivedAdAtPlatform:(ALMEDIATION_PLATFORM)platform
{
NSLog(@"bannerView receivedAd : %@", [ALMediationDefine nameOfPlatform:platform]);
}
/**
* 플랫폼에 요청한 띠배너 광고의 실패 상태를 반환합니다.
*/
- (void)alAdBannerView:(ALAdBannerView *)bannerView didFailedAdAtPlatform:(ALMEDIATION_PLATFORM)platform
{
NSLog(@"bannerView failedAd : %@", [ALMediationDefine nameOfPlatform:platform]);
}
/**
* 플랫폼에 요청한 띠배너 광고의 실패 상태를 반환합니다.
* 반환값 BackFill 뷰 사용여부, 모든 플랫폼 광고요청이 실패한 경우 노출할 뷰를 지정하여 사용할 수 있습니다.
*/
- (BOOL)alAdBannerViewDidFailedAtAllPlatform:(ALAdBannerView *)bannerView
{
NSLog(@"bannerView failed all-platform");
//해당 델리게이트에서 애드립 플랫폼에 등록된 광고의 모두 실패 상태를 처리할 수 있습니다.
//등록된 플랫폼 스케쥴이 (애드립, 애드몹, 애드핏)인 경우 각 각 요청 후 모두 실패한 케이스의 상황
//해당 상황에 특별한 처리를 하지 않으면 광고 영역이 공백으로 노출될 수 있으며 뷰의 repeatLoop의 값에 따라
//일정 시간 (초)대기후 첫 플랫폼 부터 재호출 되거나 요청이 더이상 발생하지 않는 상태로 남아있다.
return YES;
}
기본적으로는 위에서 설명한 애드립 띠배너 요청과 동일하나 추가로 배너 사이즈 설정 코드가 필요합니다.
_bannerView.bannerSize = AL_SIZE_HALF; // 하프 배너 설정
bannerView.bannerSize = .HALF
전면광고를 요청할 시점에 다음과 같이 처리합니다.
- (IBAction)requestIntersAd:(id)sender
{
ALInterstitialAd *interstitialAd = [[ALInterstitialAd alloc] initWithRootViewController:self];
self.interstitialAd = interstitialAd;
interstitialAd.isTestMode = YES;
[_interstitialAd requestAdWithKey:ADLIB_APP_KEY adDelegate:self];
}
private lazy var interstitialAd: ALInterstitialAd = {
let ad = ALInterstitialAd(rootViewController: self)
return ad!
}()
private func doInterstitlaRequst() {
interstitialAd.isTestMode = true
interstitialAd .request(withKey: "5bd7ff5284ae90a4b4ccda8d", adDelegate: self)
}
전면광고 요청 도중 취소하기 위해서는 아래와 같이 처리합니다.
- (void)cancelInterstitialAdRequest
{
if (_interstitialAd) {
[_interstitialAd stopAdReqeust];
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
interstitialAd.stopReqeust()
}
ALInterstitialAdDelegate 프로토콜을 구현한 delegate를 아래와 같이 구현하고, 광고 수신 성공 / 실패 여부를 확인할 수 있습니다.
/**
* 전면광고 요청이 성공에 대한 알림
*/
- (void)alInterstitialAd:(ALInterstitialAd *)interstitialAd didReceivedAdAtPlatform:(ALMEDIATION_PLATFORM)platform
{
NSLog(@"didReceivedAdAtPlatform : %zd", platform);
}
/**
* * 전면광고 요청 실패에 대한 알림
*/
- (void)alInterstitialAd:(ALInterstitialAd *)interstitialAd didFailedAdAtPlatform:(ALMEDIATION_PLATFORM)platform
{
NSLog(@"didFailedAdAtPlatform : %zd", platform);
}
/**
* 모든 전면광고 요청 실패에 대한 알림
*/
- (void)alInterstitialAdDidFailedAd:(ALInterstitialAd *)interstitialAd
{
NSLog(@"alInterstitialAdDidFailedAd");
}
미디에이션을 연동하기 위해서는 위 애드립 광고 연동과 동일과정을 수행하나 추가로 미디에이션 플랫폼 등록 및 해당 플랫폼에 필요한 광고 키 값을 등록하는 추가 과정이 필요합니다.
사용할 미디에이션 플랫폼에 해당하는 어뎁터 클래스를 선언하고, 해당 플랫폼에서 발급 받은 광고 키값을 미리 정의합니다.
#import "MediationSampleController.h"
#import <Adlib/ADLibBanner.h>
#import "ALAdapterAdmob.h"
#import "ALAdapterCauly.h"
//애드립의 키값을 설정합니다.
#define ADLIB_APP_KEY @"54caefb80cf28dexxxxxxxxx" //adlib, admob, cauly
// ADMOB의 APP 아이디를 설정합니다.
#define ADMOB_ID @"ca-app-pub-2656860633xxxxx/28382xxxx"
#define ADMOB_INTERSTITIAL_ID @"ca-app-pub-xxxxxx"
// CAULY의 키값을 설정합니다.
#define CAULY_ID @"CAULY"
@interface MediationSampleController () <ALInterstitialAdDelegate, ALAdBannerViewDelegate>
@property (nonatomic) IBOutlet ALAdBannerView *bannerView;
@property (nonatomic, strong) ALInterstitialAd *interstitialAd;
@end
@implementation MediationSampleController
- (void)viewDidLoad {
[super viewDidLoad];
[ALMediation registerPlatform:ALMEDIATION_PLATFORM_DEFAULT withClass:nil];
// 미디에이션 플랫폼 등록
[ALMediation registerPlatform:ALMEDIATION_PLATFORM_ADMOB withClass:[ALAdapterAdmob class]];
[ALMediation registerPlatform:ALMEDIATION_PLATFORM_FACEBOOK withClass:[ALAdapterFacebook class]];
[ALMediation registerPlatform:ALMEDIATION_PLATFORM_ADAM withClass:[ALAdapterAdfit class]];
[ALMediation registerPlatform:ALMEDIATION_PLATFORM_CAULY withClass:[ALAdapterCauly class]];
[ALMediation registerPlatform:ALMEDIATION_PLATFORM_INMOBI withClass:[ALAdapterInmobi class]];
[ALAdapterInmobi initializeInmobiSDK:INMOBI_ACCOUNTID_TEST_KEY];
[ALMediation registerPlatform:ALMEDIATION_PLATFORM_ADMIXER withClass:[ALAdapterAdMixer class]];
[ALAdapterAdMixer initializeAdMixer];
}
@end
기본적으로는 위에서 설명한 애드립 띠배너 요청과 동일하나 추가로 광고 키값 설정 코드가 필요합니다.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[_bannerView setIsTestMode:YES];
[_bannerView setRepeatLoop:YES];
[_bannerView setRepeatLoopWaitTime:5];
[_bannerView setBannerSize:AL_SIZE_BANNER];
// 미디에이션 플랫폼 띠배너 키설정
[_bannerView setKey:ADMOB_BANNER_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_ADMOB];
[_bannerView setKey:FACEBOOK_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_FACEBOOK];
[_bannerView setKey:ADAM_BANNER_TEST_ID forPlatform:ALMEDIATION_PLATFORM_ADAM];
[_bannerView setKey:CAULY_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_CAULY];
[_bannerView setKey:INMOBI_BANNER_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_INMOBI];
[_bannerView setKey:ADMIXER_BANNER_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_ADMIXER];
[_bannerView startAdViewWithKey:ADLIB_APP_KEY
rootViewController:self
adDelegate:self];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[_bannerView stopAdView];
}
기본적으로는 위에서 설명한 애드립 하프배너 요청과 동일하나 추가로 광고 키값 설정 코드가 필요합니다.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// 미디에이션 플랫폼 하프배너 키설정
[_bannerView setKey:ADMOB_BANNER_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_ADMOB];
[_bannerView setKey:ADAM_HALF_BANNER_TEST_ID forPlatform:ALMEDIATION_PLATFORM_ADAM];
[_bannerView setIsTestMode:YES];
[_bannerView setRepeatLoop:NO];
[_bannerView setBannerSize:AL_SIZE_HALF]; // 하프 배너 설정
[_bannerView startAdViewWithKey:ADLIB_APP_KEY
rootViewController:self
adDelegate:self];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[_bannerView stopAdView];
}
기본적으로는 위에서 설명한 애드립 전면 배너 요청과 동일하나 추가로 광고 키값 설정 코드가 필요합니다.
- (IBAction)requestIntersAd:(id)sender
{
ALInterstitialAd *interstitialAd = [[ALInterstitialAd alloc] initWithRootViewController:self];
self.interstitialAd = interstitialAd;
[_interstitialAd setIsTestMode:YES];
//미디에이션 플랫폼 전면배너 키설정
[_interstitialAd setKey:ADMIXER_INTERSTITIAL_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_ADMIXER];
[_interstitialAd setKey:ADMOB_INTERSTITIAL_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_ADMOB];
[_interstitialAd setKey:FACEBOOK_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_FACEBOOK];
[_interstitialAd setKey:CAULY_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_CAULY];
[_interstitialAd setKey:INMOBI_INTERSTITIAL_TEST_KEY forPlatform:ALMEDIATION_PLATFORM_INMOBI];
[_interstitialAd requestAdWithKey:ADLIB_APP_KEY
adDelegate:self];
}