使用第三方庫實現 iOS 異常捕獲能大幅簡化開發流程,主流庫如 PLCrashReporterKSCrashBugly(騰訊)、Firebase Crashlytics(谷歌)等已封裝好信號捕獲、Mach 異常處理、OC/Swift 異常攔截邏輯,以下以PLCrashReporter(輕量級、開源)和Bugly(集成便捷、可視化分析)為例,詳解集成與使用方法:

一、使用 PLCrashReporter(開源輕量級)

PLCrashReporter 是老牌崩潰捕獲庫,支持捕獲信號、Mach 異常、OC 異常,生成崩潰日誌並支持符號還原。

1. 集成方式(Swift Package Manager)

  • 打開 Xcode,File > Add Packages,輸入倉庫 URL:
    plaintext
https://github.com/microsoft/plcrashreporter
  • 選擇最新版本,添加到項目 Target。

2. 核心使用步驟

(1)初始化並啓動監控

swift

import PLCrashReporter

class CrashManager {
    static let shared = CrashManager()
    private let crashReporter: PLCrashReporter
    
    private init() {
        // 配置捕獲類型:信號、Mach異常、OC異常
        let config = PLCrashReporterConfig(signalHandlerType: .BSD, 
                                          exceptionHandlerType: .Mach | .NSException)
        crashReporter = PLCrashReporter(configuration: config)!
    }
    
    func startMonitoring() {
        // 啓動崩潰監控
        do {
            try crashReporter.enableAndReturnError()
        } catch {
            print("啓動崩潰監控失敗:\(error)")
        }
    }
}

// 在App啓動時調用(如AppDelegate或main函數)
CrashManager.shared.startMonitoring()
(2)獲取崩潰日誌

App 下次啓動時,檢查是否存在上次崩潰的日誌:

swift

func checkCrashReport() {
    guard CrashManager.shared.crashReporter.hasPendingCrashReport() else {
        return
    }
    
    // 讀取崩潰日誌
    do {
        let reportData = try CrashManager.shared.crashReporter.loadPendingCrashReportDataAndReturnError()
        let report = try PLCrashReport(data: reportData)
        
        // 轉換為可讀字符串(或上傳服務器)
        let text = PLCrashReportTextFormatter.stringValue(for: report, 
                                                         with: .standard)
        print("崩潰日誌:\(text)")
        
        // 上傳日誌到服務器(示例:通過網絡請求)
        uploadCrashReport(text: text)
        
        // 刪除已處理的日誌
        CrashManager.shared.crashReporter.purgePendingCrashReport()
    } catch {
        print("讀取崩潰日誌失敗:\(error)")
    }
}

// App啓動後調用
checkCrashReport()
(3)符號還原

崩潰日誌中的地址需通過dSYM文件還原為類名 / 方法名,可使用atos工具:

bash

運行

atos -arch arm64 -o YourApp.app.dSYM/Contents/Resources/DWARF/YourApp -l 0x100000000 0x100004abc

二、使用 Bugly(騰訊,集成便捷 + 可視化分析)

Bugly 是一站式崩潰監控平台,支持自動捕獲崩潰、ANR、自定義異常,提供可視化後台分析崩潰原因。

1. 集成步驟(CocoaPods)

  • 安裝:在Podfile添加

    ruby
pod 'Bugly'
  • 執行pod install

2. 配置與初始化

  • 登錄Bugly 官網,創建 iOS 應用,獲取App ID
  • AppDelegate中初始化:swift
import Bugly

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 初始化Bugly
    let config = BuglyConfig()
    config.debugMode = true // 調試模式,發佈時關閉
    Bugly.start(withAppId: "你的Bugly App ID", config: config)
    return true
}

3. 功能擴展

(1)捕獲自定義異常

主動上報非崩潰異常(如業務錯誤):

swift

// 上報自定義NSException
let exception = NSException(name: .customException, reason: "用户登錄失敗", userInfo: ["code": -1])
Bugly.report(exception: exception)

// 上報Swift Error
let error = NetworkError.requestTimeout
Bugly.report(error: error)
(2)設置用户信息(輔助定位問題)

swift

Bugly.setUserIdentifier("user123") // 用户ID
Bugly.setUserTag(100) // 用户標籤
Bugly.addUserValue("VIP", forKey: "user_type") // 自定義用户屬性
(3)ANR 監控

Bugly 自動監控主線程卡頓(ANR),無需額外配置,後台可查看卡頓堆棧。

三、使用 Firebase Crashlytics(谷歌,跨平台支持)

Crashlytics 是 Firebase 生態的崩潰監控工具,支持 iOS/Android/Flutter,集成簡單且分析能力強。

1. 集成步驟

  • 在Firebase 控制枱創建項目,添加 iOS 應用並下載GoogleService-Info.plist到項目;
  • 通過 CocoaPods 集成:ruby
pod 'Firebase/Crashlytics'
pod 'Firebase/Analytics'
  • 初始化:swift
import Firebase

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

2. 關鍵功能

  • 自動捕獲崩潰:無需額外代碼,Crashlytics 自動捕獲信號、OC 異常、Swift 錯誤;
  • 自定義日誌:添加日誌輔助定位崩潰場景:swift
import FirebaseCrashlytics

Crashlytics.crashlytics().log("用户點擊了支付按鈕")
Crashlytics.crashlytics().setCustomValue("iOS 18", forKey: "system_version")
  • 主動觸發測試崩潰:swift
Crashlytics.crashlytics().crash() // 測試崩潰捕獲

四、第三方庫核心原理(共性)

無論使用哪種庫,底層都包含以下邏輯:

  1. 異常攔截:註冊信號處理器(SIGSEGV/SIGABRT等)、Mach 異常端口、OC 異常監聽(NSException);
  2. 崩潰數據收集:捕獲異常後,暫停所有線程,收集調用棧、寄存器、設備信息、系統版本等;
  3. 日誌存儲與上傳:將崩潰數據保存到本地沙盒,App 下次啓動時上傳到服務器;
  4. 符號還原:服務器端通過dSYM文件將崩潰地址轉換為可讀的類名、方法名。

五、注意事項

  1. dSYM 文件上傳:崩潰日誌需依賴dSYM文件還原符號,需確保將 Xcode 打包生成的dSYM文件上傳到第三方平台(Bugly/Crashlytics 均提供自動上傳工具);
  2. 調試模式與發佈模式:調試階段開啓庫的 debug 模式,發佈時關閉,避免性能損耗;
  3. 隱私合規:崩潰日誌中可能包含用户敏感信息(如設備 ID),需符合隱私政策,必要時脱敏處理;
  4. ANR 監控:部分庫(如 Bugly、KSCrash)支持 ANR 監控,原理是監控主線程 RunLoop 卡頓,需在配置中開啓。

總結

使用第三方庫可快速實現全量異常捕獲,推薦:

  • 輕量級需求:PLCrashReporter(開源可控);
  • 可視化分析 + 便捷集成:Bugly/Crashlytics(無需關心底層實現,專注業務);
  • 跨平台項目:Firebase Crashlytics(支持 iOS/Android/Flutter)。只需按文檔完成集成,即可自動捕獲崩潰、異常,並通過後台分析定位問題根源。