在这篇博客中,介绍了如何在Android中处理release包的错误。这篇文章将介绍一下如何在iOS中进行错误信息收集。由于debug包的错误可以直接在Xcode的日志窗口中查看,因此我们只讨论如何在release包中收集错误日志。
还是分为两种情况进行讨论:
1. JS异常
依旧是封装一个全局捕获JS异常的组件,实现componentDidCatch生命周期方法,将获取到的js异常栈信息写入到沙盒路径中。
#pragma mark - 保存JS异常日志到沙盒中
RCT_EXPORT_METHOD(saveJSExceptionsToStorage: (NSString *)exceptionText) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYYMMddHHmmss"];
NSDate *datenow = [NSDate date];
NSString *currentTimeString = [formatter stringFromDate:datenow];
NSString *dirPath = [NSString stringWithFormat:@"%@/Documents/JSExceptions",NSHomeDirectory()];
[[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];
//保存到本地沙盒中
[exceptionText writeToFile:[NSString stringWithFormat:@"%@/%@.log",dirPath,currentTimeString] atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
这里我们将JS错误日志写入到 应用沙盒/Documents/JSExceptions路径下。沙盒路径下Documents文件夹用于存放应用数据,可以被iTunes备份。关于iOS文件系统的内容可以查看官方文档。
2. 原生异常
捕获原生异常并写入沙盒需要在AppDelegate.m入口文件中的didFinishLaunchingWithOptions应用加载生命周期方法内使用NSSetUncaughtExceptionHandler指定异常处理函数。所以我们首先要编写一个Bugly类实现这个异常处理函数:
Bugly.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Bugly : NSObject
void uncaughtExceptionHandler(NSException *exception);
@end
NS_ASSUME_NONNULL_END
Bugly.m
#import "Bugly.h"
@implementation Bugly
void uncaughtExceptionHandler(NSException *exception){
NSArray *stackArry= [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
NSString *exceptionInfo = [NSString stringWithFormat:@"Exception name:%@\nException reatoin:%@\nException stack :%@",name,reason,stackArry];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYYMMddHHmmss"];
NSDate *datenow = [NSDate date];
NSString *currentTimeString = [formatter stringFromDate:datenow];
NSString *dirPath = [NSString stringWithFormat:@"%@/Documents/CrashLogs",NSHomeDirectory()];
[[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];
//保存到本地沙盒中
[exceptionInfo writeToFile:[NSString stringWithFormat:@"%@/%@.log",dirPath,currentTimeString] atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
@end
接着在AppDelegate.m中:
#import "Bugly.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//注册消息处理函数的处理方法
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
......
}
这样也就完成了