Xcode AdMob実装時 に Thread 1 SIGABRT errorがでたときの対応方法

Googleが提供しているモバイルアプリ向け広告「AdMob」をアプリに実装した際に遭遇したエラー対応のメモ。環境はXcode6.1。

f:id:kojikoji75:20150112194644j:plain
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」を作成し、その中に組み込むとよい。
f:id:kojikoji75:20150112192315p:plain

(3)ライブラリの設定
AdMobを使用するために必要な下記を、General->Linked Frameworks and Librariesにてライブラリ追加する。

  • StoreKit
  • AudioToolbox
  • MessageUI
  • SystemConfiguration
  • CoreGraphics
  • AdSupport

もう一つ、AddOtherにて(2)で組み込んだ「libGoogleAdMobAds.a」も追加しておく。

  • libGoogleAdMobAds.a

(4)BuildSettings->otherLinkerFlagsに「-ObjC」をセット
f:id:kojikoji75:20150112192739p:plain

(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の設定が不要)ところがラクかなと。

f:id:kojikoji75:20150112193216p:plain

詳解 Swift

詳解 Swift

詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応

詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応

Swift離陸ガイド

Swift離陸ガイド

タイトルとURLをコピーしました