[cocos2dx 3.0 + ios]如何编写iAd的plugin

cocos2dx3.0自带的plugin包含推广,收益等各个方面的第三方插件,但是对iAd没有支持,大概是因为专属于IOS,没有单独成库的必要,不过为了统一使用广告的插件化管理,封装一个专属IOS的IAD插件还是有必要的,搞了一天,在这里做个记录,有兴趣的朋友可以参考一下,不完善的地方请指出:

1:如何创建XCODE库就不说了,创建在其他广告库的同级目录,文件结构也是一样,一共就三个文件:

  .pch

  AdsApple.h

  AdsApple.m

2:要加入到cocos2dx的PluginManager统一管理,那么我们这个新的类需要继承InterfaceAds,并且链接iAd.framework.

3:快1点了,直接上代码,完整注释:

  头文件:

//
//  AdsApple
//  AdsApple
//
//  Created by kevin on 14-5-2.
//  Copyright (c) 2014年 kevin. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "iAd/iAd.h"

#import "InterfaceAds.h"

// 广告类型
typedef enum {
    kTypeBanner = 1,    // 广告栏
    kTypeFullScreen,    // 全屏
} AppleType;


@interface AdsApple : NSObject <InterfaceAds, ADBannerViewDelegate>
{
}

@property BOOL debug;
@property bool bannerVisible;
@property int bannerPos;
@property (assign, nonatomic) ADBannerView* bannerView;

// 设置开发者信息
- (void) configDeveloperInfo: (NSMutableDictionary*) devInfo;

// 显示广告
- (void) showAds: (NSMutableDictionary*) info position:(int) pos;

// 隐藏广告
- (void) hideAds: (NSMutableDictionary*) info;

// 位置获取
- (void) queryPoints;

//
- (void) spendPoints: (int) points;

// 开关调试模式
- (void) setDebugMode: (BOOL) isDebugMode;

// 获取SDK版本
- (NSString*) getSDKVersion;

// 获取插件版本
- (NSString*) getPluginVersion;

@end

  实现:

//
//  AdsApple
//  AdsApple
//
//  Created by kevin on 14-5-2.
//  Copyright (c) 2014年 kevin. All rights reserved.
//

#import "AdsApple.h"
#import "AdsWrapper.h"

#define OUTPUT_LOG(...)     if (self.debug) NSLog(__VA_ARGS__);
#define OUT_POS CGPointMake(-1024, -1024)

@implementation AdsApple

@synthesize debug = __debug;

// 初始化
- (id)init
{
    self = [super init];
    if (self) {
        
    }
    
    return self;
}

// 释放
- (void)dealloc
{
    if( self.bannerView != nil ) {
        [self.bannerView removeFromSuperview];
        [self.bannerView release];
        self.bannerView = nil;
    }
    [super dealloc];
}

#pragma mark InterfaceAds impl

// 设置开发者信息
- (void) configDeveloperInfo: (NSMutableDictionary*) devInfo
{
}

// 显示广告
- (void) showAds: (NSMutableDictionary*) info position:(int) pos
{
    NSString* strType = [info objectForKey:@"AppleType"];
    int type = [strType intValue];
    switch (type) {
        case kTypeBanner:
        {
            [self showBanner:pos];
            break;
        }
        case kTypeFullScreen:
            OUTPUT_LOG(@"Now not support full screen view in AppleType");
            break;
        default:
            OUTPUT_LOG(@"The value of 'AppleType' is wrong (should be 1 or 2)");
            break;
    }
}

- (void) hideAds: (NSMutableDictionary*) info
{
    NSString* strType = [info objectForKey:@"AppleType"];
    int type = [strType intValue];
    switch (type) {
        case kTypeBanner:
        {
            if (nil != self.bannerView) {
                [self.bannerView removeFromSuperview];
                [self.bannerView release];
                self.bannerView = nil;
            }
            break;
        }
        case kTypeFullScreen:
            OUTPUT_LOG(@"Now not support full screen view in AppleType");
            break;
        default:
            OUTPUT_LOG(@"The value of 'AppleType' is wrong (should be 1 or 2)");
            break;
    }
}

- (void) queryPoints
{
    OUTPUT_LOG(@"AdsApple not support query points!");
}

- (void) spendPoints: (int) points
{
    OUTPUT_LOG(@"AdsApple not support spend points!");
}

- (void) setDebugMode: (BOOL) isDebugMode
{
    self.debug = isDebugMode;
}

- (NSString*) getSDKVersion
{
    return @"6.4.2";
}

- (NSString*) getPluginVersion
{
    return @"0.2.0";
}

// 显示广告栏
- (void) showBanner: (int) pos
{
    // 如果存在先删除,重新创建
    if (nil != self.bannerView) {
        [self.bannerView removeFromSuperview];
        [self.bannerView release];
        self.bannerView = nil;
    }
    
    // 创建
    self.bannerView = [[ADBannerView alloc] initWithFrame:CGRectZero];
    self.bannerView.frame = CGRectOffset( self.bannerView.frame, 0, -50 );
    self.bannerView.requiredContentSizeIdentifiers = [NSSet setWithObject:ADBannerContentSizeIdentifierPortrait];
    self.bannerView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
    self.bannerView.delegate=self;
    [AdsWrapper addAdView:self.bannerView atPos:pos];
    self.bannerView.center = OUT_POS;
    self.bannerPos = pos;
    [UIView commitAnimations];
    self.bannerVisible = false;
}

// 在加载广告前通告
- (void)bannerViewWillLoadAd:(ADBannerView *)banner  NS_AVAILABLE_IOS(5_0)
{
    NSLog( @"bannerViewWillLoadAd" );
}

// 每次有新广告加载后通告
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    NSLog( @"bannerViewDidLoadAd" );
    if( self.bannerVisible == false ) {
        [self.bannerView removeFromSuperview];
        [AdsWrapper addAdView:self.bannerView atPos:self.bannerPos];
        [UIView commitAnimations];
        self.bannerVisible = true;
        // 向监听器发送广告显示的通告
        [AdsWrapper onAdsResult:self withRet:kAdsShown withMsg:@"ok"];
    }
    // 向监听器发送接到数据的通告
    [AdsWrapper onAdsResult:self withRet:kAdsReceived withMsg:@"ok"];
}

// 发生错误
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    NSLog( @"didFailToReceiveAdWithError" );
    if( self.bannerVisible ) {
        self.bannerView.center = OUT_POS;
        self.bannerVisible = false;
        // 向监听器发送广告隐藏(错过)的通告
        [AdsWrapper onAdsResult:self withRet:kAdsDismissed withMsg:@"ok"];
    }
    // 向监听器发送广告接受数据错误的通告
    [AdsWrapper onAdsResult:self withRet:kNetworkError withMsg:error.domain];
}

// 当用户点击广告栏通告,返回值BOOL指定广告是否打开
- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{
    NSLog( @"bannerViewActionShouldBegin" );
    return TRUE;
}

// 全画面的广告表示完了后,调用该接口
// 该接口被调用之后,当前程序一般会作为后台程序运行
// 该接口中需要回复之前被中断的处理(如果有的话)
- (void)bannerViewActionDidFinish:(ADBannerView *)banner
{
    NSLog( @"bannerViewActionDidFinish" );
    // 向监听器发送广告点击成功关闭的通告
    [AdsWrapper onPlayerGetPoints:self withPoints:1];
}

@end

 4:使用的时候和其他的插件一样,加载,显示,隐藏,卸载..

    #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    m_pNowAdsPtl = dynamic_cast<ProtocolAds*>(PluginManager::getInstance()->loadPlugin( "AdsApple" ) );
    if( m_pNowAdsPtl ) {
        m_mapAdsInfo["AppleType"] = "1";
        m_bUsingIAD = true;
    }
    #endif

 5:iAd有广告点击切换前后的事件通知,为了保证监听接口不变,GetPoint成了点击广告后的监听回调,用于给小费...

 6:iAd在部分国家没有支持,可以根据时区或者其他的检测方法进行广告平台之间的切换,我用的是失败次数检测,这里就不写出来了,各有各的办法.

结束~ 

posted on 2014-05-03 00:35  Kevin Game  阅读(1301)  评论(0编辑  收藏  举报