美文网首页OC之路
iOS崩溃检测记录方案.md

iOS崩溃检测记录方案.md

作者: Zhang_yD | 来源:发表于2020-05-26 15:00 被阅读0次

    崩溃日志方案

    任何一个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
    …
    )
    

    相关文章

      网友评论

        本文标题:iOS崩溃检测记录方案.md

        本文链接:https://www.haomeiwen.com/subject/effvahtx.html