Xcode AdMob実装時 に Thread 1 SIGABRT errorがでたときの対応方法
Googleが提供しているモバイルアプリ向け広告「AdMob」をアプリに実装した際に遭遇したエラー対応のメモ。環境はXcode6.1。
photo credit: ShotokanZH via photopin cc
サマリー
1.AdMobの実装
2.AdMob実装後、実行時にThread 1 SIGABRT error
3.対応方法
1.AdMobの実装
実装にあたって必要となるのは下記の作業。
(1)AdMobのダウンロード
http://jp.admob.com/からダウンロード。GoogleAdsenseで使用しているユーザでのログインが求められる。使用していない場合は登録が必要となる。
ログイン後、自分のアプリを登録して初めて「パブリッシャーID」が与えられる。このIDはあとでコードに埋め込む必要がある。
(2)プロジェクトへ組み込み
ダウンロードしたzipを解凍し、Add-onsフォルダ意外を選択してプロジェクト組み込む。下記のように新規グループ「AdMob」を作成し、その中に組み込むとよい。
(3)ライブラリの設定
AdMobを使用するために必要な下記を、General->Linked Frameworks and Librariesにてライブラリ追加する。
- StoreKit
- AudioToolbox
- MessageUI
- SystemConfiguration
- CoreGraphics
- AdSupport
もう一つ、AddOtherにて(2)で組み込んだ「libGoogleAdMobAds.a」も追加しておく。
- libGoogleAdMobAds.a
(4)BuildSettings->otherLinkerFlagsに「-ObjC」をセット
(5)コードを書いていく。
viewController.h
#import "GADBannerView.h"
@interface ViewController : UIViewController <GADBannerViewDelegate>
{
GADBannerView *bannerView_;
}
ほかのDelegateと併行して書きたい場合は、下記のようにカンマ区切りで。
@interface ViewController : UIViewController <GKGameCenterControllerDelegate,ADBannerViewDelegate,GADBannerViewDelegate>
{
GADBannerView *bannerView_;
}
viewController.m
#import "GADBannerView.h"
viewDidLoad内
// adMob // サイズを指定して広告のインスタンス生成、ポートレイトで bannerView_ = [[GADBannerView alloc] initWithAdSize:kGADAdSizeSmartBannerPortrait]; // AdMobのパブリッシャーIDを指定 bannerView_.adUnitID = @"xxxxxxxxxxxxxxxxxxxx"; // AdMob広告を表示するUIViewController指定、広告追加 bannerView_.rootViewController = self; [self.view addSubview:bannerView_]; // 広告をビューの最下部表示 [bannerView_ setCenter:CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height-bannerView_.bounds.size.height/2)]; // 広告データ読み込み要求 [bannerView_ loadRequest:[GADRequest request]];
- (void)viewDidUnload { bannerView_.delegate = nil; [bannerView_ release]; } //loadRequest失敗 - (void)adView:(GADBannerView *)bannerView didFailToReceiveAdWithError:(GADRequestError *)error { NSLog(@"adView:didFailToReceiveAdWithError:%@", [error localizedDescription]); } //loadRequest成功 - (void)adViewDidReceiveAd:(GADBannerView *)bannerView { // 表示位置 [UIView animateWithDuration:0.3 animations:^{ bannerView.frame = CGRectMake(0.0, self.view.frame.size.height - bannerView.frame.size.height, bannerView.frame.size.width, bannerView.frame.size.height); }]; }
上記xxxxxxxxxxx...部にはAdMob登録時に取得したパブリッシャーIDを貼り付ける。ちなみにAdMobパブリッシャーIDは、GoogleAdsenseのパブリッシャーコードとは違うことに注意。
2.AdMob実装後、実行時にThread 1 SIGABRT error
上記作業後、ビルドしてみると下記の箇所にて「Thread 1 SIGABRT」エラーが。
bannerView_ = [[GADBannerView alloc] initWithAdSize:kGADAdSizeSmartBannerPortrait];
Thread 1 SIGABRTの時ってたいがいコードの記述ミスなどのような凡ミスによるエラーのイメージが多かったので、周辺のコードを時間をかけて調べたが間違いはない模様。
3.対応方法
更にいろいろ探っていくと1-(4)otherLinkerFlagsへ「-ObjC」をセットする作業に不備があったことに気付き(なぜか反映されていなかった)、そこをきちんとセットしたらエラーはすぐに解消。凡ミスが原因であったことには変わりない。
結果、下記のとおりAdMob広告が下部にきちんと表示された。個人的にはiAdに比べてコードだけの設定で済む(mainStoryBoardの設定が不要)ところがラクかなと。
あわせて読みたい
iPhoneアプリに iAdバナー と appCcloudを実装する方法 - TechNoteアプリエンジニアのマネタイズとして代表的な主題の2つの方法をメモに残す。少しだけ工夫点も盛り込んでます。photo credit:peddhapativiaph...
Xcode 「レビュー待ち」状態を自ら却下して再提出するときに気をつけること - TechNoteアプリのレビュー待ち状態で機能追加したくなり、一旦却下したくなることは誰にでもあるはず!ということで、却下〜再提出手順のメモを残す。ちなみに環境はXcode6....
Xcode validation時に「Your binary is not optimized for iPhone5」エラーが出たときの対応方法 - TechNote同じ現象が出た人のためにメモを残す。ネット上にはいろんなバージョンの情報が散らばっていて見つけにくいので。ちなみにこちらの環境はXcode6.1。View im...