#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface MacUncaughtExceptionHandler : NSObject
+ (void)setDefaultHandler;
+ (NSUncaughtExceptionHandler *)getHandler;
+ (void)TakeException:(NSException *) exception;
@end
NS_ASSUME_NONNULL_END
#import "MacUncaughtExceptionHandler.h"
// 返回沙盒地址
NSString * applicationDocumentsDirectory()
{
return [NSSearchPathForDirectoriesInDomains (NSCachesDirectory , NSUserDomainMask , YES ) firstObject];
}
// 出现崩溃时的回调函数
void UncaughtExceptionHandler(NSException * exception)
{
NSArray * arr = [exception callStackSymbols];
// 崩溃的原因 可以有崩溃的原因(数组越界,字典nil,调用未知方法...) 崩溃的控制器以及方法
NSString * reason = [exception reason];
NSString * name = [exception name];
NSString * url = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[arr componentsJoinedByString:@"\n"]];
NSString * path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"ExceptionLog.txt"];
// 将txt文件写入沙盒
[url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
@implementation MacUncaughtExceptionHandler
+ (void)setDefaultHandler
{
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
}
+ (NSUncaughtExceptionHandler *)getHandler
{
return NSGetUncaughtExceptionHandler();
}
+ (void)TakeException:(NSException *)exception
{
NSArray * arr = [exception callStackSymbols];
NSString * reason = [exception reason];
NSString * name = [exception name];
NSString * url = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[arr componentsJoinedByString:@"\n"]];
NSString * path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"ExceptionLog.txt"];
[url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
@end
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface StatisRequestErrorData : NSObject
+ (void)showXcodeInfo;
@end
NS_ASSUME_NONNULL_END
#import "StatisRequestErrorData.h"
#import "MacUncaughtExceptionHandler.h"
@implementation StatisRequestErrorData
#pragma mark -- 崩溃日志
+ (void)showXcodeInfo{
[MacUncaughtExceptionHandler setDefaultHandler];
// 发送崩溃日志
NSString *path = [NSSearchPathForDirectoriesInDomains (NSCachesDirectory , NSUserDomainMask , YES ) firstObject];
NSString *dataPath = [path stringByAppendingPathComponent:@"ExceptionLog.txt"];
NSData *data = [NSData dataWithContentsOfFile:dataPath];
if (data != nil) {
[StatisRequestErrorData sendExceptionLogWithData:data];
}else{
NSLog(@"没有崩溃日志");
}
}
#pragma mark -- 发送崩溃日志
+ (void)sendExceptionLogWithData:(NSData *)data
{
NSLog(@"======数据上传崩溃日志成功=========");
// NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"ExceptionLog.txt"];
// [StatisRequestErrorData removeDocumentWithFilePath:path];
}
// 删除本地崩溃日志
+ (BOOL)removeDocumentWithFilePath:(NSString*)filePath{
BOOL isRemove = false;
NSFileManager* fileManager=[NSFileManager defaultManager];
if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) {
isRemove = [fileManager removeItemAtPath:filePath error:nil];
}
return isRemove;
}
@end
使用
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
//统计崩溃日志
[StatisRequestErrorData showXcodeInfo];
}