2021/05/11

SwiftUIでFirebase Crashlyticsを導入する

swiftswiftuifirebase

SwiftUIベースのiOSアプリにCrashlyticsを導入しました。

毎回似たような作業をするので、ログを残しておきます。

Firebaseプロジェクトを作成して設定ファイルをダウンロードする

ここをみて作業します。

  • Firebaseコンソールでプロジェクトを作成します(webアプリで利用しているGCPプロジェクトがあったため、それに紐づけて作成)
  • 作ったFirebaseプロジェクトでiOSアプリを作成する
  • 設定ファイル「GoogleService-Info.plist」をダウンロードしてiOSプロジェクトに追加します。
  • FirebaseコンソールでCrashlyticsを有効にする

Firebase SDKのインストール

SwiftPackageManagerでのインストールの方法を参照してインストールを実施

  • https://github.com/firebase/firebase-ios-sdk.gitをSwift package managerで登録(以下のモジュールを追加)(バージョンは 7.11.1)
    • FirebaseAnalytics
    • FirebaseCrashlytics
  • FirebaseAnalyticsを追加したので、-ObjCオプションをBuild SettingsOther Linker Flagsに追加
  • FirebaseCrashlytics用にビルド後にdSYMファイルをアップロードします
    • Build PhasesにてRun Script Phaseを追加して以下を実行するようにします。
      • ${BUILD_DIR%Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
      • 以下をInput filesに追加します
        • ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}
        • $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
  • Debugビルド時でもCrashlyticsを利用できるように以下の設定を変更します
    • Build SettingsDebug Information FormatDebugのものをDWARF with dSYM Fileに変更

実装

SwiftUIだと以下のような感じになりました。

  • UIApplicationDelegateAdaptorを利用してAppDelegateを作成
  • AppDelegateのなかでFirebaseApp.configure()を実行
import SwiftUI
import Firebase

@main
struct Application: App {
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class AppDelegate: NSObject, UIApplicationDelegate {
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        FirebaseApp.configure()
        return true
    }
 }

強制クラッシュ

押すと強制的にエラーになるボタンを配置して、起動後に押します。

import SwiftUI

struct ContentView: View {
    var body: some View {
        Button(action: {
            fatalError()
        }) {
            Text("Click me to raise error!")
        }
    }
}

うまくいくと、Firebaseコンソールに発生したエラーが確認できます。

以上です。