このガイドでは、Firebase Crashlytics SDK を使用してクラッシュ レポートをカスタマイズする方法について説明します。デフォルトでは、Crashlytics はアプリのすべてのユーザーのクラッシュ レポートを自動的に収集します (自動クラッシュ レポートをオフにして、代わりにユーザーのオプトイン レポートを有効にすることができます)。 Crashlytics には、すぐに使用できる 4 つのロギング メカニズムが用意されています。カスタム キー、カスタム ログ、ユーザー識別子、キャッチされた例外です。
カスタム キーを追加する
カスタム キーは、クラッシュにつながるアプリの特定の状態を取得するのに役立ちます。任意のキーと値のペアをクラッシュ レポートに関連付けてから、カスタム キーを使用して、Firebase コンソールでクラッシュ レポートを検索およびフィルタリングできます。
- Crashlytics ダッシュボードで、カスタム キーに一致する課題を検索できます。
- コンソールで特定の問題を確認している場合、各イベントに関連付けられているカスタム キーを表示し ( [キー] サブタブ)、カスタム キーでイベントをフィルター処理することもできます (ページ上部の [フィルター] メニュー)。
キーと値のペアを設定するには、 setCustomValue
メソッドを使用します。例えば:
迅速
// Set int_key to 100. Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key") // Set str_key to "hello". Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")
Objective-C
整数、ブール値、または浮動小数点数を設定するときは、値を@( value )
としてボックス化します。
// Set int_key to 100. [[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"]; // Set str_key to "hello". [[FIRCrashlytics crashlytics] setCustomValue:@"hello" forKey:@"str_key"];
キーを呼び出して別の値に設定することで、既存のキーの値を変更することもできます。例えば:
迅速
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key") // Set int_key to 50 from 100. Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")
Objective-C
[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"]; // Set int_key to 50 from 100. [[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];
唯一のパラメーターとして NSDictionary を指定してsetCustomKeysAndValues
メソッドを使用して、キーと値のペアを一括で追加します。
迅速
let keysAndValues = [ "string key" : "string value", "string key 2" : "string value 2", "boolean key" : true, "boolean key 2" : false, "float key" : 1.01, "float key 2" : 2.02 ] as [String : Any] Crashlytics.crashlytics().setCustomKeysAndValues(keysAndValues)
Objective-C
NSDictionary *keysAndValues = @{@"string key" : @"string value", @"string key 2" : @"string value 2", @"boolean key" : @(YES), @"boolean key 2" : @(NO), @"float key" : @(1.01), @"float key 2" : @(2.02)}; [[FIRCrashlytics crashlytics] setCustomKeysAndValues: keysAndValues];
カスタム ログ メッセージを追加する
クラッシュに至るイベントのコンテキストをより詳細に把握するために、カスタム Crashlytics ログをアプリに追加できます。 Crashlytics はログをクラッシュ データに関連付け、 Firebase コンソールの Crashlytics ページの [ログ] タブに表示します。
迅速
問題を特定するには、 log()
またはlog(format:, arguments:)
を使用します。メッセージを含む有用なログ出力を取得する場合は、 log()
に渡すオブジェクトがCustomStringConvertible
プロパティに準拠している必要があります。 log()
は、オブジェクトに対して定義した説明プロパティを返します。例えば:
Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \(attributesDict)")
.log(format:, arguments:)
は、 getVaList()
の呼び出しから返される値をフォーマットします。例えば:
Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))
log()
またはlog(format:, arguments:)
の使用方法の詳細については、Crashlyticsリファレンス ドキュメントを参照してください。
Objective-C
問題を特定するには、 log
またはlogWithFormat
を使用します。メッセージを含む有用なログ出力を取得する場合は、いずれかのメソッドに渡すオブジェクトでdescription
インスタンス プロパティをオーバーライドする必要があることに注意してください。例えば:
[[FIRCrashlytics crashlytics] log:@"Simple string message"]; [[FIRCrashlytics crashlytics] logWithFormat:@"Higgs-Boson detected! Bailing out... %@", attributesDict]; [[FIRCrashlytics crashlytics] logWithFormat:@"Logging a variable argument list %@" arguments:va_list_arg];
log
およびlogWithFormat
の使用方法の詳細については、Crashlyticsリファレンス ドキュメントを参照してください。
ユーザー識別子を設定する
問題を診断するには、どのユーザーが特定のクラッシュを経験したかを知ることが役立つことがよくあります。 Crashlytics には、クラッシュ レポートでユーザーを匿名で識別する方法が含まれています。
レポートにユーザー ID を追加するには、ID 番号、トークン、またはハッシュ値の形式で一意の識別子を各ユーザーに割り当てます。
迅速
Crashlytics.crashlytics().setUserID("123456789")
Objective-C
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];
設定後にユーザー識別子をクリアする必要がある場合は、値を空白文字列にリセットします。ユーザー ID をクリアしても、既存の Crashlytics レコードは削除されません。ユーザー ID に関連付けられたレコードを削除する必要がある場合は、 Firebase サポートにお問い合わせください。
致命的でない例外を報告する
Crashlytics では、アプリのクラッシュを自動的に報告するだけでなく、致命的ではない例外を記録して、アプリの次回起動時に送信することができます。
recordError
メソッドでNSError
オブジェクトを記録することにより、致命的でない例外を記録できます。 recordError
は、 [NSThread callStackReturnAddresses]
を呼び出して、スレッドのコール スタックをキャプチャします。
迅速
Crashlytics.crashlytics().record(error: error)
Objective-C
[[FIRCrashlytics crashlytics] recordError:error];
recordError
メソッドを使用する場合、 NSError
構造と、Crashlytics がデータを使用してクラッシュをグループ化する方法を理解することが重要です。 recordError
メソッドを正しく使用しないと、予期しない動作が発生する可能性があり、Crashlytics がログに記録されたアプリのエラーのレポートを制限する可能性があります。
NSError
オブジェクトには 3 つの引数があります。
-
domain: String
-
code: Int
-
userInfo: [AnyHashable : Any]? = nil
スタック トレース分析によってグループ化される致命的なクラッシュとは異なり、ログに記録されたエラーはdomain
とcode
によってグループ化されます。これは、致命的なクラッシュとログに記録されたエラーの重要な違いです。例えば:
迅速
let userInfo = [ NSLocalizedDescriptionKey: NSLocalizedString("The request failed.", comment: ""), NSLocalizedFailureReasonErrorKey: NSLocalizedString("The response returned a 404.", comment: ""), NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString("Does this page exist?", comment: ""), "ProductID": "123456", "View": "MainView" ] let error = NSError.init(domain: NSCocoaErrorDomain, code: -1001, userInfo: userInfo)
Objective-C
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"The request failed.", nil), NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The response returned a 404.", nil), NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Does this page exist?", nil), @"ProductID": @"123456", @"View": @"MainView", }; NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:-1001 userInfo:userInfo];
上記のエラーをログに記録すると、 NSSomeErrorDomain
と-1001
でグループ化された新しい問題が作成されます。同じドメインとコードの値を使用するその他のログに記録されたエラーは、同じ問題の下にグループ化されます。 userInfo
オブジェクトに含まれるデータはキーと値のペアに変換され、個々の問題内のキー/ログ セクションに表示されます。
ログとカスタム キー
クラッシュ レポートと同様に、ログとカスタム キーを埋め込んでコンテキストをNSError
に追加できます。ただし、クラッシュに添付されるログとログに記録されるエラーには違いがあります。クラッシュが発生してアプリが再起動されると、Crashlytics がディスクから取得するログは、クラッシュの時点までに書き込まれたログです。 NSError
をログに記録しても、アプリはすぐには終了しません。 Crashlytics はログに記録されたエラー レポートを次回のアプリ起動時にのみ送信し、ディスク上のログに割り当てられる容量を制限する必要があるため、 NSError
が記録された後に十分なログを記録して、Crashlytics が送信するまでに関連するすべてのログがローテーション アウトされるようにすることができます。デバイスからのレポート。 NSErrors
をログに記録し、アプリでログとカスタム キーを使用するときは、このバランスに留意してください。
パフォーマンスに関する考慮事項
NSError
のログ記録にはかなりのコストがかかる可能性があることに注意してください。呼び出しを行うと、Crashlytics はスタックの巻き戻しと呼ばれるプロセスを使用して、現在のスレッドの呼び出しスタックをキャプチャします。このプロセスは、特に DWARF 巻き戻しをサポートするアーキテクチャ (arm64 および x86) では、CPU と I/O を集中的に使用する可能性があります。アンワインドが完了すると、情報がディスクに同期的に書き込まれます。これにより、次の回線がクラッシュした場合のデータ損失が防止されます。
この API をバックグラウンド スレッドで呼び出すことは安全ですが、この呼び出しを別のキューにディスパッチすると、現在のスタック トレースのコンテキストが失われることに注意してください。
NSExceptions はどうですか?
Crashlytics には、 NSException
インスタンスを直接ログに記録して記録する機能はありません。一般に、Cocoa および Cocoa Touch API は例外セーフではありません。つまり、 @catch
を使用すると、細心の注意を払って使用した場合でも、プロセスに重大な意図しない副作用が生じる可能性があります。コード内で@catch
ステートメントを使用しないでください。このトピックに関するApple のドキュメントを参照してください。
スタック トレースをカスタマイズする
アプリが非ネイティブ環境 (C++ や Unity など) で実行されている場合は、例外モデル API を使用して、クラッシュ メタデータをアプリのネイティブ例外形式で報告できます。報告された例外は非致命的としてマークされます。
迅速
var ex = ExceptionModel(name:"FooException", reason:"There was a foo.") ex.stackTrace = [ StackFrame(symbol:"makeError", file:"handler.js", line:495), StackFrame(symbol:"then", file:"routes.js", line:102), StackFrame(symbol:"main", file:"app.js", line:12), ] crashlytics.record(exceptionModel:ex)
Objective-C
FIRExceptionModel *model = [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."]; model.stackTrace = @[ [FIRStackFrame stackFrameWithSymbol:@"makeError" file:@"handler.js" line:495], [FIRStackFrame stackFrameWithSymbol:@"then" file:@"routes.js" line:102], [FIRStackFrame stackFrameWithSymbol:@"main" file:@"app.js" line:12], ]; [[FIRCrashlytics crashlytics] recordExceptionModel:model];
カスタム スタック フレームは、アドレスだけで初期化することもできます。
迅速
var ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.") ex.stackTrace = [ StackFrame(address:0xfa12123), StackFrame(address:12412412), StackFrame(address:194129124), ] crashlytics.record(exceptionModel:ex)
Objective-C
FIRExceptionModel *model = [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."]; model.stackTrace = @[ [FIRStackFrame stackFrameWithAddress:0xfa12123], [FIRStackFrame stackFrameWithAddress:12412412], [FIRStackFrame stackFrameWithAddress:194129124], ]; [[FIRCrashlytics crashlytics] recordExceptionModel:model];
オプトイン レポートを有効にする
デフォルトでは、Crashlytics はアプリのすべてのユーザーのクラッシュ レポートを自動的に収集します。ユーザーが送信するデータをより詳細に制御できるようにするには、自動レポートを無効にし、コードで選択した場合にのみデータを Crashlytics に送信することで、オプトイン レポートを有効にすることができます。
Info.plist
ファイルに新しいキーを追加して、自動収集をオフにします。- キー:
FirebaseCrashlyticsCollectionEnabled
- 値:
false
- キー:
実行時に Crashlytics データ コレクションのオーバーライドを呼び出して、選択したユーザーのコレクションを有効にします。オーバーライド値はアプリの起動後も保持されるため、Crashlytics は自動的にレポートを収集できます。
自動クラッシュ レポートをオプトアウトするには、オーバーライド値として
false
を渡します。false
に設定すると、新しい値はアプリの次回の実行まで適用されません。迅速
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Objective-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
Crash Insights データの管理
Crash Insights は、匿名化されたスタック トレースを他の Firebase アプリからのトレースと比較し、問題がより大きな傾向の一部であるかどうかを知らせることで、問題の解決に役立ちます。多くの問題について、Crash Insights はクラッシュのデバッグに役立つリソースも提供します。
Crash Insights は、集約されたクラッシュ データを使用して、一般的な安定性の傾向を特定します。アプリのデータを共有したくない場合は、 Firebase コンソールの Crashlytics の問題リストの上部にあるCrash Insightsメニューから Crash Insights をオプトアウトできます。