Crash监控SDK推荐:腾讯Bugly
腾讯Bugly,为移动开发者提供专业的异常上报和运营统计,帮助开发者快速发现并解决异常,同时掌握产品运营动态,及时跟进用户反馈。
-
安装 集成 以及注册
-
BuglyConfig配置
创建一个BuglyConfig对象,并且在调用[Bugly startWithAppId:@"BUGLYID" config:buglyConfig];时传入即可实现对SDK的配置
基本配置
@interface BuglyConfig : NSObject /** * 设置自定义版本号 */ @property (nonatomic, copy) NSString *version; /** * 设置自定义设备唯一标识 */ @property (nonatomic, copy) NSString *deviceIdentifier; /** * Bugly Delegate */ @property (nonatomic, assign) id<BuglyDelegate> delegate;
配置version属性为当前App的版本信息,deviceIdentifier为当前的设备标识.可以用于后续在统计日志中查看不同版本的崩溃信息以及根据具体设备标识去定位具体问题
@protocol BuglyDelegate <NSObject> @optional /** * 发生异常时回调 * @param exception 异常信息 * @return 返回需上报记录,随异常上报一起上报 */ - (NSString * BLY_NULLABLE)attachmentForException:(NSException * BLY_NULLABLE)exception; @end
将BuglyConfig.delegate赋值并且实现了attachmentForException:方法后,可以实现在Bugly上传错误日志时附加我们自己的自定义信息(例如运营商、是否存储空间不足、当前用户的账号状态等等)
@interface Bugly : NSObject /** * 设置用户标识 * * @param userId 用户标识 */ + (void)setUserIdentifier:(NSString *)userId; /** * 设置关键数据,随崩溃信息上报 * @param value KEY * @param key VALUE */ + (void)setUserValue:(NSString *)value forKey:(NSString *)key; /** * 上报错误 * @param error 错误信息 */ + (void)reportError:(NSError *)error; /** * @brief 上报自定义错误 * @param category 类型(Cocoa=3,CSharp=4,JS=5,Lua=6) * @param aName 名称 * @param aReason 错误原因 * @param aStackArray 堆栈 * @param info 附加数据 * @param terminate 上报后是否退出应用进程 */ + (void)reportExceptionWithCategory:(NSUInteger)category name:(NSString *)aName reason:(NSString *)aReason callStack:(NSArray *)aStackArray extraInfo:(NSDictionary *)info terminateApp:(BOOL)terminate;
同时.Bugly对象下有一个setUserIdentifier:的类方法.建议在用户登录之后调用,传入用户ID.同样同于后期定位问题使用(最高效率定位日志的手段)
setUserValue:forKey:方法可以设置一些关键数据.会随每次信息上报而上报(相当于简化版的delegate实现)
reportError:以及reportExceptionWithCategory:name:reason:callStack:extraInfo:terminateApp:方法可以实现自定义的错误上报.例如数据错误或者其他超出预期但是不会导致App Crash的问题.
Crash配置
@interface BuglyConfig : NSObject /** * 卡顿监控开关,默认关闭 */ @property (nonatomic) BOOL blockMonitorEnable; /** * 卡顿监控判断间隔,单位为秒 */ @property (nonatomic) NSTimeInterval blockMonitorTimeout;
需要开启卡顿监控开关时.需要将BuglyConfig对象的blockMonitorEnable设置为YES.并且设置blockMonitorTimeout的具体值(我设置的是1s).后续即可在监控平台上查找到信息
控制台日志上传
@interface BuglyConfig : NSObject /** * 控制自定义日志上报,默认值为BuglyLogLevelSilent,即关闭日志记录功能。 * 如果设置为BuglyLogLevelWarn,则在崩溃时会上报Warn、Error接口打印的日志 */ @property (nonatomic, assign) BuglyLogLevel reportLogLevel; typedef NS_ENUM(NSUInteger, BuglyLogLevel) { BuglyLogLevelSilent = 0, BuglyLogLevelError = 1, BuglyLogLevelWarn = 2, BuglyLogLevelInfo = 3, BuglyLogLevelDebug = 4, BuglyLogLevelVerbose = 5, };
默认是不进行上传的,即默认值为BuglyLogLevelSilent.如果需要在Crash时上传日志的功能,只需要将BuglyConfig.reportLogLevel设置为其他枚举即可.建议设置为BuglyLogLevelWarn.即上传Error以及Warning级别的日志.
上传符号表
官方链接
如果方便的话建议配置sh脚本模式.可以实现每次发布时自动上传符号表的功能
但是这个方法有一个限制,就是它可以实现脚本默认在Debug模式及模拟器编译情况下不会上传符号表.但是我日常是真机跑App.所以会导致严重拖慢编译速度.故我使用的方式是删除sh脚本.在每次提交到App Store之后从XCode->Window->Organizer中的Archives中找到包.右键 Show In Finder ,右键xcarchive文件->显示包内容->dSYMs文件夹下的dSYM文件,进入Bugly控制台上传即可
结尾:日志收集的目的是为了查找Crash原因并解决,但最终目的是尽量少的出现Bug.代码中很多问题都可以避免,例如使用runtime的assign修饰引用类型导致的请求不可用的内存,循环引用,服务器给的值可能由空值等,平时多注意一些就可以避免.下一篇文章可能会着重于整个App的性能优化相关,如果大家有相关App优化经验或者想看到哪方面的优化手段希望在评论区讨论