[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 提供一个极 ...
随机推荐
- 导出excel的简单方法
excel的操作,最常用的就是导出和导入,废话不多说上代码. 本例使用NPOI实现的,不喜勿喷哈.... /// <summary> /// 导出Excel /// </summar ...
- 开源字体包缩减font-spider
最近公司产品用微软雅黑,被告~ 领导要求产品后台系统必须更换字体,美工给了个宋体,个人觉得太丑,就网上搜了些处理方法使用 CSS属性 @font-face 自定义字体, 最后决定用 思源黑体 (思源 ...
- ecshop 报错
ECShop出现Strict Standards: Only variables should be passed b (2014-06-04 17:00:37) 转载▼ 标签: ecshop 报错 ...
- PHP substr截取中文字符出现乱码的问题解疑
我们在使用PHP substr截取中文字符的时候,经常会出现乱码的情况,导致程序无法正常运行,这时怎么引起的呢?通过分析,我们知道,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: ...
- C# 仿迅雷风格选项卡
private void listView1_SelectedIndexChanged(object sender, EventArgs e) { listView1.FullRowSelect = ...
- 实用lsof常用命令行
1, 使用 lsof 命令行列出所有打开的文件 # lsof 这可是一个很长的列表,包括打开的文件和网络 上述屏幕截图中包含很多列,例如 PID.user.FD 和 TYPE 等等. FD - Fil ...
- ServletContext全局变量初始化
Java部分 package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.ser ...
- C 字符串倒转,XCode中编译
正在学习ios开发,在前期学习c时,常规方法直接倒转数组的值,只能用于非中文字符,否则出现乱码, 在网上找了点资料,可能是 IDE不一致,一直得不到自己想要的值.花时间自己改了一下,正常通过 //字符 ...
- ubuntu修改主机名称
一.为何要修改主机名称 在安装Ubuntu时,一不小心主机名称输入的“too long”了,导致命令行上就提示符占据了一行的1/3,迫使我产生修改主机名称的冲动. 二.操作方法 原理:系统启动时,会从 ...
- 支付宝集成SDK 报错
1.打开Demo中的错误 这是路径错误导致 解决办法:在Build Settings 中找到 Library Search Paths ,去掉其中的 /// 2.自己集成支付宝SDK时的错误 这个也是 ...