Firebase Crashlytics で広告レスポンス ID をログに記録する

Firebase Crashlytics は、軽量のリアルタイム クラッシュ レポートツールで、アプリの安定性に関する問題を効率的に管理できます。また、クラッシュの高度な分類が行われ、クラッシュにつながる状況がハイライト表示されるので、トラブルシューティングに要する時間を節約できます。

このガイドでは、Crashlytics を Xcode プロジェクトに組み込んで、広告レスポンス ID をログに記録する方法を説明します。アプリで発生したクラッシュをトラブルシューティングする際には、その広告レスポンス ID を調べれば、該当する広告を AdMob の広告レビュー センターで検索してブロックできます。

ステップ 1: Firebase を iOS アプリに追加する

  1. 新しいアプリで Firebase のロギングを試す場合は、GitHub 上の iOS リポジトリの Google Mobile Ads SDK のサンプルをダウンロードまたはコピーできます。このガイドでは、バナーのサンプルを使用します。

    既存のアプリで試す場合は、アプリのバンドル ID を使って別の手順に進むことができます。ここで説明する手順は、若干の調整を加えれば、リポジトリ内の他のサンプルにも当てはまります。

  2. Firebase Crashlytics を使用するには、Firebase プロジェクトを作成し、アプリをプロジェクトに追加する必要があります。まだ作成していない場合は Firebase プロジェクトを作成し、そのプロジェクトにアプリを登録してください。

    1. Firebase コンソールの [Crashlytics] ページで、[Crashlytics を設定] をクリックします。

    2. 表示される画面で、[いいえ] > [新しい Firebase アプリを設定] をクリックします。

  3. Podfile で、Google アナリティクスと Firebase Crashlytics のポッドを追加します。

    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '8.0'
    
    target 'BannerExample' do
      use_frameworks!
      pod 'Google-Mobile-Ads-SDK'
      pod 'Firebase/Crashlytics'
      pod 'Firebase/Analytics'
    end
    
  4. Terminal かコマンド プロンプトで、次のようにポッドをインストールして更新します。

    pod install --repo-update
    
  5. Xcode の BannerExample.xcworkspace ファイルを開き、プロジェクトを読み込みます。

ステップ 2: アプリで Firebase を設定する

Swift

AppDelegate.swift に、次の行を追加します。

import UIKit

// Import the Firebase library
import FirebaseCore

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?

  func application(_ application: UIApplication,
      didFinishLaunchingWithOptions launchOptions:
          [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Configure an instance of Firebase
    FirebaseApp.configure()
    return true
  }
}

Objective-C

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

@import AppDelegate.h;

// Import the Firebase library
@import FirebaseCore;

@interface AppDelegate ()

@end

@implementation AppDelegate

‐ (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    // Initialize Firebase
    [FIRApp configure];
    return YES;
}

Xcode で [Build Settings] を開き、[Build Phases] タブをクリックします。Fabric 実行スクリプトを追加します。

ビルドフォルダをクリーンアップしたうえで、アプリをビルドして実行します。これで、Firebase ウェブ コンソールにログインし、Crashlytics ダッシュボードにアクセスできるようになります。

(省略可): 設定をテストする

クラッシュ ボタンを追加すると、ボタンを押すたびにアプリで強制的にクラッシュを発生させることができます。このテスト設定により、ステップ 3 のコードがトリガーされ、Firebase Crashlytic ダッシュボードにカスタムログが送られます。

Swift

ViewController.swift で、viewDidLoad() 関数に次の行を追加します。

    override func viewDidLoad() {
        super.viewDidLoad()
        print("Google Mobile Ads SDK version: \(GADRequest.sdkVersion())")
        bannerView.delegate = self
        bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
        bannerView.rootViewController = self
        bannerView.load(GADRequest())
        let button = UIButton(type: .roundedRect)
        button.frame = CGRect(x: 20, y: 50, width: 100, height: 30)
        button.setTitle("Crash", for: [])
        button.addTarget(self, action: #selector(self.crashButtonTapped(_:)),
            for: .touchUpInside)
        view.addSubview(button)
    }

次に、この @IBAction をクラス宣言の一番下に追加します。

    @IBAction func crashButtonTapped(_ sender: AnyObject) {
        fatalError("Test Crash Happened")
    }

Objective-C

ViewController.m で、次の行を viewDidLoad メソッドに追加します。

‐ (void)viewDidLoad {
    [super viewDidLoad];

    /// ...

    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(20, 50, 100, 30);
    [button setTitle:@"Crash" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(crashButtonTapped:)
        forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

次に、この IBAction をクラス宣言の一番下に追加します。

‐ (IBAction)crashButtonTapped:(id)sender {
    assert(NO);
}

Xcode ツールバーで [Stop] ボタンを押してから、シミュレータを通じてアプリを再起動します。アプリが読み込まれると、[Crash] ボタンをクリックできるようになります。Xcode に戻り、Crashlytics にアップロードするクラッシュログの [Play] ボタンをクリックします。

ステップ 3: 広告レスポンス ID をログに記録する

複数の広告を読み込んで異なるタイミングで表示する場合は、それぞれの広告レスポンス ID を別々のキーで記録することをおすすめします。たとえば、このガイドではバナー広告が 1 つだけのサンプルを使います。そこで次のスニペットのように、広告レスポンス ID を banner_ad_response_id キーとして記録します。

Firebase Crashlytics では、広告の種類とイベントごとにカスタムの Key-Value ペアを複数作ることもできます。次の広告について、各広告リクエストのライフサイクル通知を参照してください。

カスタム ロギングについて詳しくは、Firebase Crashlytics のクラッシュ レポートをカスタマイズするをご覧ください。

Swift

次のコードを ViewController.swift に追加します。このコードは基本的に、adViewDidReceiveAd コールバック関数で Crashlytics.setCustomValue() 関数を使用します。

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADBannerViewDelegate {

    /// The banner view.
    @IBOutlet weak var bannerView: GADBannerView!

    override func viewDidLoad() {
       super.viewDidLoad()
       ...
       bannerView.delegate = self
       ...
    }

    /// Tells the delegate an ad request loaded an ad.
    func adViewDidReceiveAd(_ bannerView: GADBannerView) {
        if let responseInfo = bannerView.responseInfo,
                responseId = responseInfo.responseId {
            print("adViewDidReceiveAd from network:
                \(responseInfo.adNetworkClassName), response Id='\(responseId)'")
            Crashlytics.sharedInstance().setCustomValue(responseId,
                forKey: "banner_ad_response_id")
        }
    }
}

Objective-C

次のコードを ViewController.m に追加します。このコードは基本的に、adViewDidReceiveAd 関数で [FIRCrashlytics crashlytics]setCustomValue 関数を使用します。

@import GoogleMobileAds;
@interface ViewController ()

@property(nonatomic, strong) GADBannerView *bannerView;

@end

@implementation ViewController

‐ (void)viewDidLoad {
  [super viewDidLoad];

  // In this case, we instantiate the banner with desired ad size.
  self.bannerView = [[GADBannerView alloc]
      initWithAdSize:GADAdSizeBanner];

  [self addBannerViewToView:self.bannerView];
}

‐ (void)addBannerViewToView:(UIView *)bannerView {
  bannerView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:bannerView];
  [self.view addConstraints:@[
    [NSLayoutConstraint constraintWithItem:bannerView
                               attribute:NSLayoutAttributeBottom
                               relatedBy:NSLayoutRelationEqual
                                  toItem:self.bottomLayoutGuide
                               attribute:NSLayoutAttributeTop
                              multiplier:1
                                constant:0],
    [NSLayoutConstraint constraintWithItem:bannerView
                                 attribute:NSLayoutAttributeCenterX
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:self.view
                                kattribute:NSLayoutAttributeCenterX
                                multiplier:1
                                  constant:0]
                             ]];
}

- (void)adViewDidReceiveAd:(GADBannerView *)bannerView {
  NSString *adResponseId = bannerView.responseInfo.responseId;
  if (adResponseId) {
    NSLog(@"adViewDidReceiveAd from network: %@ with response Id: %@",
        bannerView.responseInfo.adNetworkClassName, adResponseId);
    [[FIRCrashlytics crashlytics] setCustomValue:adResponseId
                                          forKey:@"banner_ad_response_id"];
  }
}

@end

これで、Crashlytics ダッシュボードにあるクラッシュ セッションのキーセクションに最新の adResponseId が表示されるようになります。なお、キーによってはダッシュボードに表示されるまでに 1 時間ほどかかる場合があります。