参考:
iOS App在发布以后获取在用户手机上的崩溃日志 – 阿P的博客
[总结]
想要自己通过代码获得崩溃日志的整体思路就是:
在didFinishLaunchingWithOptions注册一个异常处理的函数
在自己的异常处理函数中,收集和崩溃相关的(尽可能多的)信息
把信息保存到本地,以便于下次发送给自己的服务器,或者(此时不能直接调用,因为程序崩溃后,往往没有足够时间做类似于调用邮件程序发邮件的事情,所以可以保存起来,下次启动时做这类事情)调用邮件程序,发送给作为程序开发者的自己(这需要用户运行你的app调用邮件的权限)
比如:
void uncaughtExceptionHandler(NSException *exception){ NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; NSLog(@"infoDictionary==%@",infoDictionary.description); // app名称 NSString *app_Name = [infoDictionary objectForKey:@"CFBundleName"]; NSLog(@"app_Name==%@",app_Name); // app版本 NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; NSLog(@"app_Version==%@",app_Version); // app build版本 NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"]; NSLog(@"app_build==%@",app_build); //异常堆栈信息 NSArray *stackArray = [exception callStackSymbols]; // 出现异常的原因 NSString *reason = [exception reason]; // 异常名称 NSString *name = [exception name]; //userInfor NSDictionary *userInfor = [exception userInfo]; NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason === %@\nException name === %@\nException stack ==== %@\nUserInfor === %@",name, reason, stackArray,userInfor.description]; NSLog(@"%@", exceptionInfo); NSMutableArray *tmpArr = [NSMutableArray arrayWithArray:stackArray]; [tmpArr insertObject:reason atIndex:0]; //保存到本地 — 当然你可以在下次启动的时候,上传这个log [exceptionInfo writeToFile:[NSString stringWithFormat:@"%@/Documents/error.log",NSHomeDirectory()] |
或者:
/** * 实现NSUncaughtExceptionHandler方法 */ void uncaughtExceptionHandler(NSException *exception) { // 调用堆栈 NSArray *arr = [exception callStackSymbols]; // 错误reason NSString *reason = [exception reason]; // exception name NSString *name = [exception name]; // 根据自己的需求将crash信息记录下来,下次启动的时候传给服务器。 // 尽量不要在此处将crash信息上传,因为App将要退出,不保证能够将信息上传至服务器 } // AppDelegate中的方法 – (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; // 加入crash handler NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); // 模拟错误信息 NSArray *array = [NSArray arrayWithObject:@"0"]; NSLog(@"%@", [array objectAtIndex:1]); return YES; } |
或:
void UncaughtExceptionHandler(NSException *exception) { NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息 NSString *reason = [exception reason];//非常重要,就是崩溃的原因 NSString *name = [exception name];//异常类型 NSLog(@"exception type : %@ \n crash reason : %@ \n call stack info : %@", name, reason, arr); } |
自己发邮件:
NSString *crashLogInfo = [NSString stringWithFormat:@"exception type : %@ \n crash reason : %@ \n call stack info : %@", name, reason, arr]; NSString *urlStr = [NSString stringWithFormat:@"mailto://[email protected]?subject=bug报告&body=感谢您的配合!错误详情:%@",crashLogInfo]; NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; [[UIApplication sharedApplication] openURL:url]; |
转载请注明:在路上 » [整理]如何自己写代码捕获崩溃日志并保存