🔥

KotlinThrowableをCrashlyticsに送信する暫定方法

に公開

この記事で学べること

問題の背景

Firebase iOS SDK Issue #10030とは

KMP開発でKotlin側の例外をiOS側のFirebase Crashlyticsに送信する際、現在のFirebase iOS SDKには以下の制限があります:

  • Firebase CrashlyticsはNSErrorやExceptionModelを期待している
  • KotlinThrowableを直接渡すことができない

この問題はFirebase iOS SDK Issue #10030で議論されており、2025年11月10日現在も解決待ちの状況が続いています。

暫定回避策

NSExceptionKtライブラリを使用して、KotlinThrowable → NSException → ExceptionModelという変換を行うことで、Firebase Crashlyticsに送信します。

実装イメージ

Step 1: toNSExceptionメソッドの実装

NSExceptionKtライブラリを利用してKotlinThrowableをNSExceptionに変換する拡張関数を実装します。

import com.rickclephas.kmp.nsexceptionkt.core.InternalNSExceptionKtApi
import com.rickclephas.kmp.nsexceptionkt.core.asNSException
import platform.Foundation.NSException

@OptIn(InternalNSExceptionKtApi::class)
fun Throwable.toNSException(appendCausedBy: Boolean = false): NSException =
    asNSException(appendCausedBy)

Step 2: toExceptionModelメソッドの実装

KotlinThrowableからExceptionModelに変換するヘルパーメソッドを実装します。

import FirebaseCrashlytics

extension Throwable {
    func toExceptionModel() -> ExceptionModel {
        let exception = self.toNSException()
        return ExceptionModel(
            name: exception.name.rawValue,
            reason: exception.reason ?? "",
            callStackReturnAddresses: exception.callStackReturnAddresses
        )
    }
}

Step 3: ExceptionModelの生成

Step 2で実装したメソッドを使用してExceptionModelを生成します。

let model = kotlinThrowable.toExceptionModel()

Step 4: Firebase Crashlyticsに送信

作成したExceptionModelをFirebase Crashlyticsに送信します。

Crashlytics.crashlytics().record(exceptionModel: model)

まとめ

本記事では、KMP開発におけるKotlinThrowableをiOS側のFirebase Crashlyticsに送信する際の課題と、その暫定的な解決策について説明しました。

現在の制限事項

  • 例外チェーン情報の制限: Kotlinの例外チェーン(cause)を完全に追跡できない
  • Internal API依存: NSExceptionKtのInternal APIを使用しているため、ライブラリ更新時に動作しなくなる可能性
  • 暫定的な解決策: Firebase iOS SDK Issue #10030の根本的な解決待ち

参考資料・リンク

Discussion