能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

移行期間後のFabric CrashlyticsからFirebase Crashlytics移行トラブルシュート - iOS App

序文

モバイルアプリのクラッシュ状況を集計してくれるサービスがFabric Crashlyticsが終了しFirebase Crashlyticsに移行されて久しい(Fabric Crashlyticsは2020年3月)。

企業/個人の主要アプリであればFabric Crashlyticsの終了前にサービス側の手厚いサポートの元、移行パスが用意され開発者も対処が完了しているはずだ。

一年経過した2021年3月。主要ではないアプリのなかに終了したFabric Crashlyticsのままのアプリがあることを発見する。移行はできないので一からFabric CrashlyticsからFirebase Crashlyticsへ置き換えることになるが移行時期ほど資料がないことに気づく。

この投稿ではFabric Crashlyticsの置き換え時のトラブルシュートについての対応時トラブルについて記述する。

1) 前提

Fabric Crashlyticsを採用しそのままになっているiOSアプリを持っている企業個人が対象となる。Firebase iOS SDKはミドルウェア導入サービス経由(cocoapods, SwiftPackageManager)で導入済みをミドルウェアの置き換え済みを前提としている。

cocoapodsであればPodfile中の、

pod 'Fabric'
pod 'Crashlytics'

の箇所を、

pod 'Firebase/Analytics'
pod 'Firebase/Crashlytics'

に置き換え。

pod update

でミドルウェア更新済み、Xcodeプロジェクト - のBuild Phasesにdynamic link libraryアップロードスクリプト追記ずみであるものとする。

2) Firebase コンソールでCrashlyticsの初期化できないトラブル

Firebase Crashlyticsを使い始めるためにはFirebase コンソール上でのCrashlytics疎通テストを通過する必要がある。疎通テストのためには致命的なエラー(fatal error)を呼び出せば良い。Swiftであれば、

fatalError()

を呼び出す。

もし通らない場合以下を注意する。

  • 2-a. Firebase Crashlyticsの疎通テストはiPhoneシミュレーターを呼び出す必要あり
  • 2-b. Firebaseが初期化されていないとFirebase Crashlyticsは動かない
  • 2-c. Build PhasesでFirebaseのスクリプト警告を無視している。

2-aは実機で致命的なエラーを発生させてもFirebase コンソール上でのCrashlytics疎通テストはパスできない。既存アプリだと実機で動作確認を優先することもあるがFirebase コンソール上でのCrashlytics疎通テストはiPhoneシミュレーターでのエラーしか感知しないので注意する。Firebase Crashlyticsは新規アプリ向けの導入ガイドであることに注意する。

2-bは、iPhoneシミュレーターはDebug扱いで実行されるのでプリプロセッサでDEBUG定義を条件にFirebaseの初期化を呼び出さないような工夫をしている場合は、Firebase Crashlyticsが必要とするFirebaseの初期化が存在しないのでFirebase Crashlyticsも当然のように失敗する。

#if !DEBUG
FirebaseApp.configure()
#endif

Firebase コンソール上でのCrashlytics疎通テストのタイミングだけは、DebugモードでもFirebaseの初期化を行う必要がある。

2-cはビルド中に警告されたBuild Phasesログを見過ごすパターンである。古いアプリであれば大量の警告を無視している場合があるので、Firebase Crashlyticsのスクリプトが出している警告を見過ごすことがある(なのでビルド警告は把握できる程度に減らしプロジェクトの健全性を高める必要はある)。

Firebaseのスクリプト警告でdSYM File形式について警告が出ている場合は以下のBlogを参考に修正する。

[Firebase][iOS] Firebase CrashlyticsにdSYMをアップロードしたい! | DevelopersIO

3) Firebase Analyticsを有効化する必要ない

Firebase CrashlyticsはFirebase Analytics機能の一部を借りて動作しているがFirebase Analyticsを有効化せずともFirebase Crashlyticsは利用できる。iOS14移行プライバシーポリシーに対して厳格になっているのでとる必要がない情報は得ないに越したことはない。ミドルウェアとしてはFirebase Analyticsの導入が必要だがFirebase Crashlytics自体を利用する必要はない。

4) ログの修正

ログ関数が置き換えられている。相当するログメソッドがいくつか提供されているので置き換えていく。

例えば、

CLSLogv()
sharedInstance().record(error: Error)

は、

Crashlytics.crashlytics().log()
Crashlytics.crashlytics().record(error: )

に置き換える。

5) まとめ

iOSはiTunes Connectでアプリごとのクラッシュ状況が確認できるようになったが、端末ごとのクラッシュ詳細を得られるFirebase Crashlyticsから得られる情報はアプリの問題を調べる上でアプリ開発者に重宝されていることはCrashlytics登場以来変わらずである。

ただしFirebase Crashlyticsでの導入ガイドは新参アプリ開発者向けの説明、という印象で、中級状上級者がやりがちな手順を正しく踏まないことで起きるトラブルに遭遇する可能性が新参アプリ開発者よりも多いかもしれない。特にFabric Crashlyticsを知っているアプリ開発者は手順が過去の記憶を頼りにせずFirebase Crashlytics導入ガイドに沿って Firebase Crashlyticsを組み込むことをお勧めする。

参考