cocos2dにAdWhirlを実装してiAdとAdMobを切り替える

adwhirl

cocos2dで開発しているアプリにAdWhirlを実装する方法です。AdWhirlはいろんな広告配信サービスをアプリ内で切り替えられますが、今回はアップルの広告サービスのiAdとグーグルのAdMobを表示させることにしました。

今回cocos2dで開発しているアプリに広告を実装したのでそれをメモします。今回は以下のサイトにお世話になりました。非常に感謝です!
http://emeene.com/2010/10/adwhirl-cocos2d-iphone/

開発環境、各SDKのバージョンは以下の通りです。

  • XCode 4.5.1
  • iOS SDK 6.0
  • AdWhirlSDK_iOS_3.2.0
  • AdMobSDKiOS6.2.0

各サービスに登録、SDKをダウンロード

まずAdMobに登録していない場合は、登録を済まし、SDKをダウンロードします。
次に、AdWhirlに登録をします。登録をしたらログインし”Add Applicaiton”をクリックしてアプリを追加します。ここではiAdのApple IdとAdMobのpublisher idを登録します。あとでAdWhirlのSDK Keyをアプリ内に登録するのでコピーしておきます。

各SDKをプロジェクトに追加する

1.AdWhirlSDKを追加

ダウンロードしたAdWhirlSDKのディレクトリにあるAdWhirlフォルダを丸ごとプロジェクトに追加します。AdWhirlのマニュアルではここでTouchJSONフォルダも追加するように言われますが、cocos2dで既にTouchJSONを使用しているので追加する必要はありません。

2.AdWhirlのadapters内のファイルを削除

追加したフォルダ内のadaptersフォルダからiAd,AdMob関連のファイルとAdWhirlAdNetworkAdapter.h以外を削除します。

3.GoogleAdMobSDKをプロジェクトに追加

プロジェクト内に適当にフォルダを作成し、ダウンロードしたAdMobSDKのフォルダ内のAdd-onsフォルダとREADME.txt以外のファイルをプロジェクトに追加します。この時、Add to targesのチェックを忘れずに付けます。

XCode内のフレームワークを追加する

以下のフレームワークをXCodeから追加します。ターゲットの設定で、”Build Phases”の”Link Binary With Libraries”の+ボタンを押してフレームワークを追加します。

  • AddressBook.framework
  • AudioToolbox.framework
  • AVFoundation.framework
  • CoreLocation.framework
  • libsqlite3.dylib
  • libz.dylib
  • MapKit.framework
  • iAd.framework
  • QuartzCore.framework
  • SystemConfiguration.framework
  • MessageUI.framework
  • SystemConfiguration.framework
  • CoreGraphics.framework
  • AdSupport.framework

コンパイルエラーにならないように設定

この時点では大量のコンパイルエラーが発生すると思うので、いくつか設定します。

1.AdWhirlAdapterIAd.mを編集

AdWhirl/adapters/AdWhirlAdapterIAd.mに#import<iAd/ADBannerView_Deprecated.h>を追加します。

AdWhirlAdapterIAd.m

#import "AdWhirlAdapterIAd.h"
#import "AdWhirlAdNetworkConfig.h"
#import "AdWhirlView.h"
#import "AdWhirlLog.h"
#import "AdWhirlAdNetworkAdapter+Helpers.h"
#import "AdWhirlAdNetworkRegistry.h"
//**** 追加 *****
#import <iAd/ADBannerView_Deprecated.h>
 
@implementation AdWhirlAdapterIAd
 
+ (AdWhirlAdNetworkType)networkType {
  return AdWhirlAdNetworkTypeIAd;
}

2.Valid Architecturesを変更する

ターゲット設定のBuild Settings > Architectures > Valid Architecturesからarmv7sを削除し、armv7のみにします。

3.Other Linker Flagsを変更する

ターゲット設定のBuild Settings > Linking > Other Linker Flags-all_load -Objcにします。

これで無事にコンパイルが通ればプロジェクトに追加成功です!

広告表示のコーディング

コンパイルが通ったら、コーディングに移ります。編集するファイルは、AppDelegateと広告を表示させたいシーンやレイヤーのファイルです。

1.AppDelegateを編集

AppDelegate.hにviewController変数を追加します。

AppDelegate.h

#import <UIKit/UIKit.h>
 
@class RootViewController;
 
@interface AppDelegate : NSObject <UIApplicationDelegate> {
	UIWindow	        *window;
        // *** 追加 *** //
	RootViewController	*viewController;
}
 
@property (nonatomic, retain) UIWindow *window;
// *** 追加 *** //
@property (nonatomic, retain) RootViewController *viewController;
 
 
@end

次に、AppDelegate.mの@synthesizeviewControllerを追加します。

AppDelegate.m

@implementation AppDelegate
 
// *** viewControllerを追加 *** //
@synthesize window, viewController;

2.広告を表示させたいファイルを編集

広告を表示させたいファイルを編集します。ここでは、example.h、example.mとします。

example.h

#import <Foundation/Foundation.h>
#import "cocos2d.h"
 
// *** 通常のコード *** //
 
// *** 追加 *** //
#import "AdWhirlDelegateProtocol.h"
#import "RootViewController.h"
 
// *** <AdWhirlDelegate>を追加 *** //
@interface example : CCLayer <AdWhirlDelegate> {
 
    // *** 通常のコード *** //
    
    // *** 追加 *** //
    AdWhirlView *adView;
    RootViewController *viewController;
}
 
// *** 通常のコード *** //
 
// *** 追加 *** //
@property (nonatomic, retain) AdWhirlView *adView;

example.m

#import "example.h"
// *** 追加 *** //
#import "AdWhirlView.h"
#import "AppDelegate.h"
 
 
@implementation example
 
// *** 追加 *** //
@synthesize adView;
 
- (id)init {
    if (self = [super init]) {
        // *** 通常のコード *** //
    }
    return self;
}
 
- (void)dealloc {
    // *** 追加 *** //
    self.adView.delegate = nil;
    self.adView = nil;
    // *** 通常のコード *** //
    [super dealloc];
}
 
// *** ここからすべて追加 *** //
 
// 広告をクリックして全画面表示されたときに実行される関数
- (void)adWhirlWillPresentFullScreenModal {
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
}
 
// 広告の全画面表示が閉じられたときに実行される関数
- (void)adWhirlDidDismissFullScreenModal {
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
}
 
- (NSString *)adWhirlApplicationKey {
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
    // *** AdWhirlのSDK Keyを入力*** //
    return @"****************************";
}
 
- (UIViewController *)viewControllerForPresentingModalView {
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
    // *** cocos2dでは、ここをviewControllerにしないと,AdMobが機能しない *** //
    return viewController;
}
 
// 広告を受信したら実行される関数
-(void)adWhirlDidReceiveAd:(AdWhirlView *)adWhirlView {
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
    [self adjustAdSize];
}
 
// 広告のサイズを調整する関数。今回は必須ではない
-(void)adjustAdSize {
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
    CGSize screenSize = [[CCDirector sharedDirector] winSize];
    [UIView beginAnimations:@"AdResize" context:nil];
    [UIView setAnimationDuration:0.7];
    CGSize adSize = [adView actualAdSize];
    CGRect newFrame = adView.frame;
    newFrame.size.height = adSize.height;
    newFrame.size.width = screenSize.width;
    newFrame.origin.x = (self.adView.bounds.size.width - adSize.width)/2;
    newFrame.origin.y = (screenSize.height - adSize.height);
    adView.frame = newFrame;
    [UIView commitAnimations];
}
 
// 広告の受信を失敗したときに実行される関数
-(void)adWhirlDidFailToReceiveAd:(AdWhirlView *)adWhirlView usingBackup:(BOOL)yesOrNo {
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
}
 
-(void)onEnter {
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
 
    // *** 通常のコード *** //
 
    // *** ここから追加。広告を表示部分 *** //
    CGSize screenSize = [[CCDirector sharedDirector] winSize];
    viewController = [(AppDelegate*)[[UIApplication sharedApplication] delegate] viewController];
    self.adView = [AdWhirlView requestAdWhirlViewWithDelegate:self];
    self.adView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin;
    [adView updateAdWhirlConfig];
    CGSize adSize = [adView actualAdSize];
    self.adView.frame = CGRectMake((screenSize.width/2)-(adSize.width/2),screenSize.height-adSize.height,screenSize.width,adSize.height);
    self.adView.clipsToBounds = YES;
    [viewController.view addSubview:adView];
    [viewController.view bringSubviewToFront:adView];
    
    [super onEnter];
 
}
 
-(void)onExit {
    CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
 
    // ***  通常のコード *** //
 
    // ***  ここから追加。広告削除部分 *** //
    if (adView) {
        [adView removeFromSuperview];
        [adView replaceBannerViewWith:nil];
        [adView ignoreNewAdRequests];
        [adView setDelegate:nil];
        [adView release];
        adView = nil;
    }
 
    [super onExit];
}

やっとこ広告表示されました^^

このアプリでは必要なかったので、adWhirlWillPresentFullScreenModaladWhirlDidDismissFullScreenModalは空のままですが、ゲームを一時停止させたいときなどには、ここに書くといいみたいです。

コンパイルエラーが出なくなるまでかなり苦戦しましたが、コーディングの部分はわりとすんなり行きました。AdWhirl、非常に便利ですね!