如何使用第三方库来实现iOS的异常捕获?
使用第三方库实现 iOS 异常捕获能大幅简化开发流程,主流库如 PLCrashReporter、KSCrash、Bugly(腾讯)、Firebase Crashlytics(谷歌)等已封装好信号捕获、Mach 异常处理、OC/Swift 异常拦截逻辑,以下以PLCrashReporter(轻量级、开源)和Bugly(集成便捷、可视化分析)为例,详解集成与使用方法:
一、使用 PLCrashReporter(开源轻量级)
PLCrashReporter 是老牌崩溃捕获库,支持捕获信号、Mach 异常、OC 异常,生成崩溃日志并支持符号还原。
1. 集成方式(Swift Package Manager)
- 打开 Xcode,
File > Add Packages,输入仓库 URL:plaintexthttps://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添加rubypod 'Bugly'执行pod install。
2. 配置与初始化
- 登录Bugly 官网,创建 iOS 应用,获取
App ID; - 在
AppDelegate中初始化:swiftimport 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() // 测试崩溃捕获
四、第三方库核心原理(共性)
无论使用哪种库,底层都包含以下逻辑:
- 异常拦截:注册信号处理器(
SIGSEGV/SIGABRT等)、Mach 异常端口、OC 异常监听(NSException); - 崩溃数据收集:捕获异常后,暂停所有线程,收集调用栈、寄存器、设备信息、系统版本等;
- 日志存储与上传:将崩溃数据保存到本地沙盒,App 下次启动时上传到服务器;
- 符号还原:服务器端通过
dSYM文件将崩溃地址转换为可读的类名、方法名。
五、注意事项
- dSYM 文件上传:
崩溃日志需依赖
dSYM文件还原符号,需确保将 Xcode 打包生成的dSYM文件上传到第三方平台(Bugly/Crashlytics 均提供自动上传工具); - 调试模式与发布模式:
调试阶段开启库的 debug 模式,发布时关闭,避免性能损耗;
- 隐私合规:
崩溃日志中可能包含用户敏感信息(如设备 ID),需符合隐私政策,必要时脱敏处理;
- ANR 监控:
部分库(如 Bugly、KSCrash)支持 ANR 监控,原理是监控主线程 RunLoop 卡顿,需在配置中开启。
总结
使用第三方库可快速实现全量异常捕获,推荐:
- 轻量级需求:PLCrashReporter(开源可控);
- 可视化分析 + 便捷集成:Bugly/Crashlytics(无需关心底层实现,专注业务);
- 跨平台项目:Firebase Crashlytics(支持 iOS/Android/Flutter)。
只需按文档完成集成,即可自动捕获崩溃、异常,并通过后台分析定位问题根源。

浙公网安备 33010602011771号