SwiftUIでFirebase Crashlyticsを使ってみる
📕Overview
公式チュートリアルの解説
このクイックスタートでは、Firebase コンソールで包括的なクラッシュ レポートを表示できるよう、Firebase Crashlytics SDK を使用してアプリに Firebase Crashlytics を設定する方法について説明します。
Crashlytics を設定するには、Firebase コンソールと IDE の両方でタスク(Firebase 構成ファイルと Crashlytics SDK の追加など)を行う必要があります。設定を完了するには、強制的にテスト クラッシュを発生させて、最初のクラッシュ レポートを Firebase に送信する必要があります。
SwiftUI用のFirebase SDKを追加する。公式にGUIで追加する動画がありましたね。
Firebase Coreがimportできないエラーが発生することがあるのでこちらの記事の通りにx-code
で設定すると、モジュールをimportできるようになります。ライブラリーと書いた方が良かったかな...
📁モジュールとは?
プログラミングにおけるモジュールとは、ソフトウェアを構成する部品のことを指します。プログラムにおいて特定の機能を持ったひとまとまりの構成要素です。
🔍この記事を参考に解決
こちらの動画を見ながら設定をしていくとわかりやすいです。
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