iOS 使用NSSetUncaughtExceptionHand

作者: 卢叁 | 来源:发表于2020-08-28 15:58 被阅读0次

    在iOS程序崩溃时,一般我们是用Bugtags、Bugly、友盟等第三方收集崩溃,其实官方提供的NSUncaughtExceptionHandler来收集crash信息。实现方式如下:
    自定义一个UncaughtExceptionHandler类,在.h中:

    @interface CustomUncaughtExceptionHandler : NSObject
    
    + (void)setDefaultHandler;
    + (NSUncaughtExceptionHandler *)getHandler;
    
    @end
    

    在.m中实现:

    #import "CustomUncaughtExceptionHandler.h"
    
    // 沙盒的地址
    NSString * applicationDocumentsDirectory() {
        return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    }
     
    
    // 崩溃时的回调函数
    void UncaughtExceptionHandler(NSException * exception) {
        NSArray * arr = [exception callStackSymbols];
        NSString * reason = [exception reason]; // // 崩溃的原因  可以有崩溃的原因(数组越界,字典nil,调用未知方法...) 崩溃的控制器以及方法
        NSString * name = [exception name];
        NSString * url = [NSString stringWithFormat:@"crash报告\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[arr componentsJoinedByString:@"\n"]];
        NSString * path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"crash.txt"];
        // 将一个txt文件写入沙盒
        [url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
     }
    
    @implementation CustomUncaughtExceptionHandler
        
     + (void)setDefaultHandler {
        NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
    }
     
    + (NSUncaughtExceptionHandler *)getHandler {
        return NSGetUncaughtExceptionHandler();
    }
    
    @end
    

    这样我们就实现好了一个自定义UncaughtExceptionHandler类,接下来只需要在合适的地方获取crash文件以及传到服务器上去即可,如下所示:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        
        //崩溃日志
        [CustomUncaughtExceptionHandler setDefaultHandler];
        //获取崩溃日志,然后发送
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *dataPath = [path stringByAppendingPathComponent:@"crash.txt"];
        NSData *data = [NSData dataWithContentsOfFile:dataPath];
        if (data != nil) {
             //发送崩溃日志
            NSLog(@"crash了:%@",data);
        }
     }
    

    相关文章

      网友评论

        本文标题:iOS 使用NSSetUncaughtExceptionHand

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