Firebase Crashlytics SDK にアップグレードする

新しい公式の Firebase Crashlytics SDK を使用して、アプリで Crashlytics を設定できるようになりました。新しい Firebase Crashlytics SDK では API が改善され、他の Firebase プロダクトとの整合性が高まり、より直感的に使用できるようになりました。このガイドでは、Fabric Crashlytics SDK を新しい SDK にアップグレードする方法について説明します。必要に応じて、新しい API に伴う変更点、変更理由、コードを更新する方法についても説明します。

最近、Fabric からアプリを移行した場合は、Firebase Crashlytics SDK へのアップグレードがクラッシュ分析データに与える影響を確認してください。

ステップ 1: Firebase 構成ファイルを追加する

  1. [プロジェクトの設定] を開きます。[アプリ] カードで、構成ファイルが必要なアプリのバンドル ID をリストから選択します。
  2. [GoogleService-Info.plist をダウンロード] をクリックして、Firebase iOS 構成ファイル(GoogleService-Info.plist)を取得します。

    • Firebase iOS 構成ファイルはいつでも再ダウンロードできます。

    • 構成ファイル名に (2) のような文字が追加されていないことを確認してください。

  3. 構成ファイルを Xcode プロジェクトのルートに移動します。メッセージが表示されたら、構成ファイルをすべてのターゲットに追加するオプションを選択します。

プロジェクトに複数のバンドル ID がある場合は、Firebase コンソールで各バンドル ID を登録済みアプリに関連付けて、各アプリで固有の GoogleService-Info.plist ファイルを使用できるようにする必要があります。

ステップ 2: Firebase Crashlytics SDK を追加する

  1. CocoaPods で、すべてのターゲットの Fabric ポッドと Crashlytics ポッドを Firebase/Crashlytics ポッドに置き換えます。バージョン 4.0.0 以降を追加するようにしてください(これは、Firebase コンソールにクラッシュ レポートを表示するために必要です)。

    # Add the pod for Firebase Crashlytics
    pod 'Firebase/Crashlytics'
    # Recommended: Add the Firebase pod for Google Analytics pod 'Firebase/Analytics'
  2. Fabric Answers やサードパーティ キットの依存関係など、サードパーティの依存関係を Fabric から直接アンインストールするか削除します。

  3. ポッドをインストールして更新し、.xcworkspace ファイルを開いて Xcode でプロジェクトを確認します。

    pod install
    open your-project.xcworkspace

ステップ 3: コードを更新する

  1. Xcode でアプリを再ビルドし、再度 .xcworkspace ファイルを開きます。

  2. 次の SDK の変更点を確認して、コードを適切に更新します。


実行スクリプトと upload-symbols スクリプトが FirebaseCrashlytics に追加されました。

run スクリプトと upload-symbols スクリプトに、新しい FirebaseCrashlytics ライブラリからアクセスできるようになりました。ビルドプロセスの任意の時点で upload-symbols を呼び出すことで、dSYM を手動でアップロードできます。

また、新しい SDK に Fabric の API_KEYBUILD_SECRET が含まれなくなりました。代わりに、Crashlytics ではアプリの GoogleService-info.plist を使用してアプリを Firebase プロジェクトに関連付け、履歴クラッシュ データを保持します。

Fabric SDK

${PODS_ROOT}/Fabric/run API_KEY BUILD_SECRET
/path/to/pods/directory/Fabric/upload-symbols

Firebase Crashlytics SDK

${PODS_ROOT}/FirebaseCrashlytics/run
/path/to/pods/directory/FirebaseCrashlytics/upload-symbols

変更理由

Crashlytics では依存関係として Fabric SDK が使用されなくなったため、現在 CLI ツールを新しいライブラリに移行中です。


Crashlytics ライブラリが FirebaseCrashlytics に名前変更されました。

アプリでインポートパスを更新します。

Fabric SDK

Swift

import Crashlytics

Objective-C

@import Crashlytics

Firebase Crashlytics SDK

Swift

import FirebaseCrashlytics

Objective-C

@import FirebaseCrashlytics

変更理由

Crashlytics ライブラリの名前を変更して、他の Firebase ライブラリ(FirebaseFirestoreFirebaseAuth など)との整合性を取りました。


FirebaseCrashlytics は Fabric SDK と連動しなくなりました。

現在、Firebase Crashlytics SDK で初期化できるのは FirebaseCrashlytics のみです。FirebaseCrashlytics のインスタンスを起動するには、Swift では FirebaseApp.configure を、Objective-C では [FIRApp configure] を呼び出します。

application:didFinishLaunchingWithOptions 内の Fabric.withstartWithAPIKey の呼び出しを FirebaseApp の呼び出しに置き換えます。

Fabric SDK

Swift

Fabric.with([Crashlytics.self])

Objective-C

[Fabric with:@[[Crashlytics class]]];
+ startWithAPIKey:
+ startWithAPIKey:delegate:

Firebase Crashlytics SDK

Swift

FirebaseApp.configure()

Objective-C

[FIRApp configure];

変更理由

これらの新しいメソッドを使用して Crashlytics を初期化することで、他の Firebase サービスの初期化方法との整合性を高めました。


crash メソッドと throwException メソッドが削除されました。

新しい SDK に、crash メソッドと throwException メソッドが含まれなくなりました。代わりに、Swift では fatalError、Objective-C では空の配列を使用して強制的にクラッシュを発生させます。

Firebase Crashlytics SDK

Swift

// Force a test crash
fatalError()

Objective-C

// Force a test crash
@[][1];

変更理由

さまざまな理由で多様なクラッシュが発生する可能性がありますが、これらのメソッドでは、クラッシュが実行中に発生したのか、それともアプリのネイティブ SDK で発生したのかが明確に特定されませんでした。


sharedInstance が crashlytics に名前変更されました。

新しい SDK に sharedInstance メソッドが含まれなくなりました。Crashlytics を初期化するには、代わりに crashlytics を使用します(詳細については、Swift または Objective-C のリファレンス ドキュメントをご覧ください)。アプリのデリゲートで、初期化スクリプトを更新します。

Fabric SDK

Swift

Crashlytics.sharedInstance()

Objective-C

[Crashlytics sharedInstance];

Firebase Crashlytics SDK

Swift

Crashlytics.crashlytics()

Objective-C

[FIRCrashlytics crashlytics];

変更理由

他のFirebase SDK との整合性を取るため、インスタンス ゲッター メソッドの名前を変更しました。


Crashlytics は広告 ID が変更されても ID のローテーションを行わなくなりました。

Crashlytics では、広告 ID ではなくインスタンス ID を使用してアプリのインスタンスを識別し、ユーザーのデータをデバイスに関連付けるようになりました。インスタンス ID を使用すると、ユーザーが自分のアプリデータを管理できるようサポートできます。

変更理由

インスタンス ID を使用して他の Firebase SDK との整合性を取りました。現在、他のすべての Firebase サービスでインスタンス ID データを一律に管理できるようになっています。


setUserIdentifier が setUserID になり、setUserName と setUserEmail が削除されました。

これまでは、setUserNamesetUserEmail を使用してクラッシュに関連付ける名前またはメールを設定していましたが、これらのメソッドは定義されなくなりました。ユーザー ID を設定するには、setUserID を使用することをおすすめします。

Fabric SDK

Swift

Crashlytics.sharedInstance().setUserIdentifier("user_id")

Crashlytics.sharedInstance().setUserEmail("user_email")

Crashlytics.sharedInstance().setUserName("user_name")

Objective-C

[[Crashlytics sharedInstance] setUserIdentifier:@"user_id"];

[[Crashlytics sharedInstance] setUserEmail:@"user_email"];

[[Crashlytics sharedInstance] setUserName:@"user_name"];

Firebase Crashlytics SDK

Swift

Crashlytics.crashlytics().setUserID("user_id")

Objective-C

[[FIRCrashlytics crashlytics] setUserID:@"user_id"];

変更理由

他の Firebase API との整合性を取るために、メソッド名 setUserID を採用しました。また、Crashlytics で個人情報(PII)がログに記録されないように、setUserNamesetUserEmail を削除しました。


CLSLogv と CLSNSLogv が一連のロギング関数に置き換えられました。

新しい SDK には CLSLogv 関数も CLSNSLogv 関数も含まれなくなりました。カスタム ログメッセージを追加するには、Crashlytics ライブラリに含まれる新しい一連のロギング メソッドを使用します。これらの新しいメソッドでは、stdoutNSLog への出力は行われません(この動作を維持する場合は、ラッパーを作成することをおすすめします)。

Fabric SDK

Swift

CLSLogv("%@, %@", getVaList([first_arg, second_arg]))

CLSNSLogv("%@, %@", getVaList([first_arg, second_arg]))

Objective-C

CLSLog(@"%@, %@", first_arg, second_arg);
CLSNSLog(@"%@, %@", first_arg, second_arg);

CLSLogv(@"%@, %@", args_va_list);
CLSNSLogv(@"%@, %@", args_va_list);

CLS_LOG(@"%@, %@", first_arg, second_arg);

Firebase Crashlytics SDK

Swift

Crashlytics.crashlytics().log("\(first_arg), \(second_arg)")

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList([first_arg, second_arg]))

Objective-C

[[FIRCrashlytics crashlytics] log:@"first_arg, second_arg"];

[[FIRCrashlytics crashlytics] logWithFormat:@"%@, %@", first_arg, second_arg];

CLS_LOG を使用していた場合、引き続きファイル名と行番号をログ ステートメントで取得するには、ヘッダー ファイルに次のコードを追加します。

#define CLS_LOG(__FORMAT__, ...) [[FIRCrashlytics crashlytics] logWithFormat:@"%s line %d $ " __FORMAT__, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__]

変更理由

これらの新しいメソッドではインスタンスが必要なため、コードのテストが容易になります。


setObjectValue、setIntValue、setFloatValue、setBoolValue が setCustomValue に置き換えられました。

新しい SDK にはカスタム セッター メソッドが含まれなくなりました。これまでは、これらのメソッドを使用して、クラッシュ レポートとともに送信する Key-Value ペアを設定していました。現在は、すべてのデータ型に対応する setCustomValue:forKey を使用して Key-Value ペアを設定できます。

Fabric SDK

Swift

Crashlytics.sharedInstance().setObjectValue("value", forKey: "object_key")

Crashlytics.sharedInstance().setIntValue(100, forKey: "int_key")

Crashlytics.sharedInstance().setFloatValue(99.9, forKey: "float_key")

Crashlytics.sharedInstance().setBoolValue(true, forKey: "bool_key")

Objective-C

[[Crashlytics sharedInstance] setObjectValue:@"key" forKey:@"object_key"];

[[Crashlytics sharedInstance] setIntValue:100 forKey:@"int_key"];

[[Crashlytics sharedInstance] setFloatValue:99.9 forKey:@"float_key"];

[[Crashlytics sharedInstance] setBoolValue:YES forKey:@"bool_key"];

Firebase Crashlytics SDK

Swift

Crashlytics.crashlytics().setCustomValue("value", forKey: "object_key")

Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

Crashlytics.crashlytics().setCustomValue(99.9, forKey: "float_key")

Crashlytics.crashlytics().setCustomValue(true, forKey: "bool_key")

Objective-C

[[FIRCrashlytics crashlytics] setCustomValue:@"value" forKey:@"object_key"];

[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

[[FIRCrashlytics crashlytics] setCustomValue:@(99.9) forKey:@"float_key"];

[[FIRCrashlytics crashlytics] setCustomValue:@YES forKey:@"bool_key"];

変更理由

新しいメソッド名を Crashlytics に固有のものにして、Crashlytics が Key-Value 準拠でないことを明確にしました。


recordCustomExceptionName:reason:frameArray: が Exception Model API に置き換えられました。

アプリをネイティブでない環境(JavaScript、Unity など)で実行する場合、Exception Model API を使用すると、アプリのネイティブ例外フォーマットでクラッシュ メタデータを報告できます。

Fabric SDK

Swift

let topFrame = CLSStackFrame() topFrame.symbol = "doSomethingBad" topFrame.fileName = "bad.cc" topFrame.lineNumber = 23

let middleFrame = CLSStackFrame()
middleFrame.symbol = "doOtherStuff"
middleFrame.fileName = "stuff.cc"
middleFrame.lineNumber = 23;

let bottomFrame = CLSStackFrame()
bottomFrame.symbol = "main"
bottomFrame.fileName = "main.cc"
bottomFrame.lineNumber = 123

Crashlytics.sharedInstance().recordCustomExceptionName("FooException",
                                                       reason: "There was a foo.",
                                                       frameArray: [topFrame, middleFrame, bottomFrame])

Objective-C

CLSStackFrame *topFrame = [[CLSStackFrame alloc] init];
topFrame.symbol = @"doSomethingBad";
topFrame.fileName = @"bad.cc";
topFrame.lineNumber = 23;

CLSStackFrame *middleFrame = [[CLSStackFrame alloc] init];
middleFrame.symbol = @"doOtherStuff";
middleFrame.fileName = @"stuff.cc";
middleFrame.lineNumber = 23;

CLSStackFrame *bottomFrame = [[CLSStackFrame alloc] init];
bottomFrame.symbol = @"main";
bottomFrame.fileName = @"main.cc";
bottomFrame.lineNumber = 123;

[[Crashlytics sharedInstance] recordCustomExceptionName:@"FooException"
                                                 reason:@"There was a foo."
                                             frameArray:@[topFrame, middleFrame, bottomFrame]];

Firebase Crashlytics SDK

Swift

var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame.init(symbol:"makeError" fileName:"handler.js" lineNumber:495),
  StackFrame.init(symbol:"then" fileName:"routes.js" lineNumber:102),
  StackFrame.init(symbol:"main" fileName:"app.js" lineNumber:12),
]

crashlytics.record(exceptionModel:ex)

Objective-C

model.stackTrace = @[
  [FIRStackFrame stackFrameWithSymbol:@"makeError" fileName:@"handler.js" lineNumber:495],
  [FIRStackFrame stackFrameWithSymbol:@"then" fileName:@"routes.js" lineNumber:102],
  [FIRStackFrame stackFrameWithSymbol:@"main" fileName:@"app.js" lineNumber:12],
];

変更理由

長い間、この機能に対するご要望が寄せられていました。これにより、Unity、Flutter、React Native などの他のプラットフォームに Crashlytics を拡張できます。



CrashlyticsDelegate が、クラッシュ レポートを処理する別の一連のメソッドに置き換えられました。

これらの新しいメソッドを使用して、クラッシュ レポートを処理できるようになりました。

  • didFinishLaunchingWithOptions は新しいハンドラ checkForUnsentReportsWithCompletion に置き換えられました。

  • crashlyticsDidDetectReportForLastExecutiondidCrashDuringPreviousExecution に置き換えられました。didCrashDuringPreviousExecution を使用すると、アプリの前回の実行中に発生したクラッシュを簡単に検出できます。

  • crashlyticsCanUseBackgroundSessions が永続的に true に設定されるようになりました。

  • デリゲートでの CLSReport オブジェクトの検査はサポートされなくなりました。

デフォルトでは、Crashlytics は起動時に自動的にクラッシュ レポートをアップロードします。以前は didFinishLaunchingWithOptions を呼び出して、ユーザーがクラッシュ レポートにオプトインできるようにしていました。現在は、setCrashlyticsCollectionEnabled=false を呼び出して自動クラッシュ レポートを無効にすると、Crashlytics が checkForUnsentReportsWithCompletion を呼び出します。これにより、アプリのクラッシュ時にクラッシュ レポートを送信するかどうかをユーザーが選択できます。ユーザーがオプトインした場合は sendUnsentReports を呼び出し、オプトアウトした場合は deleteUnsentReports を呼び出します。

checkForUnsentReportsWithCompletion の外部で sendUnsentReportsdeleteUnsentReports を呼び出すこともできます。たとえば、ユーザーがクラッシュ レポートの送信を包括的に承認した場合、または承認しなかった場合、クラッシュ レポートを永続的に設定または無効にすることができます。アプリがライフサイクルの早い段階でクラッシュした場合は、クラッシュ レポートを受け取らないのでご注意ください。

Fabric SDK

Swift

class YourClassName: CrashlyticsDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions

    ...
    Crashlytics.sharedInstance().delegate = self
    ...

    return true
  }

  func crashlyticsDidDetectReport(forLastExecution report: CLSReport, completionHandler: @escaping (Bool) -> Void) {
    /* ... handle unsent reports */
  }

  func crashlyticsCanUseBackgroundSessions(_ crashlytics: Crashlytics) -> Bool {
    return true
  }
}

Objective-C

@interface YourClassName <CrashlyticsDelegate> ()
@end

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  ...
  [[Crashlytics sharedInstance] setDelegate:self];
  ...

  return YES;
}

-(void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler {
  // ... handle unsent reports
}

-(BOOL)crashlyticsCanUseBackgroundSessions:(Crashlytics *)crashlytics {
  return YES;
}

@end

Firebase Crashlytics SDK

Swift

/* You must set setCrashlyticsCollectionEnabled to false in order to use
checkForUnsentReportsWithCompletion. */

Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)

Crashlytics.crashlytics().checkForUnsentReports { hasUnsentReport in
  let hasUserConsent = false
  // ...get user consent.

  if hasUserConsent && hasUnsentReport {
    Crashlytics.crashlytics().sendUnsentReports()
  } else {
    Crashlytics.crashlytics().deleteUnsentReports()
  }
}

// Detect when a crash happens during your app's last run.
if Crashlytics.crashlytics().didCrashDuringPreviousExecution() {
  // ...notify the user.
}

Objective-C

/* You must set setCrashlyticsCollectionEnabled to false in order to use
checkForUnsentReportsWithCompletion. */

[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:false];

[[FIRCrashlytics crashlytics] checkForUnsentReportsWithCompletion:^(BOOL hasUnsentReports) {
  BOOL hasConsent = false;
  // ...get consent from user.

  if (hasConsent && hasUnsentReports) {
    [[FIRCrashlytics crashlytics] sendUnsentReports];
  } else {
    [[FIRCrashlytics crashlytics] deleteUnsentReports];
  }
}];

// Detect when a crash happens during your app's last run.
if ([[FIRCrashlytics crashlytics] didCrashDuringPreviousExecution]) {
  // ...notify the user.
}

変更理由

この一連の新しいメソッドを使用すると、アプリのクラッシュ レポートの動作をより細かく管理できます。また、Crashlytics を初期化する前に CrashlyticsDelegate を設定する必要もなくなります。


firebase_crashlytics_collection_enabled が FirebaseCrashlyticsCollectionEnabled に置き換えられました。

Info.plistFirebaseCrashlyticsCollectionEnabled を false に設定すると、Crashlytics は起動時にクラッシュ レポートの自動送信を停止します。アプリの初回実行後に Crashlytics.hsetCrashlyticsCollectionEnabledfalse に設定してクラッシュ レポートを無効にすることもできますが、setCrashlyticsCollectionEnabled はこのフラグをオーバーライドします。

自動収集を無効にするには、Info.plistfirebase_crashlytics_collection_enabled キーを次のキーに置き換えます。

  • キー: FirebaseCrashlyticsCollectionEnabled

  • 値: false

アプリの初回実行後に、以下のコードを Crashlytics.h に追加して自動収集を無効にすることもできます。

Firebase Crashlytics SDK

Swift

// setCrashlyticsCollectionEnabled is set to true by default.
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)

Objective-C

// setCrashlyticsCollectionEnabled is set to true by default.
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:false];

変更理由

自動クラッシュ レポートを無効にする際に、Crashlytics による未送信クラッシュ レポートの処理方法をより細かく管理できるようになりました。FirebaseCrashlyticsCollectionEnabled を false に設定した後、アプリの任意の場所から checkForUnsentReportsWithCompletion を呼び出し、ユーザーの選択に応じて未送信レポートを送信または削除できます。


Crashlytics が常にバックグラウンド セッションを使用するようになりました。

アプリでバックグラウンド セッションをサポートしない場合、これまでは crashlyticsCanUseBackgroundSessions を false に設定してバックグラウンド セッションを無効にしていました。現在、crashlyticsCanUseBackgroundSessions は常に true に設定されます。

変更理由

バックグラウンド セッションをサポートしていないバージョン 7.0 未満の iOS とバージョン X 10.9 未満の macOS がサポートされなくなりました。


Crashlytics では、Google アナリティクスによって収集されたデータのみを使用できます。

Firebase Crashlytics SDK にアップグレードした後は、Fabric Answers でデータを収集できなくなります。クラッシュの影響を受けていないユーザーとパンくずリストの指標を取得するには、Google アナリティクスを使用するように切り替えてください。Answers の過去のデータを Firebase に移行することはできません。

Google アナリティクスをアプリに追加する方法については、Google アナリティクスの使用を開始するをご覧ください。以前に Fabric Answers を使用していた場合は、Answers イベントをアナリティクス イベントに変換する方法をご覧ください。

変更理由

Google アナリティクスを使用して、クラッシュ データを詳細に分析できるようになりました。アナリティクスでは、引き続き Firebase コンソールでアプリの統計情報を収集できます。

次のステップ