MetricKit 是 苹果在 iOS13系统开始引入的用来汇总和分析有关异常和崩溃诊断以及电源和性能指标的每个设备的报告。
当前市面上的日志开源框架,如 KSCrash,使收集PLCrashReport 等框架都有一些崩溃不能抓取;比如PLCrashReport 不能抓取栈溢出的崩溃崩溃,不能抓取SIGKILL,日志 SIGQUIT等信号量的使收集崩溃。KSCrash 对SIGKILL的崩溃崩溃抓取也只能抓取一部分
iOS14的崩溃崩溃日志是24小时会回调通知一次,时效性低;iOS15 之后,日志崩溃日志会在下次启动之后就返回,但经验证,有的会立即回调,有的则不然,规律不可琢磨
1.添加 MetricKit
2.添加 MetricKit 监听者
if (@available(iOS 14.0, *)) {
MXMetricManager *manager = [MXMetricManager sharedManager];
if (self && manager && [manager respondsToSelector:@selector(addSubscriber:)]) {
[manager addSubscriber:self];
}
}
3. 监听者实现 MXMetricManagerSubscriber 协议方法, payloadDic 里面包含着上次本应用发生的崩溃日志堆栈和信息
// 苹果如果有数据数据,注册监听之后就会回调
- (void)didReceiveDiagnosticPayloads:(NSArray<MXDiagnosticPayload *> * _Nonnull)payloads API_AVAILABLE(ios(14.0)){
if (@available(iOS 14.0, *)) {
for (MXDiagnosticPayload *payload in payloads) {
NSDictionary *payloadDic = [payload dictionaryRepresentation];
});
}
}
}
4.日志组装关键代码示例
NSArray *callStackRootFrames = [dicFrame ArrayValueForKey:kMetrkitCallStackRootFramesKey];
if (callStackRootFrames.count <= 0) {
continue;
}
NSDictionary *dicZero = [callStackRootFrames ObjectAtIndex:0];
int rootIndex = 0;
while (dicZero && dicZero.count > 0) {
NSString *binaryUUID = [dicZero stringValueForKey:kMetrkitBinaryUUIDKey];
NSString *binaryName = [dicZero stringValueForKey:kMetrkitBinaryNameKey];
long long baseAdd = [[dicZero NumberValueForKey:kMetrkitOffsetIntoBinaryTextSegmentKey] longLongValue];
long long address = [[dicZero numberValueForKey:kMetrkitAddressKey] longLongValue];
NSArray *subFrames = [dicZero arrayValueForKey:kMetrkitSubFramesKey];
[strStack appendFormat:@"%d %@ 0x%llx 0x%llx + %lld\n", rootIndex, binaryName, baseAdd, address, address - model.baseAddress];
rootIndex++;
if (subFrames && subFrames.count >= 0) {
dicZero = [subFrames ObjectAtIndex:0];
} else {
dicZero = nil;
}
JSON总格式
每一个崩溃为一个字典,具体内容为下
|terminationReason|String|崩溃原因| RBSTerminateContext domain:10 code:0x8BADF00D
explanation:scene-update watchdog transgression: application :6308
exhausted real (wall clock) time allowance of 10.00 seconds|
数组中元素为字典,详情如下
数组中元素为字典,详情如下
每一个崩溃为一个字典,具体内容为下
数组中元素为字典,详情如下
数组中元素为字典,详情如下
每一个崩溃为一个字典,具体内容为下
数组中元素为字典,详情如下
数组中元素为字典,详情如下
(责任编辑:知识)
四川阿坝州提高孤儿基本生活最低养育标准 2022年1月起执行
生源地助学贷款利息什么时候扣?生源地助学贷款怎么取消提前还款?
世界最高输电铁塔长江大跨越段全线贯通 跨越塔预计2023年6月工程投入运行
深圳去年引进外资吸收外资稳定增长 实际使用外资超100亿美元
聚利宝控股(08527.HK):李朝昌辞任独立非执行董事 3月11日起生效