美文网首页
使用NSSetUncaughtExceptionHandler捕

使用NSSetUncaughtExceptionHandler捕

作者: 江湖闹士 | 来源:发表于2023-02-14 20:22 被阅读0次

iOS获取异常的方式有多种,利用第三方bugly,友盟等,苹果自己也提供的有API --> NSSetUncaughtExceptionHandler

1、创建一个捕获异常的类CustomUncaughtExceptionHandler

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface CustomUncaughtExceptionHandler : NSObject

+ (void)setDefaultHandler;
+ (NSUncaughtExceptionHandler *)getHandler;

@end

NS_ASSUME_NONNULL_END
#import "CustomUncaughtExceptionHandler.h"

@implementation CustomUncaughtExceptionHandler

//沙盒地址
NSString *applicationDocumentsDirectory() {
    return NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
}

//捕获到异常,先保存到本地
void UncaughtExceptionHandler(NSException *exception) {
    NSLog(@"%@",exception);
    NSArray *arr = [exception callStackSymbols];
    NSLog(@"%@",arr);
    NSString *name = exception.name;
    NSString *reason = exception.reason;
    NSString *url = [NSString stringWithFormat:@"crash报告\nname:%@\nreason:%@\n堆栈信息:%@",name,reason,[arr componentsJoinedByString:@"\n"]];
    NSString *path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"crash.log"];
    NSLog(@"%@",path);
    [url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}

+ (void)setDefaultHandler{
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
}

+ (NSUncaughtExceptionHandler *)getHandler {
    return NSGetUncaughtExceptionHandler();
}
@end
截屏2023-02-15 20.19.35.png 保存的堆栈信息内容

2、在AppDelegate中调用setDefaultHandler方法

- (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.log"];
    NSData *data = [NSData dataWithContentsOfFile:dataPath];
    if (data != nil) {
         //发送崩溃日志
        NSLog(@"crash了:%@",data);
        
        //上传服务器操作后,把本地文件删除
        NSFileManager *manger = [NSFileManager defaultManager];
        BOOL isDelete = [manger removeItemAtPath:path error:nil];
        if (isDelete) {
            NSLog(@"删除成功!");
        }else{
            NSLog(@"删除失败!");
        }
    }
    return YES;
}

相关文章

网友评论

      本文标题:使用NSSetUncaughtExceptionHandler捕

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