事始め として取り敢えずはアップル社提供のiAd及びグーグル社提供のAdMobと言う 広告フレームワークを各実装してそれぞれ単独での広告表示は達成したのでしたが AdMobには AdMobメディエーション と言う自動広告切り替え機能が搭載されており 使うべからざるを得ないとの結論にも達していました。
全てが目論見通り機能する迄には未だ紆余曲折があるのですが 今回は上記代表的なアップル社とグーグル社の提供する広告ネットワークを 切り替えながら配信させ得た記事となります。
開発機:MacBook Air(11-inch, Mid 2013)
MacOSバージョン:OS X 10.9.1
Xcodeバージョン:5
言語:Objective-C
関連アプリ:uPanda Breaks Out Fruits
広告配信システムはXcodeフレームワークとして提供されますから フレームワークを読み込ませなければなりません。 未だObjective-Cに馴染まぬ身には唯に書式で行き詰まったりするものと思わせられたのが 今はリンク切れとなっているサイト In the Distance の2012年1月30日の記事 iPhoneアプリ広告表示-iAdとAdmobを併用する を見た際の感にて此の如き書式が有り得たのが当時は意外だったのでした。
フレームワークを提供するクラスを読み込むのは SpriteKit で構築するゲームプレイ画面ではなくて ゲームプレイ画面の土台となる ViewController です。 即ち土台のViewControllerにはゲームプレイ画面と広告画面と言う 異なるスキームの画面が並存する形になります。 この際本ブログ昨日(2016年5月28日)の記事でも参考にしたサイト Maccle の2013年3月7日の記事 AdMob Ads SDK を Xcode に追加してアプリ内に広告を表示する方法 に於いて主に表示位置関係(記事上側)を修正の参考にフレームワークの実装を進捗しています。
AdMobのメソッド名が厄介に感じたのも正直なところですが、 矢張り此処は提供元のGoogle社の Google Developers サイトも参考にすべきでしょう。 以下のリンク先にはバナーサイズと実装のための定数値が示されており 此処ではごく一般的に見られるサイズ 320x50 の横縦で此処にも 標準のバナー として示される kGADAdSizeBanner を利用しました。
バナー 2 Google Mobile Ads SDK同情報には以下コードを含む引用のように記されており参考に実装を修正して行きます。
広告のライフサイクル イベント(リクエストの失敗やクリックスルーなど)をトラッキングするには、GADBannerViewDelegate の全体や一部を実装します。@protocol GADBannerViewDelegate@optional - (void)adViewDidReceiveAd:(GADBannerView *)bannerView; - (void)adView:(GADBannerView *)bannerView didFailToReceiveAdWithError:(GADRequestError *)error; - (void)adViewWillPresentScreen:(GADBannerView *)bannerView; - (void)adViewDidDismissScreen:(GADBannerView *)bannerView; - (void)adViewWillDismissScreen:(GADBannerView *)bannerView; - (void)adViewWillLeaveApplication:(GADBannerView *)bannerView; @end
- (void)gadView:(GADBannerView *)bannerView didFailToReceiveAdWithError:(GADRequestError *)error {
此処で瑣末ながらも問題が惹起したのは 今まで何事もなく表示されていた急にAdMobが消えてなくなってしまったので 参考サイトなどからコードを引用しつつ手元の環境に合わせてカスタマイズを施す際に 定型的なメソッド名をadViewとかgadViewとか自作のプログラム変数に合わせて 何時の間にやら我知らず書き換えていたのが原因であったりしましたので 参考になる向きも若しやあるかも知れず何より己の備忘録の為に記し置きます。
参考にした部分にTypoがあってXcodeにcaution表示されるのでないかと疑義を抱くも 基本的にTypo以外は正しい記述だったので一旦は動いていたところ 正しく動作するメソッド名を書き換えてしまっていた次第。 iAdでは -(void)bannerView: とするのが不可欠でもなく其処も間違える原因だったのですが、 自己のプログラムの変数名に合わせて adView としたところ偶然 adView としないと動かないGoogleのAdMobフレームワークとバッティングしてしまっていたのでした。 iAdは近く消え去る予定にあると言え孰れ何処の環境でも起き得る問題であるかもしれません。
以上iAd優先にiAdとAdMobの自動切替を目論んでみました。 iAdをAdMobが補完する広告切替表示機能の成功時点での ヘッダファイル(.h)及び実行ファイル(.m)の概略を以下に記し置きます。 此れ等変更を以て以降更に別広告フレームワークを AdMobメディエーション対応に仕様変更するよう目論むものです。
BOPlayViewController.h
#import <iAd/iAd.h>
#import "GADBannerView.h"
@interface BOPlayViewController : UIViewController <ADBannerViewDelegate, GADBannerViewDelegate> {
ADBannerView *adView;
BOOL bannerIsVisible;
GADBannerView *gadView;
BOOL bannerIsVisible2;
}
@property (nonatomic) UIView *selfUiView;
@property (nonatomic, assign) BOOL bannerIsVisible;
@property (nonatomic, assign) BOOL bannerIsVisible2;
@end
BOPlayViewController.m
#import "BOPlayScene.h"
#import "BOViewController.h"
#import "BOAppDelegate.h"
#import "BOPlayUIView.h"
#define MY_BANNER_UNIT_ID @"ca-app-pub-***" //AdmobのPublisherIDをここに挿入
#define ANIMATION_DURATION 0.5f
#define TABBAR_HEIGHT; 270.0f //Admobの表示位置、適当な値に変更
@interface BOPlayViewController ()
@end
@implementation BOPlayViewController
@synthesize bannerIsVisible;
@synthesize bannerIsVisible2;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.navigationController setNavigationBarHidden:YES animated:NO];
// Do any additional setup after loading the view.
BOPlayUIView *selfUiView = [[BOPlayUIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.selfUiView = selfUiView;
[self.view addSubview:self.selfUiView];
/* メニュー表示 */
...(ry
/* リトライボタン表示 */
...(ry
/* SKScene表示 */
SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
spriteView.showsDrawCount = YES;
spriteView.showsNodeCount = YES;
spriteView.showsFPS = YES;
// [self.view addSubview:spriteView];
[selfUiView addSubview:spriteView];
SKScene *scene = [[BOPlayScene alloc] initWithSize:self.view.bounds.size];
[spriteView presentScene:scene];
//iAd広告を表示
adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
adView.frame = CGRectOffset(adView.frame, 0, -50); //表示させたい位置に適当な値に変更
adView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
adView.delegate=self;
self.bannerIsVisible=NO;
[self.view addSubview:adView];
//Admob広告を表示
gadView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeSmartBannerPortrait];
gadView.delegate = self;
gadView.adUnitID = MY_BANNER_UNIT_ID;
gadView.rootViewController = self;
[gadView loadRequest:[GADRequest request]];
self.bannerIsVisible2 = NO;
}
//iAdがLoadされた時のDelegateメソッド
-(void)bannerViewDidLoadAd:(ADBannerView *)banner
{
if (!self.bannerIsVisible)
{
[UIView beginAnimations:@"animateAdBannerOn" context:NULL];
// banner.frame = CGRectOffset(banner.frame, 0, -50);
banner.frame = CGRectOffset(banner.frame, 0, 50);
[UIView commitAnimations];
self.bannerIsVisible = YES;
}
}
//iAdがLoadされなかったときのDelegateメソッド
-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
if (self.bannerIsVisible)
{
[UIView beginAnimations:@"animateAdBannerOff" context:NULL];
// banner.frame = CGRectOffset(banner.frame, 0, 50);
banner.frame = CGRectOffset(banner.frame, 0, -50);
[UIView commitAnimations];
self.bannerIsVisible = NO;
}
[adView removeFromSuperview]; //iAdの取得に失敗したら、viewからremove
[self.view addSubview:gadView]; //iAdの取得に失敗したらAdmobを表示する
}
//AdmobがLoadされたときのDelegateメソッド
- (void)adViewDidReceiveAd:(GADBannerView *)view {
if (!self.bannerIsVisible2)
{
// [UIView animateWithDuration:ANIMATION_DURATION animations:^{ gadView.center = CGPointMake(gadView.center.x, gadView.center.y-TABBAR_HEIGHT);}];
[UIView animateWithDuration:ANIMATION_DURATION animations:^{ gadView.center = CGPointMake(gadView.center.x, gadView.center.y);}];
self.bannerIsVisible2 = YES;
}
}
//AdmobのLoadに失敗したとき
- (void)adView:(GADBannerView *)bannerView didFailToReceiveAdWithError:(GADRequestError *)error {
if (self.bannerIsVisible2)
{
[UIView animateWithDuration:ANIMATION_DURATION animations:^{gadView.center = CGPointMake(gadView.center.x, gadView.center.y+TABBAR_HEIGHT);}];
self.bannerIsVisible2 = NO;
}
NSLog(@"GADBannerview:didFailToReceiveAdWithError:%@", [error localizedDescription]);
}
-(void)segueTitleViewController:(id)sender {
UIViewController *topController = [[BOViewController alloc] init];
[self.navigationController pushViewController:topController animated:YES];
}
-(void)seguePlayViewController:(UIButton *)button {
/* SKScene表示 */
SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
spriteView.showsDrawCount = YES;
spriteView.showsNodeCount = YES;
spriteView.showsFPS = YES;
[self.selfUiView addSubview:spriteView];
SKScene *scene = [[BOPlayScene alloc] initWithSize:self.view.bounds.size];
[spriteView presentScene:scene];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (BOOL)prefersStatusBarHidden {
return YES;
}
@end
バージョン: 4.12
リリース: 2014年9月15日
更新: 2022年4月20日
サイズ : 10.7 MB
互換性: iOS 14.4 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。
2件のコメント
コメントは受け付けていません。