文档章节

IOS版Cocos2d-x2.2使用移动广告聚合平台集成插屏广告教程

大街小巷
 大街小巷
发布于 2015/12/10 15:26
字数 1166
阅读 31
收藏 0

1、版本
Cocos2d-x 2.2  
GoogleAdMobAdsSdkiOS-6.5.1

2、导入
2.1 导入头文件和.a文件
并在Librabry Search Paths中添加.a文件的路径

2.2 导入所需IOS框架
AdSupport.framework
StoreKit.framework
AudioToolbox.framework
MediaPlayer.framework
MessageUI.framework
SystemConfiguration.framework

2.3 Linking中添加Other Linker Flags
否则会遇到-[GADObjectPrivate  changeState:]: unrecognized selector sent to instance的问题。

3、编码
首先要导入GADInterstitila.h头文件,实现GADInterstitialDelegate委托,并定义一个GADInterstitila属性。showInterstitial方法供外部调用用来显示广告。
#import <UIKit/UIKit.h>
#import "GADInterstitial.h"

@class RootViewController;

@interface AppController : NSObject <UIApplicationDelegate,GADInterstitialDelegate> {  
UIWindow *window;  
RootViewController         *viewController;  
GADInterstitial                *interstitial_;
}
@property(nonatomic, retain) GADInterstitial *interstitial;

- (void)showInterstitial;

@end

.m文件中主要是delegate函数的实现,interstitial初始化,广告预先请求和广告显示等方法
#pragma mark -#pragma Interstitial Delegate
- (void)interstitial:(GADInterstitial *)interstitial
didFailToReceiveAdWithError:(GADRequestError *)error {
 
}

- (void)interstitialDidReceiveAd:(GADInterstitial *)interstitial {  

}

- (void)interstitialDidDismissScreen:(GADInterstitial *)ad
{  

[self preloadRequest];

}

}
#pragma mark GADRequest generation
{
// Create a new GADInterstitial each time.  A GADInterstitial  
// will only show one request in its lifetime. The property will release the  
// old one and set the new one.
self.interstitial = [[[GADInterstitial alloc] init] autorelease];  
self.interstitial.delegate = self;

// Note: Edit InterstitialExampleAppDelegate.m to update  
// INTERSTITIAL_AD_UNIT_ID with your interstitial ad unit id.  

self.interstitial.adUnitID = INTERSTITIAL_AD_UNIT_ID;

}
-(void)preloadRequest
{  
CCLOG("pre load");   
[self initInterstitial];   
[self.interstitial loadRequest: [self createRequest]];

}

// Here we're creating a simple GADRequest and whitelisting the application
// for test ads. You should request test ads during development to avoid
// generating invalid impressions and clicks.

- (GADRequest *)createRequest {  
GADRequest *request = [GADRequest request];    

// Make the request for a test ad. Put in an identifier for the simulator as  
// well as any devices you want to receive test ads.
request.testDevices =  [NSArray arrayWithObjects:   
// TODO: Add your device/simulator test identifiers here. They are   
// printed to the console when the app is launched.   
nil];  
return request;
}

跟android不同的是,interstitial对象每次request时都必须重新初始化。
完整的.m文件:
#import "AppController.h"
#import "EAGLView.h"#import "cocos2d.h"
#import "AppDelegate.h"
#import "RootViewController.h"

#define INTERSTITIAL_AD_UNIT_ID @"YOUR_OWN_ID"
@implementation AppController
@synthesize interstitial = interstitial_;
#pragma mark -
#pragma mark Application lifecycle
// cocos2d application instancestatic AppDelegate s_sharedApplication;
static AppDelegate s_sharedApplication;

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

// Override point for customization after application launch.

// Add the view controller's view to the window and display.
window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];    

// Init the EAGLView  
EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]                   
pixelFormat: kEAGLColorFormatRGB565                   
depthFormat: GL_DEPTH24_STENCIL8_OES               
preserveBackbuffer: NO                    
sharegroup: nil                   
multiSampling: NO                 
numberOfSamples: 0];

// Use RootViewController manage EAGLView   
viewController=[[RootViewController alloc] initWithNibName:nil bundle:nil];  
viewController.wantsFullScreenLayout = YES;  
viewController.view = __glView;

// Set RootViewController to window  
if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)  
{    

// warning: addSubView doesn't work on iOS6    
[window addSubview: viewController.view];  

}  
else  
{    

// use this method on ios6    
[window setRootViewController:viewController];  

}    

[window makeKeyAndVisible];

[[UIApplication sharedApplication] setStatusBarHidden:true];
//[self initInterstitial];//每次request都要重新初始化  

[self preloadRequest];  cocos2d::CCApplication::sharedApplication()->run();
  return YES;

}

- (void)applicationWillResignActive:(UIApplication *)application {  
/*   Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
 
Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.   */

cocos2d::CCDirector::sharedDirector()->pause();

}

- (void)applicationDidBecomeActive:(UIApplication *)application {  
/*   Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.   
*/  
cocos2d::CCDirector::sharedDirector()->resume();

}

- (void)applicationDidEnterBackground:(UIApplication *)application {  
/*   Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.    
If your application supports background execution, called instead of applicationWillTerminate: when the user quits.   
*/  
cocos2d::CCApplication::sharedApplication()->applicationDidEnterBackground();

}

- (void)applicationWillEnterForeground:(UIApplication *)application {  
/*  Called as part of  transition from the background to the inactive state: here you can undo many of the changes made on entering the background.  
*/  
cocos2d::CCApplication::sharedApplication()->applicationWillEnterForeground();

}

- (void)applicationWillTerminate:(UIApplication *)application {  
/*  Called when the application is about to terminate.   See also applicationDidEnterBackground:.  
*/

}

#pragma mark -
#pragma mark Memory management
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {  
/*   
Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.   
*/

}
- (void)dealloc {  
interstitial_.delegate = nil;  
[interstitial_ release];  
[window release];  
[super dealloc];
}

#pragma mark
-#pragma Interstitial Delegate

- (void)interstitial:(GADInterstitial *)interstitial
didFailToReceiveAdWithError:(GADRequestError *)error {
 
}

- (void)interstitialDidReceiveAd:(GADInterstitial *)interstitial {  

}

- (void)interstitialDidDismissScreen:(GADInterstitial *)ad
{  [self preloadRequest];

}

- (void)showInterstitial{  
if (self.interstitial.isReady) {    
CCLOG("ready");    
[self.interstitial presentFromRootViewController:viewController];  
}

else
{     

CCLOG("not ready");     
[self preloadRequest];
   }

}

#pragma mark GADRequest generation
-(void)initInterstitial
{  
// Create a new GADInterstitial each time.  A GADInterstitial  
//will only show one request in its lifetime. The property will release the  
//old one and set the new one.  

self.interstitial = [[[GADInterstitial alloc] init] autorelease];  self.interstitial.delegate = self;    
// Note: Edit InterstitialExampleAppDelegate.m to update  
// INTERSTITIAL_AD_UNIT_ID with your interstitial ad unit id.  self.interstitial.adUnitID = INTERSTITIAL_AD_UNIT_ID;

}
-(void)preloadRequest
{  
CCLOG("pre load");   
[self initInterstitial];   
[self.interstitial loadRequest: [self createRequest]];
}

// Here we're creating a simple GADRequest and whitelisting the application
// for test ads. You should request test ads during development to avoid
// generating invalid impressions and clicks.
- (GADRequest *)createRequest {  
GADRequest *request = [GADRequest request];    

// Make the request for a test ad. Put in an identifier for the simulator as  
// well as any devices you want to receive test ads.  
request.testDevices =  [NSArray arrayWithObjects:   

// TODO: Add your device/simulator test identifiers here. They are   
// printed to the console when the app is launched.   nil];  
return request;
}

@end

4、调用
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
[(AppController*)[UIApplication sharedApplication].delegate showInterstitial];
#endif

KeyMob移动广告聚合平台支持的广告形式有横幅广告、插屏广告、积分墙广告、视频广告、push广告、全屏广告等众多流行广告形式,目前是国内比较优秀的平台,也是日广告量展示量比较不错的移动广告聚合平台。







© 著作权归作者所有

大街小巷
粉丝 8
博文 208
码字总数 130367
作品 0
长沙
私信 提问
IOS版OpenGL游戏引擎的集成KeyMob管理库教程

一:前提条件 1:下载适用于IOS的Google移动广告SDK 二:OpenGL游戏---横幅广告 如果您使用基于OpenGL的游戏引擎,但使用原生的IOS集成广告,我们建议您仅在游戏暂停或结束时,或者在用户未主动...

大街小巷
2015/11/20
16
0
Cocos与AdColony双强携手 开通游戏广告变现直通车

Cocos与AdColony双强携手 开通游戏广告变现直通车 2018-07-20 17:25编辑: suiling分类:业界动态来源:CocoaChina CocosAdColony恰逢其时- 2018 CJ酒会 招聘信息: iOS开发 iOS开发 iOS开发...

suiling
2018/07/20
0
0
Facebook 是如何构建首个跨平台 React Native 应用的?

今年早些时候,我们发布了 React Native for iOS。React Native 将开发者在 web 上所使用的 React — 拥有声明式的自包含组件以及快速的开发周期 — 带到了移动平台, 同时保留了原生应用程序...

oschina
2015/09/18
5.5K
6
支付宝小程序本周将向用户全量开放,要和微信正面刚?

支付宝小程序本周将向用户全量开放,要和微信正面刚? 2018-07-30 17:57编辑: garace分类:业界动态来源:36氪 微信支付宝AT 招聘信息: iOS开发 iOS开发 iOS开发 app开发上架H5技术 app开发...

garace
2018/07/30
0
0
iOS 7 在 iPhone 中的市占率增长至 89.7%

据国外媒体报道,随着苹果全球开发者大会即将召开,一家市场研究公司称,iOS 7市占率在美国和加拿大增长至新水平。在备受期待的iOS 8发布之前,iPhone和iPad用户继续向iOS 7升级,iOS 7在北美...

oschina
2014/06/01
1K
11

没有更多内容

加载失败,请刷新页面

加载更多

教你玩转Linux—添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户...

xiangyunyan
23分钟前
5
0
返回提示信息,如:xxx创建成功!

【服务端】在输出的方法块中,加入要输出的字段(qcm_batch_id) QCMUserType.cs: public struct QCM_Custom_Create_Batch_Out_Tag { public BASCoreType.Cmn_Out_T......

_Somuns
23分钟前
5
0
Aliyun Serverless VSCode Extension v1.12.0 发布

Aliyun Serverless VSCode Extension 是阿里云 Serverless 产品 函数计算 Function Compute 的 VSCode 插件,该插件结合了函数计算 Fun 工具以及函数计算 SDK ,是一款 VSCode 图形化开发调试...

阿里云官方博客
23分钟前
6
0
程序员如何培养解决复杂问题的能力?

今天在上网时候,突然看到了这篇文章,感觉非常的适合现在的自己去思考下,可能也适用在座的读者。程序员不仅仅是敲代码,更是一个复合能力的结合体,也不仅仅停留在技术和代码阶段。你想要成...

哥本哈根的小哥
27分钟前
7
0
市场变化驱动产品思维升级

宜信科技中心财富管理产品部负责人Bob,与大家一起聊聊个性化推荐产品功能的设计和B端产品的功能策划方式。 拓展阅读:回归架构本质,重新理解微服务 智慧金融时代,大数据和AI如何为业务赋能...

宜信技术学院
28分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部