iOS偶发崩溃
某软件公司的一天上午,测试妹子来到开发面前
测试妹子:刚才程序崩溃了
开发:怎么崩溃的??
测试妹子:不知道啊,就随便点点就崩溃了
开发:你再点一次试试??
。。。。
测试妹子:不崩溃了。。是偶发的。。
各位做开发的小伙伴,上面的场景是不是很熟悉??
刚刚接触iOS开发的小伙伴遇到上面的情况一定很头疼,有一些不太负责任的人也许就直接当没事发生一样。对于这种偶发崩溃问题,各个公司都有自己的解决方案,今天我给大家介绍一下我的解决方案。
1.在程序启动的方法里设置捕获异常的监听
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);
// Override point for customization after application launch.
return YES;
}
2.实现监听方法
void UncaughtExceptionHandler(NSException *exception) {
NSDate *currentDate = [NSDate date];//获取当前时间,日期
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd-HH-mm-ss"];
NSString *dateString = [dateFormatter stringFromDate:currentDate];
NSString *system = [NSString stringWithFormat:@"iOS_%@",[UIDevice currentDevice].systemVersion];
NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息
NSString *reason = [exception reason];//非常重要,就是崩溃的原因
NSString *name = [exception name];//异常类型
NSMutableString *stackContent = [NSMutableString string];
[stackContent appendString:@"\n\nexception message:\n"];
for(NSString *stackC in arr)
{
[stackContent appendString:stackC];
[stackContent appendString:@"\n"];
}
NSString *crashStr =[NSString stringWithFormat:@"crash date : %@ \n system : %@ \n exception type : %@ \n crash reason : %@ \n call stack info : %@",dateString ,system , name, reason, stackContent];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"log"];
if (![fileManager fileExistsAtPath:filePath]) {
[fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
}
NSString *fileName = [NSString stringWithFormat:@"crash_%@", dateString];
NSString *fileNameStr = [NSString stringWithFormat:@"%@.log", fileName];
NSString *testpath = [filePath stringByAppendingPathComponent:fileNameStr];
[fileManager createFileAtPath:testpath contents:[crashStr dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
}
3.在plist文件里增加配置,允许访问沙盒目录
4.程序崩溃时,把设备连接到电脑上,打开iTunes,鼠标放在红色矩形框内向下滑动,滑动到最下面,如图
5.如图所示,点击存储到,选择一个目录就可以把日志文件导出来了
好了,拿到日志后就可以通过日志进行分析啦
第一次写文章,如果有哪里写的不对,欢迎各位小伙伴提出来哦~~