新しい公式 Firebase Crashlytics SDK を使用して、アプリで Crashlytics を設定できるようになりました。新しい Firebase Crashlytics SDK では API が改善され、他の Firebase プロダクトとの整合性が高まり、より直感的に使用できます。
このガイドでは、従来の Fabric SDK から新しい SDK にアップグレードする方法について説明します。必要に応じて、新しい API における変更点、変更理由、コードを更新する方法についても説明します。
始める前に
ステップ 1: Firebase 構成ファイルを追加する
[プロジェクトの設定] を開きます。[マイアプリ] カードで、構成ファイルが必要なアプリのバンドル ID をリストから選択します。
[GoogleService-Info.plist をダウンロード] をクリックして、Firebase Apple プラットフォーム構成ファイル(
GoogleService-Info.plist
)を取得します。Firebase Apple プラットフォーム構成ファイルはいつでも再ダウンロードできます。
構成ファイル名に
(2)
のような文字が追加されていないことを確認してください。
構成ファイルを Xcode プロジェクトのルートに移動します。メッセージが表示されたら、構成ファイルをすべてのターゲットに追加するオプションを選択します。
プロジェクトに複数のバンドル ID がある場合は、Firebase コンソールで各バンドル ID を登録済みアプリに関連付けて、各アプリで固有の GoogleService-Info.plist
ファイルを使用できるようにする必要があります。
ステップ 2: Firebase Crashlytics SDK を追加する
CocoaPods で、すべてのターゲットの
Fabric
ポッドとCrashlytics
ポッドをFirebase/Crashlytics
ポッドに置き換えます。# Add the pod for Firebase Crashlytics pod 'Firebase/Crashlytics'
# Recommended: Add the Firebase pod for Google Analytics pod 'Firebase/Analytics'Fabric Answers やサードパーティ キットの依存関係など、サードパーティの依存関係を Fabric から直接アンインストールするか削除します。
ポッドをインストールして更新し、
.xcworkspace
ファイルを開いて Xcode でプロジェクトを確認します。pod install
open YOUR_PROJECT.xcworkspace
ステップ 3: コードを更新する
Xcode でアプリを再ビルドし、再度 .xcworkspace ファイルを開きます。
次の SDK の変更点を確認して、コードを適切に更新します。
Crashlytics は Firebase インストール ID に基づいて ID をローテーションするようになりました。
Crashlytics は、Crashlytics のインストール UUID を使用してアプリのインスタンスを識別し、ユーザーのデータをデバイスに関連付けます。以前の Crashlytics では、デバイスの広告 ID が変更されたときにユーザーのインストール UUID をローテーションしていました。現在の Crashlytics では、ユーザーの Firebase インストール ID(FID)に基づいてインストール UUID をローテーションするようになっています。詳しくは、Firebase インストール ID の管理をご覧ください。
変更理由
他の Firebase SDK との整合性を取るため、FID を使用するようにしました。
実行スクリプトと upload-symbols スクリプトが FirebaseCrashlytics に追加されました。
run
スクリプトと upload-symbols
スクリプトに、新しい FirebaseCrashlytics
ライブラリからアクセスできるようになりました。ビルドプロセスの任意の時点で upload-symbols
を呼び出すことで、dSYM を手動でアップロードできます。
また、新しい SDK に Fabric の API_KEY と BUILD_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 ライブラリ(FirebaseFirestore
、FirebaseAuth
など)との整合性を取りました。
FirebaseCrashlytics は Fabric SDK と連動しなくなりました。
現在、Firebase Crashlytics SDK で初期化できるのは FirebaseCrashlytics
のみです。FirebaseCrashlytics
のインスタンスを起動するには、Swift では FirebaseApp.configure
を、Objective-C では [FIRApp configure]
を呼び出します。
application:didFinishLaunchingWithOptions
内の Fabric.with
と startWithAPIKey
の呼び出しを 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 との整合性を取るため、インスタンス ゲッター メソッドの名前を変更しました。
setUserIdentifier が setUserID になり、setUserName と setUserEmail が削除されました。
これまでは、setUserName
と setUserEmail
を使用してクラッシュに関連付ける名前またはメールアドレスを設定していましたが、これらのメソッドは定義されなくなります。ユーザー 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)がロギングされないように、setUserName
と setUserEmail
を削除しました。
CLSLogv と CLSNSLogv が一連のロギング関数に置き換えられました。
新しい SDK には CLSLogv
関数と CLSNSLogv
関数のいずれも含まれなくなりました。カスタム ログメッセージを追加するには、Crashlytics
ライブラリに含まれる新しい一連のロギング メソッドを使用します。これらの新しいメソッドでは、stdout
や NSLog
への出力は行われません(この動作を維持する場合は、ラッパーを作成することをおすすめします)。
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
に置き換えられました。crashlyticsDidDetectReportForLastExecution
はdidCrashDuringPreviousExecution
に置き換えられました。didCrashDuringPreviousExecution
を使用すると、アプリの前回の実行中に発生したクラッシュを簡単に検出できます。crashlyticsCanUseBackgroundSessions
が永続的に true に設定されるようになりました。デリゲートでの
CLSReport
オブジェクトの検査はサポートされなくなりました。
デフォルトでは、Crashlytics は起動時に自動的にクラッシュ レポートをアップロードします。以前は didFinishLaunchingWithOptions
を呼び出して、ユーザーがクラッシュ レポートをオプトインできるようにしていました。現在は、setCrashlyticsCollectionEnabled=false
を呼び出して自動クラッシュ レポートを無効にすると、Crashlytics が checkForUnsentReportsWithCompletion
を呼び出します。その結果、アプリのクラッシュ時にクラッシュ レポートを送信するかどうかをユーザーが選択できるようになります。ユーザーがオプトインした場合は sendUnsentReports
を呼び出し、オプトアウトした場合は deleteUnsentReports
を呼び出します。
checkForUnsentReportsWithCompletion
の外部で sendUnsentReports
と deleteUnsentReports
を呼び出すこともできます。たとえば、ユーザーがクラッシュ レポートの送信を包括的に承認または非承認にした場合、クラッシュ レポートを永続的にセットアップしたり無効にしたりすることができます。アプリがライフサイクルの早い段階でクラッシュした場合は、クラッシュ レポートは送信されません。
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.plist
で FirebaseCrashlyticsCollectionEnabled
を false に設定すると、Crashlytics は起動時にクラッシュ レポートの自動送信を停止します。アプリの初回実行後に Crashlytics.h
で setCrashlyticsCollectionEnabled
を false
に設定してクラッシュ レポートを無効にすることもできますが、setCrashlyticsCollectionEnabled
はこのフラグをオーバーライドします。
自動収集を無効にするには、Info.plist
で firebase_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 アナリティクスの使用を開始するをご覧ください。
変更理由
Google アナリティクスを使用して、クラッシュ データを詳細に分析できるようになりました。アナリティクスでは、引き続き Firebase コンソールでアプリの統計情報を収集できます。
次のステップ
Firebase コンソールの Crashlytics ダッシュボードにクラッシュ レポートを送信するテスト クラッシュを強制的に発生させて、実装をテストする。
クラッシュ レポートの設定をカスタマイズするために、オプトイン レポート、ログ、キー、非致命的なエラーの追跡を追加する。
アプリに Google アナリティクスを追加する。Google アナリティクスの機能と Firebase Crashlytics を組み合わせると、クラッシュの影響を受けていないユーザーの統計情報が Firebase コンソールに表示されます。