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

结束~

[cocos2dx 3.0 + ios]如何编写iAd的plugin的更多相关文章

  1. Cocos2d-x 3.0 事件系统【转】

    事件系统,是一个软件的核心组成部分.从小处讲它是应用程序内部各模块交互的设计模式,从大处讲,它是软件架构的组成模块.在现代软件开发中,操作系统通常通过一些预定义的事件,告知应用程序发生的一些事情如用户 ...

  2. 1、Cocos2dx 3.0游戏开发三找一小块前言

    尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...

  3. 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...

  4. 1、Cocos2dx 3.0游戏开发找小三之前言篇

    尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...

  5. 标题:如何使用ShareSDK实现Cocos2d-x的Android/iOS分享与授权

    Cocos2DX 简介 Cocos2d-x是一套成熟的开源跨平台游戏开发框架.其引擎提供了图形渲染.GUI.音频.网络.物理.用户输入等丰富的功能,被广泛应用于游戏开发及交互式应用的构建.引擎的核心采 ...

  6. Cocos2d-x 关于在iOS平台真机测试的一些注意

    下面简单记录一下在最近cocos2d-x项目在iOS平台真机测试和模拟器测试中遇到的一些要注意的地方(使用ipod): 1.图片大小 游戏中基本上都是会用到图片,那么在使用图片的时候要特别注意图片的s ...

  7. 【原】cocos2d-x 2.0.4 不支持https协议 CURLE_UNSUPPORTED_PROTOCOL

    我们项目组用的cocos2d-x版本还比较老,各种好的功能不能用. 今天就让我遇到一个问题,使用CCHttpClient发送http请求的时候,https协议的不支持,返回失败信息如下 errorco ...

  8. Cocos2d-x 3.0心得(01)-图片载入与混合模式

    近期開始用cocos2dx 3.0做东西,略有心(cao)得(dian),略微作下记录吧. v3.0相对v2.2来说,最引人注意的,应该是对触摸层级的优化.和lambda回调函数的引入(嗯嗯.不枉我改 ...

  9. Cocos2d-x 2.0 自适应多种分辨率

    转自:http://dualface.github.io/blog/2012/08/17/cocos2d-x-2-dot-0-multi-resolution/ cocos2d-x 2.0 提供一个极 ...

随机推荐

  1. Mvc-项目遇到问题解决办法

    项目中验证 在@using (Html.BeginForm()) 后边都有 @Html.ValidationSummary(), @Html.ValidationSummary(true, " ...

  2. Linked Server for SQL Server 2012(x64) to Oracle Database 12c(x64)

    因为把两台数据库装了同一台机机器上,所以没有安装oracle Client的部分,Oracle部分使用netca创建的Net Service Name,使用tnsping以及登入方式的确认用户权限的以 ...

  3. jQuery 效果方法

    jQuery 效果方法 下面的表格列出了所有用于创建动画效果的 jQuery 方法. 方法 描述 animate() 对被选元素应用"自定义"的动画 clearQueue() 对被 ...

  4. gulp之css,js压缩合并加密替换

    为了防止客户端的静态资源缓存,我们需要每次更新css或js的时候,通过md5或时间戳等方式重新命名静态资源.让客户端可以重新请求资源,而不是从缓存里取.然后html模板里的src也要做相应的修改.当然 ...

  5. header("Location:login.php")

    header("Location:login.php")应该注意的几个问题  header("Location:")作为php的转向语句.其实在使用中,他有几点 ...

  6. 【随记】SQL Server连接字符串参数说明

    废话不多说,请参见 SqlConnection.ConnectionString .

  7. 搭建hive到eclipse里面

    (1)下载源码 git clone https://git-wip-us.apache.org/repos/asf/hive.git git clone https://github.com/apac ...

  8. 2016 Multi-University Training Contest 2 第一题Acperience

    Acperience Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Probl ...

  9. tornado远远不止

    大家的回答都有点片面,更多的关注web框架成,其实tornado远远不止这些,且听我慢慢到来1.高性能的网络库,这可以和gevent,twisted,libevent等做对.提供了异步io支持,超时事 ...

  10. ireport常见问题

    $V{PAGE_NUMBER} 表示当前是第几页 ,在text field 的 选项evaluation time选report是共几页,now表是当前页.页码可在ireport里直接设置. &quo ...