Mediation 개발 가이드 (iOS)

1. ADLIB Mediation(수익 최적화) 개요

실제 프로젝트환경에 SDK 적용을 위한 문서입니다.
SDK 다운 및 API 키 발급은 애드립 홈페이지를 통해 진행해주시기 바랍니다.
https://mkt.adlibr.com/adn/dashboard.jsp

애드립을 통해 사용할 플랫폼은 프로젝트에서 선택적으로 포함하여 최종 바이너리 크기를 줄일 수 있습니다.
실제 테스트 프로젝트를 컴파일 하기 위하여 각 플랫폼 사이트에서 발급 받은 APP-ID 및 각 OS에 맞는 최신 SDK가 별도로 필요합니다.

기본적으로 테스트 프로젝트는 각 플랫폼의 SDK 파일만 새로 링크하면 동작하도록 제작되었으며,
실제 플랫폼의 SDK 작동방식이 변하지 않는 한 SubAdView 구현 파일의 내용을 수정할 필요는 없습니다.

개발 권장사항
  • Xcode 7.0 이상
  • Base SDK 9.0 이상
  • iOS Deployment Target 6.1 이상

2. 컴파일을 위한 준비

xcode 7.0 이상 iOS 9 빌드

  • 앱과 웹 서비스 간 연결 보안을 강화하는 ATS(App Transport Security) 기능 활성화가 기본으로 설정 됩니다.
  • 애드립에서 사용하는 HTTP 연결 요청이 강제 차단되어 광고가 노출되지 않을 수 있으니 하단 내용을 어플리케이션 info.plist 파일에 적용하여 사용 부탁드립니다.


» 단계1

애드립 SDK를 사용하기 위해 필요한 프레임워크를 프로젝트에 추가합니다.

* SDK 4.1.0.0 버전 이상을 사용하시는 경우 3D 광고 지원을 위해 "libstdc++.6.0.9"를 추가합니다.


하위 버전 xcode 사용시 다음 프레임워크도 추가합니다.

- OpenGLES.framework

- CoreGraphics.framework

- Foundation.framework

- UIKit.framework

- AVFoundation.framework

- QuartzCore.framework

- AudioToolbox.framework

» 단계2

SDK 4.1.0.0 버전 이상을 사용하시는 경우 프로젝트에 애드립 SDK에서 사용하는 리소스 파일을 추가합니다.


- Adlib.bundle : 애드립에서 사용하는 버튼 이미지 파일이 포함되어있습니다.

- lua 파일 : 3D 광고에 필요한 리소스 파일로 해당 파일들이 포함되지 않으면, 3D 광고를 노출 할 수 없습니다.




프로젝트 Build Phases - Copy Bundle Reources 항목에 아래와 같이

리소스 파일들이 정상적으로 추가되었는지 확인합니다.

» 단계3

프로젝트 Build Settings 탭에 하단 이미지처럼 Linker Flag를 추가합니다.

-ObjC (대소문자 구분 입력)

-lstdc++ (SDK v.4.1.0.0 이상 사용 시 하위 버전 xcode를 사용하신다면 해당 Flag를 추가합니다.)

» 단계4

사용할 광고 플랫폼의 SDK 파일을 하단 이미지의 위치에 추가합니다.

» 단계5

프로젝트 하단 이미지 위치에 사용할 광고 플랫폼의 SubAdlibView 파일들을 추가합니다.
라이브러리 추가와 마찬가지로 실제 사용할 클래스만 선택 포함하여 최종 파일의 크기를 줄일 수 있습니다.

3. 실제 프로젝트 연동

프로젝트를 열어 아래와 같이 속성을 확인합니다.

3-1. 애드립 SDK 사용 초기화

  • 먼저 애드립에서 발급받은 API-KEY를 연결합니다.
  • 실제 광고 구현 Class를 애드립에 위와 같이 연결합니다.
  • 개발 버전과 사용 버전의 link Method를 호출해 연결합니다.
  • 선택적으로 adlib sessionDelegate를 설정해 연결 성공, 실패를 확인할 수 있습니다.
    #import "AppDelegate.h"
    #import <Adlib/Adlib.h>


    #define ADLIB_API_KEY @"--- --- ---- ----" // 애드립에서 발급받은 키를 입력해주세요.

    @implementation AppDelegate

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

          [self initializeAdlib];
          return YES;
    }

    - (void)initializeAdlib
    {
          NSString* adlibKey = ADLIB_APP_KEY;

          AdlibManager *sharedManager = [AdlibManager sharedSingletonClass];
          sharedManager.sessionDelegate = self;

          //SDK 로그 메시지를 출력하도록 설정
          [sharedManager setLogging:NO];

          #warning 배포이전에 하단 코드 확인하기.
          BOOL isTestMode = YES;

          if (isTestMode)
          {
              //개발 버전에서 사용하는 세션 연결
              [sharedManager testModeLinkWithAdlibKey:adlibKey];
          }
          else
          {
              //배포 버전에서 사용하는 세션 연결
              [sharedManager linkWithAdlibKey:adlibKey];
          }
    }

    //애드립 세션 연결 성공 시 호출되는 메소드.
    - (void)adlibManager:(AdlibManager *)manager didLinkedSessionWithUserInfo:(NSDictionary *)userInfo
    {
          NSLog(@"adlib session linked");
    }

    //애드립 세션 연결 실패 시 호출되는 메소드.
    - (void)adlibManager:(AdlibManager *)manager didFailedSessionLinkWithError:(NSError *)error
    {
          NSLog(@"adlib session link failed");
    }

    @end
    

3-2. 띠배너 연동

자세한 구현 사항은 아래의 링크에서 확인하세요.
https://github.com/mocoplex/adlibr-SDK-ios/blob/master/adlibrTestUniversal/adlibrSample_New/README.md

3-2-1) 뷰 컨트롤러에 초기화


  • 애드립 미디에이션 광고뷰를 올릴 컨테이너 뷰를 생성하여 해당 UIViewController view의 특정 위치에 지정합니다. (해당 과정은 코딩 혹은 Nib파일처리 모두 가능합니다.)

      #import "MediationBannerViewController.h"
      #import <Adlib/ADLibBanner.h>

      @interface MediationBannerViewController () <ALAdBannerViewDelegate>

      @property (nonatomic, strong) ALAdBannerView *bannerView;

      @end

      @implementation MediationBannerViewController

      - (void)viewDidLoad
      {
           [super viewDidLoad];

            //1. 광고 컨테이너뷰 생성 및 뷰에서의 위치 설정
            [self loadBannerContainerView];
      }

      - (void)loadBannerContainerView
      {
            if (_bannerView == nil){
        
                //배너뷰를 생성하고 초기화 설정을 합니다.
                _bannerView = [[ALAdBannerView alloc] initWithFrame:_bannerContainerView.bounds];
        
                //테스트 모드를 설정할 수 있습니다.
                _bannerView.isTestMode = YES;
        
                //광고 호출 완료 후 설정된 시간 이후 자동으로 다음 광고호출 갱신여부를 설정합니다.
                //화면 전환시 에만 최초 1회 광고를 호출하려면 NO를 설정합니다.
                //YES로 설정된 경우 화면에서 유지될 경우 일정 시간 이후 다음 광고를 자동으로 내부에서 호출하여 갱신합니다.
                _bannerView.repeatLoop = NO;
            }
    
            if (_bannerView.superview == nil) {
                [_bannerContainerView addSubview:_bannerView];
            }
      }

      @end
      

3-2-2) 광고뷰 호출 시작 / 광고뷰 호출 중단

  • ViewController에서 광고를 호출 및 호출 중단 처리를 처리합니다.
      @implementation MediationBannerViewController

      - (void)viewWillAppear:(BOOL)animated
      {
            [super viewWillAppear:animated];

            /**
             *  배너 광고를 요청한다.
             *  요청한 애드립 키값에 해당하는 띠배너 광고 플랫폼들에 대해서 순차적으로 광고를 요청하고 성공/실패 시 콜백을 호출한다.
             *
             *  @param key : 애드립 앱키
             *  @param rootViewController : 광고를 호출하는 뷰컨트롤러
             *  @param delegate : 광고 요청 및 수신 상태에 대한 델리게이트
             */
            [_bannerView startAdViewWithKey:ADLIB_APP_KEY
                         rootViewController:self
                                 adDelegate:self];
      }

      - (void)viewWillDisappear:(BOOL)animated 
      {
           [super viewWillDisappear:animated];

           [_bannerView stopAdView];
      }

      @end
      

3-2-3) 광고 뷰 회전시 영역 조정

  • 해당 ViewController의 view layout 변경 시 bannerContainerView의 위치 및 크기를 재 조정합니다. (AutoLayout을 사용하거나 StoryBoard에서 처리로 대체 할 수 있습니다.)
  • 광고뷰의 위치는 bannerContainerView의 위치를 조정하여 변경 할 수 있으며 adConatinerView의 크기를 변경에 대응하여 조정됩니다. 최소 가로 320, 세로 50 이상을 권장합니다. 가로 너비의 경우 플랫폼에서 지원 할 경우 320 이상의 크기로 지정되어도 크기가 반영되어 광고가 노출됩니다.
      @implementation MediationBannerViewController

      - (void)viewDidLayoutSubviews
      {
          [super viewDidLayoutSubviews];

          if (_bannerView) {
                _bannerView.frame = _bannerContainerView.bounds;
          }
      }

      @end
      

3-2-4) 전면광고 요청

  • 전면광고를 노출하고 싶은 시점에 하단 코드를 호출합니다.

      @implementation MediationBannerViewController

      // 미디에이션에 등록된 플랫폼들에 대해 전면광고 요청을 수행합니다.
      // 설정된 스케쥴 순서에 따라 요청되며 실제 전면 광고 호출은
      // ADLibAdapter Class에서 처리됩니다.
      - (IBAction)loadInterstitialAd:(UIButton *)button
      {
          ALInterstitialAd *interstitialAd = [[ALInterstitialAd alloc] initWithRootViewController:self];
          self.interstitialAd = interstitialAd;
    
          interstitialAd.isTestMode = YES;
    
          [_interstitialAd requestAdWithKey:ADLIB_APP_KEY adDelegate:self];
      }

      @end
      

3-2-5) 플랫폼 광고 처리

미디에이션 배너에 사용되는 플랫폼 광고 뷰 객체.

해당 플랫폼 객체에서 띠 배너와 전면광고에 대한 처리를 수행합니다.




  • 사진의 해당 위치에 미디에이션 배너를 사용할 플랫폼 광고 관련 소스 및 라이브러리 파일을 추가합니다.
  • ADLibAdapter 폴더 안에 각 광고뷰에 대한 구현 소스가 들어 있으며, 필요에 의해 추가된 구현으로 더 다양한 기능 구현이 가능합니다. 해당 객체는 ALMediation 클래스와 띠배너 / 전면배너 구현 프로토콜을 상속 받아 구현됩니다. (필수 사항)

Google AdMob 연동 예제 - confirmed compatible with admob SDK 7.0.0

자세한 구현 사항은 아래의 링크에서 확인하세요.
https://github.com/mocoplex/adlibr-SDK-ios/blob/master/adlibrTestUniversal/adlibrSample_New/ADLibSample/ADLibAdapter/ALAdapterAdmob.m


4. 띠배너 미디에이션 설정

개발자 사이트에서 사용하실 광고 플랫폼의 띠 배너 스케쥴을 설정 할 수 있습니다.

-사이트 링크: https://mkt.adlibr.com/ssp/dashboard.jsp


5. 전면 배너 호출 유형 및 설정

5-1) 자동 노출

대쉬보드에서 시작시 노출을 활성화 시키면, 아무런 구현 없이 해당 시점에 전면 배너가 노출됩니다.


계속 노출 / 하루에 한번 만 노출하기 설정을 통해 전면 배너 자동 노출 빈도를 설정 할 수 있습니다.

단, 자동 노출 기능은 애드립에서 제공하는 전면 배너 노출만 가능합니다.



5-2) 직접 호출

- 전면 배너를 직접 호출하기 위해서는 아래 코드를 사용합니다.

    @implementation ViewController

    // 미디에이션에 등록된 플랫폼들에 대해 전면광고 요청을 수행합니다.
    // 설정된 스케쥴 순서에 따라 요청되며 실제 전면 광고 호출은
    // SubAdlibAdView Class에서 처리됩니다.
    - (IBAction)loadInterstitialAd:(UIButton *)button
    {
    [[AdlibManager sharedSingletonClass] loadInterstitialAd:self
                                       withDelegate:self];
    }

    @end
    

- 전면 광고 미디에이션 설정


- 대쉬보드에서 전면배너 스케쥴링을 설정할 수 있습니다.

- 애드립 전면광고 노출 비중을 0~100 사이로 설정 할 수 있습니다.

- 애드립 전면광고 수신에 실패하면 설정된 플랫폼 순서대로 다음 전면광고를 호출합니다.

6. Native 광고 설정

6-1) Layout 구성요소

Native AD를 구성하는 Layout을 생성합니다.

구현하려는 서비스의 레이아웃에 맞게 Native AD의 구성요소들을 선택적으로 사용하여 Native AD의 노출 영역을 조정할 수 있습니다.


Native AD의 구성요소
① 아이콘
② 제목
③ 부제목
④ 설명
⑤ 이미지 또는 비디오

※ Natvie AD 광고 구성 요소들을 앱의 특성에 맞게 커스터마이징할 수 있으나 비디오 광고가 포함되는 경우, 비디오영역이 필수적으로 노출되어야 합니다.


6-2) UITableViewCell 연동

1단계UITableViewCell Class를 ALNativeAdTableViewCell Class로 지정합니다.

해당 과정은 클래스 파일 구현으로 대체 가능합니다.


2단계사용할 광고 속성 값을 해당 뷰에 연결 합니다.

해당 과정은 클래스 파일 구현으로 대체 가능합니다.


3단계해당 뷰의 레이아웃을 설정합니다.

개발사에서 뷰 레이아웃 조정 및 오토 레이아웃 적용 가능




6-3) UITableViewController 연동

1단계네이티브 광고 요청

UITableViewController를 사용해 네이티브 광고를 표시하기 위해서는
ALNativeAdTableHelper 객체를 필수로 사용해 주어야 합니다.

해당 뷰를 사용할 UITableViewController 구현 파일에 해더 파일을 포함합니다.

자세한 구현 사항은 아래의 링크에서 확인하세요.
https://github.com/mocoplex/adlibr-SDK-ios/tree/master/adlibrTestUniversal/adlibrSample_New/ADLibSample/NativeAdSample

#import <ADLibSDK/ADLibSDK.h>



static NSString * const ALSimpleFeedListAdCellIdentifier = @"ALExampleSimpleFeedAdCell";
static NSString * const SimpleFeedListItemCellIdentifier = @"SimpleFeedListTableViewCell";

@interface SimpleFeedListTableViewController () <ALNativeAdTableHelperDelegate>

// 애드립 네이티브광고 테이블뷰 헬퍼 객체
@property (nonatomic, strong) ALNativeAdTableHelper *nativeAdTableManager;

// Native 광고 객체의 인덱스 리스트
@property (nonatomic, strong) NSMutableArray *adItemIndexList;

...

@end

@implementation ViewTypeController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    ...
    //register cell nib
    [self.tableView registerNib:[UINib nibWithNibName:SimpleFeedListItemCellIdentifier bundle:nil]
         forCellReuseIdentifier:SimpleFeedListItemCellIdentifier];
    
    [self.tableView registerNib:[UINib nibWithNibName:ALSimpleFeedListAdCellIdentifier bundle:nil]
         forCellReuseIdentifier:ALSimpleFeedListAdCellIdentifier];

    //load application feed list
    [self loadFeedList];

    //네이티브 광고를 요청합니다.
    [self loadNativeAds];
}

//네이티브 광고 요청
- (void)loadNativeAds
{
    NSMutableArray *indexList = [[NSMutableArray alloc] initWithArray:@[@(3)]];
    self.adItemIndexList = indexList;
    
    //테이블 뷰 및 콜렉션 뷰 셀에 광고를 사용할 경우 SDK에서 제공하는 헬퍼 클래스를 사용합니다.
    ALNativeAdTableHelper *nativeAdTableHelper = [[ALNativeAdTableHelper alloc] initWithViewController:self
                                                                                             tableView:self.tableView
                                                                                              adlibKey:ADLIB_APP_KEY
                                                                                              delegate:self];
    self.nativeAdTableManager = nativeAdTableHelper;

    //테스트 및 상용 모드를 설정합니다.
    self.nativeAdTableManager.isTestMode = YES;
    
    //네이티브 광고를 요청합니다.
    //비디오 및 이미지 타입을 설정하여 요청할 수 있습니다.
    [_nativeAdTableManager requestNativeAdItemType:ALAdRequestItemTypeVideoAd];
}
@end
      

2단계네이티브 광고 수신

ALNativeAdTableHelper Delegate를 구현합니다.



//네이티브 광고 수신 성공 델리게이트
- (void)ALNativeAdTableHelper:(ALNativeAdTableHelper *)helper didReceivedNativeAds:(NSArray *)adList
{
    if (_adItemIndexList.count > 0) {
        
        //수신된 리스트에서 첫번째 광고를 가져옵니다.
        //현재 정책상 한번의 요청에 최대 1개의 광고를 응답합니다.
        ALNativeAd *nativeAd = [adList firstObject];
        
        NSNumber *rowNumber = [_adItemIndexList firstObject];
        [_adItemIndexList removeObjectAtIndex:0];
        
        NSInteger row = [rowNumber integerValue];
        if (row >= _tableItemList.count) {
            row = _tableItemList.count;
        }
        
        NSIndexPath *indexPath =[NSIndexPath indexPathForRow:row inSection:0];
        
        NSMutableDictionary *tableItemInfo = [[NSMutableDictionary alloc] init];
        [tableItemInfo setObject:[NSNumber numberWithBool:YES] forKey:kMapKeyIsAd];
        [tableItemInfo setObject:nativeAd forKey:kMapKeyItem];
        
        [_tableItemList insertObject:tableItemInfo atIndex:row];
        
        //광고를 테이블뷰 셀에 추가합니다.
        [self.tableView insertRowsAtIndexPaths:@[indexPath]
                              withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

//네이티브 광고 수신 실패 델리게이트
- (void)ALNativeAdTableHelper:(ALNativeAdTableHelper *)helper didFailedRequestWithError:(NSError *)error
{
    //에러 로그에 광고 없음 등의 자세한 설명이 출력됩니다.
    //에러 객체의 Info Dictionary를 확인하세요.
    NSLog(@"nativeAdTableHelper Error : %@", error);
}
      

3단계UITableViewDataSource 처리

ALNativeAdTableHelper 객체를 통해 광고 셀을 랜더링하여 반환합니다.



// UITableView DataSource delegate

// 광고 셀을 생성하여 반환합니다.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   
    //광고 셀 을 반환
    ALNativeAd *nativeAd = [self pv_nativeAdObjectAtRow:indexPath.row];
    if (nativeAd) {
        return [self al_tableView:tableView adCellForRowAtIndexPath:indexPath];
    } else {
        return [self al_tableView:tableView cellForRowAtIndexPath:indexPath];
    }
}

// 광고뷰가 화면 노출되는 상황의 처리를 위해 필요, 비디오 광고 자동 재생을 위해 반드시 구현 필요
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [_nativeAdTableManager willDisplayCell:cell forRowAtIndexPath:indexPath];
}

// 광고뷰가 화면에서 사라지는 상황의 처리를 위해 필요, 비디오 광고 자동 정지를 위해 반드시 구현 필요
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath
{
    [_nativeAdTableManager didEndDisplayingCell:cell forRowAtIndexPath:indexPath];
}

// 헬퍼 클래스를 통해 광고 셀을 랜더링하고 해당 셀을 테이블뷰에 반환합니다.
- (UITableViewCell *)al_tableView:(UITableView *)tableView adCellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ALNativeAd *nativeAd = [self pv_nativeAdObjectAtRow:indexPath.row];
    
    UITableViewCell *cell = nil;
    NSString *cellIdentifier = ALSimpleFeedListAdCellIdentifier;
    
    // 헬퍼클래스에 해당 네이티브광고를 랜더링한 셀을 요청합니다.
    cell = (id)[_nativeAdTableManager adCellForAd:nativeAd
                                   cellIdentifier:cellIdentifier
                                     forIndexPath:indexPath];
    
    return cell;
}
      

ALNativeAdTableHelper 객체를 통해 셀 클릭 이벤트를 처리합니다.



// 셀클릭 이벤트를 처리합니다. 기본적으로 광고 뷰 및 광고 버튼에 클릭 이벤트 처리가 되어있으나,
// 테이블 선택 액션에 이벤트를 추가하기위해서는 해당 내용을 구현합니다. 추가하지 않아도 뷰 액션 이벤트는 자동 적용됩니다.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    ALNativeAd *nativeAd = [self pv_nativeAdObjectAtRow:indexPath.row];
    if (nativeAd) {
        [_nativeAdTableManager didSelectAdCellForAd:nativeAd
                                        atIndexPath:indexPath
                           presentingViewController:self];
    } else {
        // 광고가 아닌 셀 클릭 이벤트 처리.
    }
}
      

6-4) 마무리

자세한 연동 내용을 확인하시려면 Github 샘플 프로젝트 하단 링크를 참고하세요.

샘플코드 확인하기(Github)


7. 아이콘 광고 연동

상품분류 - 아이콘 타입

  • 광고 뷰 영역에서 노출되며 광고 뷰는 어플리케이션 윈도우에 전체 화면 크기의 서브뷰로 올리는 것을 권장
  • 아이콘 박스 영역은 광고뷰 하단 좌/우측에 정렬. (좌/우 위치 지정 가능)
  • 실제 광고 컨텐츠 외의 영역은 투명 처리로 터치 이벤트를 어플리케이션 뷰로 전달
  • 최초 로딩 시 해당 박스 영역에 노출되며 기타 3D 이팩트 등이 광고 뷰로 지정한 전체 영역을 사용할 수 있음
  • 아이콘 광고 박스 영역 클릭 시 페이지 이동이나 광고 영역의 확장 이벤트가 발생 할 수 있음
  • 아이콘 광고의 경우 닫기 버튼을 제공

7-1) 광고 요청 객체 생성

광고 객체 생성 : ALIconAdLoader Class


생성자를 통해 객체를 초기화하고 사용한다.
광고 뷰상에서의 노출 정렬은 아이콘 형식만 지원하며, 좌/우 정렬만을 제공한다.

광고 타입 생성자 메소드 정렬 지원
아이콘 - (id)init; 좌/우 정렬 지원 (기본 좌측 정렬)

7-2) 광고 요청 메소드

광고 객체 메소드 : ALIconAdLoader Class


광고 타입에 맞게 생성된 ALIconAdLoader 객체를 통해 광고 요청함수를 호출한다.
광고 요청 시 키 값과 위임자 설정은 필수로 필요한 값으로 키 값에는 발급 받은 매체 키 값을 사용한다.

메소드 인자
아이콘 - (void)loadAdWithKey:(NSString *)key
delegate:(id <ALIconAdLoaderDelegate>)delegate;

key : 광고 요청 매체키 값

delegate : 응답 처리 delegate



#import "ADIconController.h"
#import <Adlib/ADLibSDK.h>

#define APP_KEY @"INSERT_YOUR_APP_KEY"      // 발급받은 앱키를 적용

@interface ADIconController () <ALIconAdLoaderDelegate>

@property (nonatomic, strong) ALIconAdLoader *iconLoader;

@end

@implementation ADIconController

- (void)loadBanner
{
    ALIconAdLoader *loader = [[ALIconAdLoader alloc] init];;
    self.iconLoader = loader;
    self.iconLoader.isTestMode = YES; //테스트 모드 여부 설정
    //self.iconLoader.iconAlign = ALIconAdAlignRIGHT;
    
    [self.iconLoader  loadAdWithKey:APP_KEY delegate:self];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    [self loadBanner];
}

@end

7-3) 광고 요청 수신 - 성공 / 실패 처리

광고 객체 delegate : ALIconAdLoaderDelegate


ALIconAdLoader 객체를 통해 광고를 요청한 컨트롤러 클래스에서 해당 델리게이트를 위임한다.
하단 2가지 메소드는 필수 구현이며 각 각 성공 / 실패에 대한 처리를 수행한다.

delegate 인자
요청 성공 - (void)ALIconAdLoaderDidReceivedAd:(ALIconAdLoader *)loader;

loader : 요청 객체

요청 실패 - (void)ALIconAdLoader:(ALIconAdLoader *)loader
didFailedError:(NSError *)error;
loader : 요청 객체
error : 요청 에러 객체

7-4) 광고 요청 성공 - 광고 뷰 노출 처리

성공 delegate 호출 시 처리


- (void)ALIconAdLoaderDidReceivedAd:(ALIconAdLoader *)loader
{
[loader attachAdViewToMainWindow];
}
    
메소드 설명
- (BOOL)attachAdViewToMainWindow; (권장) 광고 뷰를 어플리케이션 메인 윈도우에 노출
- (BOOL)attachAdViewToView:(UIView *)containerView; 광고 뷰를 지정한 뷰 위에 노출

7-5) 광고 요청 실패

광고 객체 delegate 처리 (코드)


@implementation ADIconAdController

#pragma mark - ALIconAdLoaderDelegate

// 광고 수신 성공 델리게이트
- (void)ALIconAdLoaderDidReceivedAd:(ALIconAdLoader *)loader
{
    //어플리케이션 key window에 노출처리
    [loader  attachAdViewToMainWindow];
    
    //지정한 뷰위에 노출처리
    //[loader attachAdViewToView:self.view];
}

// 광고 수신 실패 델리게이트
- (void)ALIconAdLoader:(ALIconAdLoader *)loader  didFailedError:(NSError *)error
{
    NSLog(@"ALIconAdLoader request error : %@", error);
}

@end
        

에러 코드 정의


요청 실패 delegate 인자 NSError 확인

NSError 정의 내용
domain com.adlibr.gapping.error
code ALGappingAdErrorCode

ALGappingAdErrorCode

타입 코드 정의 내용
kGappingErrorEmptyAd 광고 없음
kGappingErrorSessionFailed 광고 키 설정 정보 수신 실패
kGappingErrorAttachViewFailed 광고 뷰 적재 실패 ( 부모 뷰가 없는 경우 발생 )
kGappingErrorPakDownloadFailed 광고 소재 다운로드 실패
kGappingErrorReadyForResouces 광고 소재 다운로드 준비 중
kGappingErrorInvalidRequestType 정의되지 않은 광고 요청 타입 요청
kGappingErrorInvalidRequestKey 유효하지 않은 매체 키 값
kGappingErrorInvalidResponse 광고 응답 오류
kGappingErrorInvalidRequest 광고 요청 오류

7-6) 광고 요청 취소 및 광고 뷰 제거 처리

광고 요청 취소를 수행하면 해당 내부적 요청을 중단하고 해당 광고 뷰를 부모 뷰에서 제거한다.


메소드 설명
- (void)detachAdView; 광고 요청 중단 및 광고 뷰를 부모 뷰에서 제거
#import "ADIconAdController.h"
#import <Adlib/ADLibSDK.h>

#define APP_KEY @"INSERT_YOUR_APP_KEY"      // 발급받은 앱키를 적용

@interface ADIconAdController () <ALIconAdLoaderDelegate>
@property (nonatomic, strong) ALIconAdLoader *iconLoader;
@end

@implementation ADIconAdController

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    [self loadBanner];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    
    [self clearAllAd];
}

- (void)clearAllAd
{
    [self.iconLoader detachAdView];
    self.iconLoader = nil;
}
@end
        

7-7) 어플리케이션 화면 회전 변경 처리

어플리케이션의 화면 회전 발생 시 광고 컨텐츠의 영역을 재 조정을 요청하는 함수 광고를 노출할 UIViewController 에서 발생하는 회전 처리 함수를 적용하여 회전이 완료된 시점에 SDK로 해당 함수를 호출하여 영역을 재조정한다.


UIViewController를 상속하지 않는 상황에 광고를 노출할 경우 기기 회전 노티피케이션을 감지하여 광고를 올린 뷰의 크기가 변경 완료된 시점에서 처리한다.

메소드 설명
- (void)reloadContentForParentViewRotate; 광고 화면 영역 재조정 요청

@implementation ADIconAdController

#pragma mark - UIViewController delegate : rotate event

//iOS 8.0 이상
- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
     {
         
     } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
     {
         [self.iconLoader  reloadContentForParentViewRotate];
     }];
    
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

//iOS 8.0 미만
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self.iconLoader reloadContentForParentViewRotate];
}

@end
      

자주묻는 질문 & TIP

Q. 각 나라에 맞게 광고 스케쥴을 달리 적용하고 싶습니다. (지역 타게팅)
A. 애드립의 앱 스케쥴 설정 화면에서, 타게팅을 원하는 나라를 추가하여 손쉽게 노출전략을 설정할 수 있습니다.

정리

애드립 연동이 마무리되었습니다.

## 실제 프로젝트에 애드립을 연동하기 위해 ##

  • 각 플랫폼의 ID 발급 및 SDK 다운로드
  • SDK 프로젝트에 라이브러리 추가
  • 배너 연동 코드 적용

관련된 추가적인 개발 관련한 문의사항과 고급설정 등 관련 내용은 http://adlibr.com 의 개발자 지원 메뉴를 통해 공유되고 있습니다.