こんにちは、Pentagonでアプリ開発している鈴木です。

アプリのクラッシュ調査に便利なFirebase Crashlyticsですが、「どの画面で」「どんな操作中に」「どんなユーザーが」落ちたのか、スタックトレースだけではわからないことが多々あります。

Firebase Analyticsで画面遷移イベントなどを送信していれば、「ログとパンくずリスト」から操作の流れを追うことはできますが、ユーザーの状態をさらに詳しく把握するには、Crashlyticsにカスタム情報を送信する設定をしておくと便利です。

今回は、iOS(Swift)とAndroid(Kotlin)のそれぞれの設定方法を実例を交えて紹介します。

【こんな人に読んでほしい】

  • Firebase Crashlytics をすでに導入している iOS / Android アプリの開発者
  • スタックトレースやログを見ても原因がわからず、クラッシュ調査に苦戦している人
  • 再現性の低いバグの手がかりを少しでも多く残したいと感じている人

【この記事を読むメリット】

  • Crashlytics に任意のカスタム情報(ユーザー状態や画面名など)を送る方法がわかる
  • iOS(Swift)とAndroid(Kotlin)での具体的なコード例を確認できる
  • 送信した情報が実際にFirebaseコンソールで表示されているようすが確認できる

【結論】

Crashlytics にカスタム情報を送っておくことで、クラッシュの原因が調査しやすくなります。 iOSでは setCustomValue(_:forKey:)、AndroidではsetCustomKey()を使って、ユーザーの状態やフローのステップなどを記録できます。

【この記事の前提】

<iOS>

  • Xcode16.0
  • Swift 5.0
  • FirebaseCrashlytics 11.6.0

<Android>

  • Kotlin 1.9.x (1.9.25)
  • Android Gradle Plugin 8.0+ (8.4.0)
  • Firebase Crashlytics SDK 18.2.7

※この記事は、筆者の実際の開発体験をもとに一部生成AIで執筆しております。

実装

Android

import com.google.firebase.crashlytics.FirebaseCrashlytics

fun setCrashlyticsCustomInfo() {
    val crashlytics = FirebaseCrashlytics.getInstance()

    // 個別にキーを設定
    crashlytics.setCustomKey("device_id",deviceId)
    crashlytics.setCustomKey("user_plan", "premium")

    // Mapでまとめて設定
    val info = mapOf(
        "feature_flag" to "NewUI",
        "step" to 3
    )
    info.forEach { (key, value) ->
        crashlytics.setCustomKey(key, value.toString())
    }
}

iOS

import FirebaseCrashlytics

func setCrashlyticsCustomInfo() {
    let crashlytics = Crashlytics.crashlytics()

    // 個別にキーを設定
 crashlytics.setCustomValue(deviceId, forKey: "device_id")
    crashlytics.setCustomValue("premium", forKey: "user_plan")

    // 複数キーを一括で設定
    crashlytics.setCustomKeysAndValues([
        "feature_flag": "NewUI",
        "step": 3
    ])
}

Firebase Crashlytics コンソール上で確認

※crash_info_entry_0 のキーは、iOSの場合に、Crashlyticsによって自動的に送信されるもののようです。

注意:iOSではリリースビルドでしかクラッシュを確認できない

iOSではCrashlyticsはデフォルトでリリースビルド時のみクラッシュレポートを送信します。 そのため、Debugビルドでは fatalError() などでクラッシュさせてもコンソールには表示されますが、Firebase Console には送信されません。動作確認はリリースビルドで行ってください。

まとめ

クラッシュログは「落ちた」という事実だけでは不十分で、その瞬間アプリがどういう状態だったかがわかって初めて役に立ちます。 setCustomValuesetCustomKey をうまく使えば、Crashlyticsレポートからより多くの「再現と修正のヒント」を得ることができるようになります。