← Back to list

IOS native 設定與使用 Firebase Crashlytics 追蹤裝置錯誤原因

Crashlytics 是什麼

AndyLin · 2026-06-28 00:05 · 0 claps · 7.1 min read
#firebase-crashlytics #ios-app-development #debugging-tools #ios #swiftui
Open on Medium ↗
Wiki topics: 💻 · Programming 📱 · Mobile Development

IOS native 設定與使用 Firebase Crashlytics 追蹤裝置錯誤原因

Crashlytics 是什麼

Crashlytics 是 Firebase 提供的當機回報工具,可以幫你收集 App 在使用者裝置上的 crash、錯誤堆疊、裝置資訊、版本資訊,方便你追問題。

在 Firebase 後台 新增 IOS 專案

填入

  • Apple 軟體包 ID ( Bundle Identifier ):你的專案 Bundle Identifier
  • 應用程式暱稱:IOSDrinkProject iOS(只是 Firebase 後台顯示名稱,可自行修改)
  • App Store ID:先留空;只有 App 已上架 App Store 才填數字 ID,並不是 Apple Team ID

在專案 General 查看 Bundle Identifier

下載 GoogleService-Info.plist

下載後,把 GoogleService-Info.plist 檔案放到專案內

透過 Swift Package Manager 加入 FirebaseCrashlytics 插件

上方選單點 File → Add Package Dependencies…

在右上角搜尋框貼上:

https://github.com/firebase/firebase-ios-sdk.git

Dependency Rule 保持預設的 Up to Next Major Version,點 Add Package

把 Frameworks 加入專案

  • 點左側藍色的 IOSDrinkProject ( 專案名稱 )
  • TARGETS → IOSDrinkProject
  • 開啟 General
  • 找到 Frameworks, Libraries, and Embedded Content
  • 點下方的 +
  • 搜尋並加入:
FirebaseCrashlytics

若需要 Analytics,再加入:

FirebaseAnalytics

  • File → Packages → Resolve Package Versions
  • Product → Clean Build Folder
  • 重新 Build,讓系統開始使用新加入的 Frameworks

參考 Firebase 官方範例,修改程式啟動點

我的專案,就在 IOSDrinkProjectApp.swift 新增:

import FirebaseCore 與 FirebaseApp.configure()

import SwiftUI
import FirebaseCore

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

@main
struct IOSDrinkProjectApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self)
    private var delegate

    var body: some Scene {
        WindowGroup {
            HomeView()
        }
    }
}

需要確認是否有正常啟動,可以再加個log

參考官方文件 設定回傳 dSYM

[embed]開始使用適用於 Apple 平台的 Crashlytics | Firebase Crashlytics 這份指南專為 Apple 平台而設,說明如何開始使用 Firebase Crashlytics,包括如何新增 SDK、設定專案,以及強制發生測試當機,以便查看第一份報表。firebase.google.com

測試閃退事件有機會傳到 Firebase,但報告可能無法顯示正確的檔名、函式名稱與程式碼行數,Debug 測試尤其不完整,所以要設定 dSYM。

Build Settings → Debug Information Format

  • Debug:DWARF with dSYM File
  • Release:DWARF with dSYM File

Build Phases → + → New Run Script Phase

移到最後一個 Build Phase,在 Script 內新增:

"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run"

  • 將滑鼠放在右側 Build Phases 區域。
  • 向下捲動,不是捲 Script 程式碼框。
  • 找到 Input Files
  • Input Files 下方的 +
  • 每新增一列,就貼上一條路徑。

依序加入這 5 條:

${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}

這代表整個 dSYM 套件

${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}

這是dSYM 內真正的符號檔

${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist

dSYM 的 UUID、架構等資訊

$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist

判斷 dSYM 屬於哪個 Firebase App

$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)

對照 App 執行檔及其 UUID,避免重複上傳

如果專案已設定 User Script Sandboxing = Yes。

如果 Build Settings → Enable Debug Dylib 也是Yes,還要加入第 6 條:

${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}.debug.dylib

Xcode 新版 Debug 組態將部分程式碼放進此檔案時使用

設定完成的樣子

專案記得設定 build 版本

否則無法正確回傳錯誤報告

測試專案當機的情境

在專案內放置觸發當機的事件按鈕

Button("Crash") 
{
  atalError("Crash was triggered")
}

觸發當機事件,等待1~5分後,在後台查看錯誤訊息

像這次錯誤報告,告訴我造成當機的程式碼是在 HomeView.swift 第 20行的地方。

比對專案確認無誤,代表 Firebase Crashlytics 能正常運作了


메타데이터
post_id
79a0144cd0bd
slug
ios-native-設定與使用-firebase-crashlytics-追蹤裝置錯誤原因-79a0144cd0bd
url
https://medium.com/@croc0909/ios-native-%E8%A8%AD%E5%AE%9A%E8%88%87%E4%BD%BF%E7%94%A8-firebase-crashlytics-%E8%BF%BD%E8%B9%A4%E8%A3%9D%E7%BD%AE%E9%8C%AF%E8%AA%A4%E5%8E%9F%E5%9B%A0-79a0144cd0bd
canonical_url
https://medium.com/@croc0909/ios-native-%E8%A8%AD%E5%AE%9A%E8%88%87%E4%BD%BF%E7%94%A8-firebase-crashlytics-%E8%BF%BD%E8%B9%A4%E8%A3%9D%E7%BD%AE%E9%8C%AF%E8%AA%A4%E5%8E%9F%E5%9B%A0-79a0144cd0bd
author_url
https://medium.com/@croc0909
status
ok
fetched_at
2026-08-17 19:53:35