手把手教你使用Bugly收集线上崩溃信息

  • 我们都知道,app在上线之后,用户如果操作我们的app导致的崩溃、错误信息,我们是无法获知的,这时候,就需要一款工具,来告诉我们现在的app在线上的运行情况;
  • 现在线上信息收集的工具有 友盟、极光等,这里我要用到的是第三款常用的工具 - Bugly

made in 小蠢驴的crash.jpg


Bugly集成导入步骤

  1. pod 'BuglyHotfix' (手动导入比较麻烦)
  2. import 'JPEngine.h' (该文件在JSPatch文件夹中)
  3. 在appdelegate.m文件的 didFinishLaunchingWithOptions 方法中,对bugly进行初始化

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的官方文档中都有说明,接下去是重点了


  1. 如何获取到app的崩溃信息
- (void)clickCrashBtn{
    //声明一个方法,按钮一调用,就会crash
    NSString *value = nil;
    NSDictionary *dic = @{@"key":value};
}

3.png

如图,我们发现程序crash了,默认的bugly是会收集程序的crash信息的,我们登录bugly后台看看

4.png

发现并没有手机到crash信息,难道我们设置错误了?

  • 不,这里要注意,图3中,程序是crash了,但是他是卡在main()函数的断点里了,所以其实crash信息并没有发送给bugly
  • 那要怎么做? ==> 使用真机

真机crash演示.gif

解释下真机操作的步骤 - 1.打开buglyDemo;2-点击‘crash测试’

5.png

登录bugly后台,发现捕捉到了我们的程序crash,而且包括调用的方法,错误原因,都显示了出来。


华丽分割线 - 进阶用法 :捕捉非crash信息
  • 有些时候,我们要捕捉的信息可能不只是app crash的信息,比如http请求错误之类的,其实也是可以捕捉的,就看用户需求;
  • 同理,如果要捕捉用户的个人信息,比如登录信息,手机号等,只要在app中可以拿得到的,其实都可以让bugly捕捉;
  • 这里简单讲下,如果设置捕捉非crash信息,以http 请求错误为例

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

如图

  • 发现我们设置的错误收集,在bugly后台已经收集到
  • 内容是http请求错误,这样在版本上线的时候,我们不仅可以监听到app crash的信息
  • 其他例如监听http 请求失败的信息也可以完成了

进阶用法

我们发现,虽然http请求失败我们是收集到信息了,但是不知道是哪个url请求发生的失败,不知道失败的原因是服务器问题,还是前端用户操作的问题等等

==> 进阶使用:打印详细的错误信息,并上传到bugly


小tips:如何打印http错误信息

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

  • 如上图日志的等级分五种,根据自己需求来定
  • 从Error 到 Verbose状态,逐级递减,
  • 比如这里我们的http请求错误的情况,就用到了error收集,如果我要收集用户信息,就会用LogInfo去收集用户信息
  • 这里的等级和 appdelegate 中 设置 .reportLogLevel 是有关的
  • 例如设置config.reportLogLevel = BuglyLogLevelWarn,就只有warn 和 warn等级以上的日志才会收集
  • 这里我们可以看到,从上往下递减,在warn之上的,只有一个Error,所以如果设置 BuglyLogLevelWarn,只会收集 warn && error 打印的日志信息!

网络请求的进阶封装

对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


  • 在实际开发中,版本上线之后,线上信息的收集确实很重要
  • 要注意模拟器的crash之所以不被收集,我被main()函数断点卡住了,此时得用真机测试
  • 注意日志打印以及等级设置
  • AFNhttp请求的二次封装以及统一错误信息详细打印&&错误日志上传
  • 手把手教你设置符号表(这个其实腾讯的文档里面也有)

demo

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Netkiller

vsftpd FTP服务器安装与配置

本文节选自《Netkiller Linux 手札》 3.4. vsftpd - The Very Secure FTP Daemon 3.4.1. 安装 vsf...

45140
来自专栏一“技”之长

IOS中调用系统拨打电话与发送短信 原

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString string...

9220
来自专栏向治洪

ios入门之消息推送

前言 在去年的苹果大会上,苹果带来的iOS 10 系统中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功...

22260
来自专栏青玉伏案

IOS开发之新浪围脖

  IOS开发和Web开发一样,网络请求方式包括Get和Post方式。Get和Post两者有和特点和区别,在本篇博客中不做过多的论述,本篇的重点在于如何GET数...

23050
来自专栏一“技”之长

iOS网络编程之五——请求回执类NSURLResponse属性简介

        NSURLResponse类中存放请求的回执信息,在发送网络请求时,如果请求成功,首先会接收到服务端的回执信息,直接开始接收具体的返回数据。NS...

8430
来自专栏学海无涯

iOS开发之NSURLSessionUploadTask上传数据

苹果在 iOS9 之后已经废弃了NSURLConnection,NSURLSession成为其替代者,其基本知识网上很多,主要可以从NSURLSessionDa...

346100
来自专栏哈雷彗星撞地球

SDWebImageV3.7.5源码解析

SDWebImage更新到如今这个版本,过程做了许多改进,性能已经非常的好了。以前就粗略的看过SDWebImage的源码,但是未做记录整理。再次阅读还是受益良多...

9930
来自专栏進无尽的文章

推送-JPush(极光推送)的使用

推送服务可以说是所有 App 的标配,不论是哪种类型的 App,推送都从很大程度上决定了 App 的 打开率、使用率、存活率 。因此,熟知并掌握推送原理及方法,...

1.2K10
来自专栏一“技”之长

iOS9系列专题二——全新的搜索功能api 原

        iOS9中为我们提供了许多新的api,搜索功能的加强无疑是其中比较显眼的一个。首先,我们先设想一下:如果在你的app中定义一种标识符,在siri...

11450
来自专栏娱乐心理测试

iOS 如何把图片资源打包成bundle文件及遇到的坑(详解)

(1.)"Base SDK" 设置为 "Latest iOS (iOS 11.2)" (Xcode 9.2为例)

33220

扫码关注云+社区

领取腾讯云代金券