崩溃日志方案
任何一个app,崩溃都是无法容忍而又无法杜绝的现实。所以在崩溃的时候能够及时检测到原因尤为重要。
监控崩溃方案
在app再次启动后,进行崩溃信号监听。
void UncaughtExceptionHandler(NSException *exception) {
NSArray *callStackSymbols = [exception callStackSymbols];
NSArray *callStackReturnAddresses = [exception callStackReturnAddresses];
NSString *name = [exception name];
NSString *reason = [exception reason];
NSDictionary *userInfo = [exception userInfo];
}
+ (void)setup {
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
}
使用上述方法NSSetUncaughtExceptionHandler()可以在崩溃的时候捕获到崩溃原因,响应的栈信息等。
将设备信息和崩溃信息保存在本地,因为在此之后App就会闪退,所以只能做很少的操作。
+ (void)saveCrashFileToLocalWithInfo:(NSString *)crashInfo {
UIDevice *device = [UIDevice currentDevice];
NSString *deviceInfo = [NSString stringWithFormat:@"%@,%@%@", device.model, device.systemName, device.systemVersion];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"crashInfo"] = crashInfo;
dict[@"time"] = [NSDate.date stringWithFormat:@"yyyy-MM-dd HH:mm:ss"];
dict[@"sys"] = deviceInfo;
NSString *filePath = [self localFilePath];
[dict writeToFile:filePath atomically:YES];
}
保存的时候同时可以附加上崩溃的时间点、设备信息等。
当app再次打开后,获取本地保存的崩溃信息并上传到服务器即可。
+ (void)uploadCrashInfoToServer {
NSString *crashInfo = [self localSavingCrashInfo];
if ([crashInfo length]) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// send request
});
}
}
测试打印的数据如下:
> Crash Time
2020-05-27 11:35:49
> Device Info
iPhone,iOS13.4.1
> Crash Info
>> name:
NSInvalidArgumentException
>> reason:
*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: a)
>> callStackSymbols:
(
0 CoreFoundation 0x000000018d8f4178 9624AAFD-5437-3772-A507-0F357875808D + 1253752
1 libobjc.A.dylib 0x000000018d608c1c objc_exception_throw + 60
2 CoreFoundation 0x000000018d94d3a8 9624AAFD-5437-3772-A507-0F357875808D + 1618856
3 CoreFoundation 0x000000018d957524 9624AAFD-5437-3772-A507-0F357875808D + 1660196
4 CoreFoundation 0x000000018d7c9400 9624AAFD-5437-3772-A507-0F357875808D + 29696
5 ZZDemos 0x00000001000183b0 __20-[ZZBuglyVC makeBug]_block_invoke_4 + 128
6 UIKitCore 0x000000019102b178 66C0BDEB-71CF-3148-AF27-A5B055FAD9A5 + 369016
…
)