TechNote

事務屋のおぼえがき

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を実装する方法 - TechNoteiPhoneアプリに iAdバナー と appCcloudを実装する方法 - TechNote

アプリエンジニアのマネタイズとして代表的な主題の2つの方法をメモに残す。少しだけ工夫点も盛り込んでます。photo credit:peddhapativiaph...

Xcode 「レビュー待ち」状態を自ら却下して再提出するときに気をつけること - TechNoteXcode 「レビュー待ち」状態を自ら却下して再提出するときに気をつけること - TechNote

アプリのレビュー待ち状態で機能追加したくなり、一旦却下したくなることは誰にでもあるはず!ということで、却下〜再提出手順のメモを残す。ちなみに環境はXcode6....

Xcode validation時に「Your binary is not optimized for iPhone5」エラーが出たときの対応方法 - TechNoteXcode validation時に「Your binary is not optimized for iPhone5」エラーが出たときの対応方法 - TechNote

同じ現象が出た人のためにメモを残す。ネット上にはいろんなバージョンの情報が散らばっていて見つけにくいので。ちなみにこちらの環境はXcode6.1。View im...



[asin:B00NBK9KC0:detail]