//
// MyUncaughtExceptionHandler.h
// ZhuGuangMaMa_Measure
//
// Created by yinbo on 2016/10/25.
// Copyright © 2016年 yinbo. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MyUncaughtExceptionHandler : NSObject
+ (void)setDefaultHandler;
+ (NSUncaughtExceptionHandler *)getHandler;
+ (void)TakeException:(NSException *) exception;
@end
//
// MyUncaughtExceptionHandler.m
// ZhuGuangMaMa_Measure
//
// Created by yinbo on 2016/10/25.
// Copyright © 2016年 yinbo. All rights reserved.
//
#import "MyUncaughtExceptionHandler.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:@"reason:\n %@\n callStackSymbols:\n%@",reason,[arr componentsJoinedByString:@"\n"]];
// NSString * url = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@",name,reason];
[[NSUserDefaults standardUserDefaults]setObject:name forKey:@"ename"];
NSString * path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"Exception.txt"];
// 将一个txt文件写入沙盒
[url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
@implementation MyUncaughtExceptionHandler
// 沙盒地址
-(NSString *)applicationDocumentsDirectory
{
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
+ (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:@"Exception.txt"];
[url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
@end
-(void)DeleaException{
[MyUncaughtExceptionHandler setDefaultHandler];
// 发送崩溃日志
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *dataPath = [path stringByAppendingPathComponent:@"Exception.txt"];
NSData *data = [NSData dataWithContentsOfFile:dataPath];
if (data != nil) {
// [self sendExceptionLogWithData:data];
NSString *str=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
// NSLog(@"异常:%@",str);
NSMutableDictionary *mdic=[[NSMutableDictionary alloc]initWithCapacity:0];
[mdic setObject:[[NSUserDefaults standardUserDefaults] valueForKey:@"ename"] forKey:@"ename"];
[mdic setObject:str forKey:@"details"];
[mdic setObject:[UIDevice currentDevice].systemVersion forKey:@"osVersion"];
[mdic setObject:@"iOS" forKey:@"osName"];
[mdic setObject:@"烛光妈妈" forKey:@"appName"];
[mdic setObject:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] forKey:@"appVersion"];
// NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];
[mdic setObject:MYUUID forKey:@"deviceSn"];
[mdic setObject:@"apple" forKey:@"deviceName"];
[mdic setObject:[[UIDevice currentDevice] model] forKey:@"deviceModel"];
SelfDataModel *selfdata=[SelfDataModel returnModelBySelectFMDB];
if (selfdata) {
[mdic setObject:selfdata.idNum forKey:@"uid"];
}
NSLog(@"%@",mdic);
NSString *url=[[HJInterfaceManager sharedInstance]Logreport];
[HJHttpManager PostRequestWithUrl:url param:mdic finish:^(NSData *data) {
NSDictionary *dic=(NSDictionary *)data;
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *dataPath = [path stringByAppendingPathComponent:@"Exception.txt"];
[[NSFileManager defaultManager]removeItemAtPath:dataPath error:nil];
NSLog(@"请求成功");
} failed:^(NSError *error) {
NSLog(@"请求失败");
}];
}
}