MetricKit 与线上监控
问题
如何在线上监控 App 的性能和崩溃?
答案
MetricKit
iOS 13+ 提供的官方性能数据收集框架,系统自动采集,每天或及时回调:
import MetricKit
class MetricManager: NSObject, MXMetricManagerSubscriber {
func start() {
MXMetricManager.shared.add(self)
}
// 每日汇总(iOS 13+)
func didReceive(_ payloads: [MXMetricPayload]) {
for payload in payloads {
// 启动时间
let launchMetrics = payload.applicationLaunchMetrics
let avgLaunch = launchMetrics?.histogrammedTimeToFirstDraw
// 内存
let memoryMetrics = payload.memoryMetrics
let peakMemory = memoryMetrics?.peakMemoryUsage
// CPU
let cpuMetrics = payload.cpuMetrics
}
}
// 即时诊断(iOS 14+)—— 崩溃、卡出、磁盘写入异常
func didReceive(_ payloads: [MXDiagnosticPayload]) {
for payload in payloads {
// 崩溃报告
if let crashes = payload.crashDiagnostics {
for crash in crashes {
let callStack = crash.callStackTree
// 上报到服务器
}
}
// 卡顿诊断
if let hangDiagnostics = payload.hangDiagnostics {
// 主线程挂起超过一定时间
}
}
}
}
线上监控体系
| 维度 | 指标 | 工具 |
|---|---|---|
| 崩溃 | 崩溃率、Top Crash | MetricKit、Firebase Crashlytics |
| 卡顿 | 卡顿率、ANR | MetricKit hangDiagnostics |
| 启动 | TTFD(首帧耗时) | MetricKit、自定义 |
| 内存 | OOM 率、峰值内存 | MetricKit、自定义 |
| 网络 | 成功率、耗时 | URLSessionTaskMetrics |
| 电量 | CPU Wakeup、定位 | MetricKit |
Xcode Organizer
Xcode → Window → Organizer → Metrics/Crashes:查看 TestFlight 和 App Store 用户的聚合性能数据。
常见面试问题
Q1: 线上崩溃该怎么收集和分析?
答案:
- 收集:MetricKit(iOS 14+)或 Firebase Crashlytics / Sentry
- 符号化:用 dSYM 文件将内存地址转为代码行号
- 分析:按崩溃类型、影响用户数排序,优先修复 Top Crash
- 监控:版本发布后观察崩溃率是否异常