2012年10月29日月曜日

cocos2d 2.0に広告(iAd)を導入する



いろいろRootViewControllerがなかったりと、2.0になって
わけわからんことが多かったので、
参考になれば幸いです。






もう見ていると思うけど、
参考サイト
warning banner obscuredなんちゃらってerrorが出た時の対処法

情報元は公式サイトで。

ただ、公式サイトだけではエラーが出るので、なかなか苦労しました。笑

iAd.frameworkを追加

新たにiAdSingleton.h とm ファイルをcocos2dで追加。
iAdSingleton.h
#import <Foundation/Foundation.h">
#import "cocos2d.h"
#import <iAd/iAd.h">

@interface iAdSingleton : NSObject  {
    ADBannerView *bannerView;
 UINavigationController *navControllers;
}

@property (nonatomic, retain) ADBannerView *bannerView;

+(iAdSingleton *)sharedInstance;
-(void)createAdView;

@end


iAdSingleton.m
#import "iAdSingleton.h"


@implementation iAdSingleton

@synthesize bannerView;

+(iAdSingleton *)sharedInstance{
 static iAdSingleton *sharedHelper;
 
 if(!sharedHelper){
  sharedHelper = [[self alloc] init];
 }
 return sharedHelper;
}

-(void) createAdView{
 static NSString * const kADBannerViewClass = @"ADBannerView";
 
 if (NSClassFromString(kADBannerViewClass)!= nil) {
  self.bannerView = [[ADBannerView alloc] initWithFrame:CGRectZero];
  [self.bannerView setRequiredContentSizeIdentifiers:[NSSet setWithObjects:ADBannerContentSizeIdentifierPortrait, nil]];
  self.bannerView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
  [self.bannerView setDelegate:self];
  [navControllers.view addSubview:self.bannerView];
  [self moveBannerOffScreen];
 }
}
//バナーの呼び出しに成功した場合(moveBannerOnScreenにとぶ)
-(void)bannerViewDidLoadAd:(ADBannerView *)banner{
 [self moveBannerOnScreen];
}

//完全にロードされたらまずはじめに画面に呼び出される
-(void) moveBannerOffScreen{
// CGSize windowsize = [[CCDirector sharedDirector] winSize];
//#warning the size of the ads needs to be used according iphone or ipad windowのサイズで変更される
 [self.bannerView bringSubviewToFront:bannerView];
 bannerView.frame = CGRectMake(0.0, 0.0, bannerView.frame.size.width, bannerView.frame.size.height);
// self.bannerView.frame = CGRectMake(0, windowsize.height, 320, 50);
// NSLog(@"bannerがスクリーンに表示されます");
}

//スクリーンに表示される
-(void) moveBannerOnScreen{
 [UIView beginAnimations:@"BannerViewIntro" context:NULL];
 self.bannerView.frame = CGRectZero;
 [UIView commitAnimations];
// NSLog(@"bannerがスクリーンに表示されます2");
}

//ユーザーがバナーをおしたときに起動される
-(BOOL) bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave{
// NSLog(@"banner全画面で表示されます");
 return YES;
}

//バナーを閉じた後、画面はポーズされていて、それがまた動き出す
-(void)bannerViewActionDidFinish:(ADBannerView *)banner{
// NSLog(@"iAd banner is closed");
}

//バナーをロードできなかったら、バナーをスクリーンから非表示にする必要がある(appleが必要としている)
-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{
// NSLog(@"banner got error");
 [UIView beginAnimations:@"animateAdBannerOff" context:NULL];
 [self moveBannerOffScreen];
}
//deallocはARCを使っているため必要ないです

@end
AppDelegate.h内にimportと ADBannerViewDelegateを追加
#import <UIKit/UIKit.h>
#import "cocos2d.h"
#import <iAd/iAd.h>


@interface AppController : NSObject 
{
 UIWindow *window_;
 UINavigationController *navController_;
 
 CCDirectorIOS *director_;   // weak ref
}

@property (nonatomic, retain) UIWindow *window;
@property (readonly) UINavigationController *navController;
@property (readonly) CCDirectorIOS *director;

@end
AppDelegate.mm内にiAdSingleton.hをimportし、以下を- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions内に追加
//すでに上の2つが入っていれば、下の2行をこの順番どおりで設置
// [window_ setRootViewController:navController_];
// [window_ makeKeyAndVisible];
// [[iAdSingleton sharedInstance] createAdView];
// [navController_.view addSubview:[[iAdSingleton sharedInstance] bannerView]];
以上。コメントアウト部分は適宜はずしてくださいー。
お力になれれば幸いです。