使用第三方庫實現 iOS 異常捕獲能大幅簡化開發流程,主流庫如 PLCrashReporter、KSCrash、Bugly(騰訊)、Firebase Crashlytics(谷歌)等已封裝好信號捕獲、Mach 異常處理、OC/Swift 異常攔截邏輯,以下以PLCrashReporter(輕量級、開源)和Bugly(集成便捷、可視化分析)為例,詳解集成與使用方法:
一、使用 PLCrashReporter(開源輕量級)
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)獲取崩潰日誌
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)符號還原
bash
運行
atos -arch arm64 -o YourApp.app.dSYM/Contents/Resources/DWARF/YourApp -l 0x100000000 0x100004abc
二、使用 Bugly(騰訊,集成便捷 + 可視化分析)
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 監控
三、使用 Firebase Crashlytics(谷歌,跨平台支持)
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() // 測試崩潰捕獲
四、第三方庫核心原理(共性)
五、注意事項
總結
- 輕量級需求:PLCrashReporter(開源可控);
- 可視化分析 + 便捷集成:Bugly/Crashlytics(無需關心底層實現,專注業務);
- 跨平台項目:Firebase Crashlytics(支持 iOS/Android/Flutter)。只需按文檔完成集成,即可自動捕獲崩潰、異常,並通過後台分析定位問題根源。