made in 小蠢驴的crash.jpg
JSPatch 文件夹要手动获取,要么去bugly官方说明文档下载,或者:
1.下载iOS - sdk包
2.把如图所示的JSPatch文件拖入项目
didFinishLaunchingWithOptions 中的初始化bugly方法
{
//初始化 Bugly 异常上报
BuglyConfig *config = [[BuglyConfig alloc] init];
config.delegate = self;
config.debugMode = YES;
config.reportLogLevel = BuglyLogLevelWarn;
//这里替换自己的appID
[Bugly startWithAppId:@"07792e0d22"
#if DEBUG
developmentDevice:YES
#endif
config:config];
//捕获 JSPatch 异常并上报
[JPEngine handleException:^(NSString *msg) {
NSException *jspatchException = [NSException exceptionWithName:@"Hotfix Exception" reason:msg userInfo:nil];
[Bugly reportException:jspatchException];
}];
//检测补丁策略
[[BuglyMender sharedMender] checkRemoteConfigWithEventHandler:^(BuglyHotfixEvent event, NSDictionary *patchInfo) {
//有新补丁或本地补丁状态正常
if (event == BuglyHotfixEventPatchValid || event == BuglyHotfixEventNewPatch) {
//获取本地补丁路径
NSString *patchDirectory = [[BuglyMender sharedMender] patchDirectory];
if (patchDirectory) {
//指定执行的 js 脚本文件名
NSString *patchFileName = @"main.js";
NSString *patchFile = [patchDirectory stringByAppendingPathComponent:patchFileName];
//执行补丁加载并上报激活状态
if ([[NSFileManager defaultManager] fileExistsAtPath:patchFile] &&
[JPEngine evaluateScriptWithPath:patchFile] != nil) {
BLYLogInfo(@"evaluateScript success");
[[BuglyMender sharedMender] reportPatchStatus:BuglyHotfixPatchStatusActiveSucess];
}else {
BLYLogInfo(@"evaluateScript failed");
[[BuglyMender sharedMender] reportPatchStatus:BuglyHotfixPatchStatusActiveFail];
}
}
}
}];
}
上述基础步骤,在bugly的官方文档中都有说明,接下去是重点了
- (void)clickCrashBtn{
//声明一个方法,按钮一调用,就会crash
NSString *value = nil;
NSDictionary *dic = @{@"key":value};
}
3.png
如图,我们发现程序crash了,默认的bugly是会收集程序的crash信息的,我们登录bugly后台看看
4.png
发现并没有手机到crash信息,难道我们设置错误了?
真机crash演示.gif
解释下真机操作的步骤 - 1.打开buglyDemo;2-点击‘crash测试’
5.png
登录bugly后台,发现捕捉到了我们的程序crash,而且包括调用的方法,错误原因,都显示了出来。
6.png
7.png
1.要开启日志功能,记得修改默认的reportLogLever
//BuglyLogLevelSilent 替换成 BuglyLogLevelWarn - 开启日志收集功能
config.reportLogLevel = BuglyLogLevelWarn;
2.设置错误上传
8.png
如图,其实异常上传或者错误上传等等,有多种标签可以设置,这里我们就先以异常上传 reportException
来举个?
NSString *urlStr = @"www.baidu.com";
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:urlStr parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[Bugly reportException:[NSException exceptionWithName:@"HttpError" reason:@"Http请求错误" userInfo:nil]];
NSLog(@"error");
}];
9.png
如图
我们发现,虽然http请求失败我们是收集到信息了,但是不知道是哪个url请求发生的失败,不知道失败的原因是服务器问题,还是前端用户操作的问题等等
==> 进阶使用:打印详细的错误信息,并上传到bugly
httpError详细信息打印.png
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//获取错误详细信息
NSString *ErrorString =[[NSString alloc]initWithData:error.userInfo[@"com.alamofire.serialization.response.error.data"] encoding:NSUTF8StringEncoding];
//AFN3.0 获取 - statusCode(例如404,500等等)
NSHTTPURLResponse *response = error.userInfo[AFNetworkingOperationFailingURLResponseErrorKey];
NSInteger statusCode = response.statusCode;
NSString *errorStr = [NSString stringWithFormat:@"get - Http请求错误原因 - %@ ,\n statusCode = %ld,\n url = %@,\n", ErrorString, (long)statusCode, urlStr ];
}
3.然后将详细信息,上传到bugly
[Bugly reportException:[NSException exceptionWithName:@"HttpError" reason:@"Http请求错误" userInfo:@{@"error":errorStr}]];
此时发现,bugly上并未收集到我们出错详细信息
这时候,就需要跟踪日志了
NSString *errorStr = [NSString stringWithFormat:@"get - Http请求错误原因 - %@ ,\n statusCode = %ld,\n url = %@,\n", ErrorString, (long)statusCode, urlStr ];
BLYLogError(@"%@", errorStr);
10.png
11.png
对AFN进行二次封装,然后将错误信息的收集与打印写在我们自己封装的方法中,就不用每个请求都写了
+ (void )get:(NSString *)url parameter:(id)parameters success:(void (^)(id responseObject))success faliure:(void (^)(id error))failure
{
//GET:url :如果传的是完整的接口就直接用,如果是需要拼接的,再拼接[HOST stringByAppendingString:url]
[[YHAFNHelper sharedManager] GET:url parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if(responseObject) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSString *ErrorString =[[NSString alloc]initWithData:error.userInfo[@"com.alamofire.serialization.response.error.data"] encoding:NSUTF8StringEncoding];
//AFN3.0 获取 - statusCode
NSHTTPURLResponse *response = error.userInfo[AFNetworkingOperationFailingURLResponseErrorKey];
NSInteger statusCode = response.statusCode;
NSString *errorStr = [NSString stringWithFormat:@"get - Http请求错误原因 - %@ ,\n statusCode = %ld,\n url = %@,\n", ErrorString, (long)statusCode, url ];
[Bugly reportException:[NSException exceptionWithName:@"HttpError" reason:@"Http请求错误" userInfo:@{@"errorStr":errorStr}]];
BLYLogError(@"%@", errorStr);
failure(error);
}];
}
实际开发中的演示效果:
12.png
13.png
符号表1.png
符号表2.png
符号表3.png
符号表4.png
符号表5.png
符号表6.png