🔥
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