方法一: 利用苹果系统自带的崩溃日志来统计信息.
引用作者:[作者地址][1]
[1]:http://www.jianshu.com/p/ea1e6b210b27
方法二:[第三方工具]2
:下午再补充----
方法一:
- 新建一个CatchCrash类:
CatchCrash.h
#import <Foundation/Foundation.h>
@interface CatchCrash : NSObject
void uncaughtExceptionHandler(NSException *exception);
@end
CatchCrash.m
#import "CatchCrash.h"
@implementation CatchCrash
//在AppDelegate中注册后,程序崩溃时会执行的方法
void uncaughtExceptionHandler(NSException *exception)
{
//获取系统当前时间,(注:用[NSDate date]直接获取的是格林尼治时间,有时差)
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *crashTime = [formatter stringFromDate:[NSDate date]];
//异常的堆栈信息
NSArray *stackArray = [exception callStackSymbols];
//出现异常的原因
NSString *reason = [exception reason];
//异常名称
NSString *name = [exception name];
//拼接错误信息
NSString *exceptionInfo = [NSString stringWithFormat:@"crashTime: %@ Exception reason: %@\nException name: %@\nException stack:%@", crashTime, name, reason, stackArray];
//把错误信息保存到本地文件,设置errorLogPath路径下
//并且经试验,此方法写入本地文件有效。
NSString *errorLogPath = [NSString stringWithFormat:@"%@/Documents/error.log", NSHomeDirectory()];
NSError *error = nil;
BOOL isSuccess = [exceptionInfo writeToFile:errorLogPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (!isSuccess) {
NSLog(@"将crash信息保存到本地失败: %@", error.userInfo);
}
2 . 完成了CatchCrash类,接下来,AppDelegate.h里 #import "CatchCrash.h"
在didFinishLaunchingWithOptions中添加如下代码(注册收集崩溃日志函数):
//注册消息处理函数的处理方法
//如此一来,程序崩溃时会自动进入CatchCrash.m的uncaughtExceptionHandler()方法
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
3 . 最后 在AppDelegate 中 didFinishLaunchingWithOptions 写崩溃日志上报逻辑 .
//若crash文件存在,则写入log并上传,然后删掉crash文件
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *errorLogPath = [NSString stringWithFormat:@"%@/Documents/error.log", NSHomeDirectory()];
if ([fileManager fileExistsAtPath:errorLogPath]) {
//上报逻辑
}