[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在部分国家没有支持,可以根据时区或者其他的检测方法进行广告平台之间的切换,我用的是失败次数检测,这里就不写出来了,各有各的办法.
结束~
[cocos2dx 3.0 + ios]如何编写iAd的plugin的更多相关文章
- Cocos2d-x 3.0 事件系统【转】
事件系统,是一个软件的核心组成部分.从小处讲它是应用程序内部各模块交互的设计模式,从大处讲,它是软件架构的组成模块.在现代软件开发中,操作系统通常通过一些预定义的事件,告知应用程序发生的一些事情如用户 ...
- 1、Cocos2dx 3.0游戏开发三找一小块前言
尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...
- 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...
- 1、Cocos2dx 3.0游戏开发找小三之前言篇
尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...
- 标题:如何使用ShareSDK实现Cocos2d-x的Android/iOS分享与授权
Cocos2DX 简介 Cocos2d-x是一套成熟的开源跨平台游戏开发框架.其引擎提供了图形渲染.GUI.音频.网络.物理.用户输入等丰富的功能,被广泛应用于游戏开发及交互式应用的构建.引擎的核心采 ...
- Cocos2d-x 关于在iOS平台真机测试的一些注意
下面简单记录一下在最近cocos2d-x项目在iOS平台真机测试和模拟器测试中遇到的一些要注意的地方(使用ipod): 1.图片大小 游戏中基本上都是会用到图片,那么在使用图片的时候要特别注意图片的s ...
- 【原】cocos2d-x 2.0.4 不支持https协议 CURLE_UNSUPPORTED_PROTOCOL
我们项目组用的cocos2d-x版本还比较老,各种好的功能不能用. 今天就让我遇到一个问题,使用CCHttpClient发送http请求的时候,https协议的不支持,返回失败信息如下 errorco ...
- Cocos2d-x 3.0心得(01)-图片载入与混合模式
近期開始用cocos2dx 3.0做东西,略有心(cao)得(dian),略微作下记录吧. v3.0相对v2.2来说,最引人注意的,应该是对触摸层级的优化.和lambda回调函数的引入(嗯嗯.不枉我改 ...
- Cocos2d-x 2.0 自适应多种分辨率
转自:http://dualface.github.io/blog/2012/08/17/cocos2d-x-2-dot-0-multi-resolution/ cocos2d-x 2.0 提供一个极 ...
随机推荐
- SQL Server 损坏修复
目录: 一. 常见错误解读 二. DBCC CHECKDB 三 .不同部位损坏的应对 四. Database Mirroring和AlwaysOn的页面自动修复功能 一 常见错误解读 SQL Serv ...
- dp题目
从别的地方看来,最近一直在啃DP,有个目标,更有动力了. 1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包; ...
- 寒假的ACM训练(一)
今天开始ACM训练,选择了刘汝佳的<挑战编程>,暂时算是开始了. 测评的网址: http://www.programming-challenges.com 第一个题目是水题啦.3n+1. ...
- 24种设计模式--桥梁模式【Bridge Pattern】
今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都很赚钱,天天帮我在累加财富,其实是什么公司我倒是不关心,我关心的是是不是在赚钱,赚了多少, ...
- 亲手用模块化方式写一个jquery QQ表情插件。
在回复或是评论的时候,很多时间都需要有回复表情的功能,然后而需要插入QQ表情可以是最常见的. 插件也写多很多个了,这次写插件就下了一个决定.就是使用模块化来开发. 最后在我的源代码中有这样子一段: v ...
- PHP实战开发教程
对于PHP初学者来说,一上手就学习庞大的PHP语法无疑很打击自信心.其实即便是很熟练的程序员,也未必对所有的语法非常熟悉.通常熟练的程序员比普通的程序员的优势在于对基本语法的理解非常透彻,而且常用的一 ...
- ASP.NET MVC轻教程 Step By Step 11——数据注解
将验证规则写在Cotroller里不是一个好办法,这样会显得代码很啰嗦,更重要的是将业务逻辑写入Controller,使得Controller变得更“重”,不符合设计原则.更好的办法是使用验证注解属性 ...
- https WebAPi
前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...
- 从零开始学习MySQL2---MySQL的安装与配置(只有Windows)
因为我电脑只装了Windows系统,故而,只整理了在Windows系统下的安装方式 截图比较麻烦,故而多引用百度经验. Windows平台下安装与配置MySQL 5.6 下载,网址:http://de ...
- [BZOJ 1907] 树的路径覆盖 【树形DP】
题目链接:BZOJ - 1907 题目分析 使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点). f[x][1] 表示以 x 为根的子 ...