SwiftUIでFirebase Crashlyticsを使ってみる

2024/03/31に公開

📕Overview

https://firebase.google.com/docs/crashlytics/get-started?platform=ios&hl=ja

公式チュートリアルの解説
このクイックスタートでは、Firebase コンソールで包括的なクラッシュ レポートを表示できるよう、Firebase Crashlytics SDK を使用してアプリに Firebase Crashlytics を設定する方法について説明します。

Crashlytics を設定するには、Firebase コンソールと IDE の両方でタスク(Firebase 構成ファイルと Crashlytics SDK の追加など)を行う必要があります。設定を完了するには、強制的にテスト クラッシュを発生させて、最初のクラッシュ レポートを Firebase に送信する必要があります。

SwiftUI用のFirebase SDKを追加する。公式にGUIで追加する動画がありましたね。
https://firebase.google.com/docs/ios/setup?hl=ja

Firebase Coreがimportできないエラーが発生することがあるのでこちらの記事の通りにx-codeで設定すると、モジュールをimportできるようになります。ライブラリーと書いた方が良かったかな...

📁モジュールとは?

プログラミングにおけるモジュールとは、ソフトウェアを構成する部品のことを指します。プログラムにおいて特定の機能を持ったひとまとまりの構成要素です。

🔍この記事を参考に解決

https://qiita.com/KueharX/items/3bf83bf90f9e25fd602c

こちらの動画を見ながら設定をしていくとわかりやすいです。
https://www.youtube.com/watch?v=gMvVjJTNm0Q

x-codeにスクリプトの設定を追加する。

🧷summary

Firebaseにプロジェクトを作成して、BundleIDを設定してGoogleService-info.plistを作成してダウンロードし、SwiftUIのプロジェクトに追加します。

FirebaseCoreの設定を追加:
screen shot:

code:

import SwiftUI
import FirebaseCore// add sdk code

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

    return true
  }
}

@main
struct CrashlyticsExampleApp: App {
    // add sdk code
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

ContentViewを修正する

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text("ボタンを押すとクラッシュする")
            Button(action: {
                fatalError()
            }) {
                Text("Click me to raise error!")
            }
        }
    }
}

#Preview {
    ContentView()
}

ボタンを押すと、アプリがクラッシュする!
時間がかかるが、設定が正しければFirebaseのコンソールでアプリのクラッシュログの解析がされた情報を確認することができる。

アプリが落ちるのが嫌な人はダイアログを出すコードに修正したこちらのサンプルを使ってみてください。

import SwiftUI

enum RequestResult<Success, Failure: Error> {
    case success(Success)
    case failure(Failure)
}

struct ContentView: View {
    @State private var showAlert = false
    @State private var errorMessage = ""

    var body: some View {
        VStack {
            Text("ボタンを押すとクラッシュする")

            Button(action: {
                handleButtonTap()
            }) {
                Text("Click me to raise error!")
            }
            .alert(isPresented: $showAlert) {
                Alert(title: Text("エラー"),
                      message: Text(errorMessage),
                      dismissButton: .default(Text("OK")))
            }
        }
    }

    func handleButtonTap() {
        let result: RequestResult<Void, Error> = raiseFatalError()
        switch result {
        case .success:
            break
        case .failure(let error):
            errorMessage = error.localizedDescription
            showAlert = true
        }
    }

    func raiseFatalError() -> RequestResult<Void, Error> {
        // 成功時の処理を書く
        return .failure(NSError(domain: "com.example.app", code: 0, userInfo: [NSLocalizedDescriptionKey: "Fatal error raised"]))
    }
}

#Preview {
    ContentView()
}

error log

[Firebase/Crashlytics] Version 10.23.1
nw_connection_copy_connected_local_endpoint_block_invoke [C1] Connection has no local endpoint
nw_connection_copy_connected_local_endpoint_block_invoke [C1] Connection has no local endpoint
nw_connection_copy_connected_local_endpoint_block_invoke [C3] Connection has no local endpoint
nw_connection_copy_connected_local_endpoint_block_invoke [C3] Connection has no local endpoint
nw_connection_copy_connected_local_endpoint

🧑‍🎓thoughts

今回は、SwiftUIでFirebase Crashlyticsを使ってみました。よく使われる機能なので覚えておくと役に立ちそうです。他にアプリのクラッシュした情報を収集する方法ってあるのだろうか....

Discussion