騰訊Bugly,為移動開發者提供專業的異常上報和運營統計,幫助開發者快速發現并解決異常,同時掌握產品運營動態,及時跟進用戶反饋。
Bugly是一套強大的異常上報SDK,包含異常上報、運營統計、內測分發、熱修復等功能,實在是定位、修復生產上bug的必備良品??。Bugly
-
集成
建議使用CocoaPods集成Bugly,如果不會使用pod建議問一下度娘。
Pods代碼:pod 'Bugly'
-
初始化
初始化需要一個AppId,在Bugly上新建一個應用就可以獲取對應的AppId了;初始化Bugly也很簡單:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 改成你的AppId
[Bugly startWithAppId:Bugly_ID];
return YES;
}
到此,你就可以正式使用Bugly啦!!!
但是我們就這樣使用Bugly是不是太可惜了,我們來看看Bugly還有什么功能;查看頭文件,會發現Bugly有三個類暴露出來,分別是Bugly、BuglyConfig和BuglyLog。
1.自定義初始化
BuglyConfig類主要用于個性話配置Bugly類,由一些屬性和BuglyDelegate代理組成。
屬性:BuglyConfig大部分屬性有設有默認值,一般不用更改,但是關于卡頓監控的屬性確是默認關閉的:
/**
* 卡頓監控開關,默認關閉
*/
@property (nonatomic) BOOL blockMonitorEnable;
/**
* 卡頓監控判斷間隔,單位為秒
*/
@property (nonatomic) NSTimeInterval blockMonitorTimeout;
如果需要上報卡頓,只需要將blockMonitorEnable設為true,給blockMonitorTimeout設置一個合理的值即可;
代理:BuglyConfig可以設置一個代理,來自定義上傳崩潰的附屬信息;
@protocol BuglyDelegate <NSObject>
@optional
/**
* 發生異常時回調
* @param exception 異常信息
* @return 返回需上報記錄,隨異常上報一起上報
*/
- (NSString * BLY_NULLABLE)attachmentForException:(NSException * BLY_NULLABLE)exception;
@end
這個時候我們的初始化就可以寫成:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 啟動Bugly
[Bugly startWithAppId:Bugly_ID config:^{
BuglyConfig *config = [[BuglyConfig alloc] init];
config.blockMonitorEnable = YES;
config.blockMonitorTimeout = 2;
config.consolelogEnable = YES;
config.delegate = self;
return config;
}()];
return YES;
}
- (NSString *)attachmentForException:(NSException *)exception {
return @"Do you want to do...";
}
2.上傳打印日志
BuglyLog類主要用于打印日志,有6種級別:
typedef NS_ENUM(NSUInteger, BuglyLogLevel) {
BuglyLogLevelSilent = 0,
BuglyLogLevelError = 1,
BuglyLogLevelWarn = 2,
BuglyLogLevelInfo = 3,
BuglyLogLevelDebug = 4,
BuglyLogLevelVerbose = 5,
};
BuglyLog除了控制臺打印,還有一個重要功能就是上報打印內容,內容將在崩潰時一同被上報;但是這個功能是默認不上報的,需要配置BuglyConfig的reportLogLevel屬性;如config.reportLogLevel = BuglyLogLevelWarn,將會上報BuglyLogLevelWarn和BuglyLogLevelError級別的打印日志。
3. 自定義上報異常
我們再回到Bugly類,除了初始化Bugly的方法外,還有一些其他的方法:
- 關鍵值上報
/**
* 設置關鍵數據,隨崩潰信息上報
*/
+ (void)setUserValue:(nonnull NSString *)value
forKey:(nonnull NSString *)key;
- 自定義上報錯誤
/**
* 上報自定義異常
* @param exception 異常信息
*/
+ (void)reportException:(nonnull NSException *)exception;
/**
* 上報錯誤
* @param error 錯誤信息
*/
+ (void)reportError:(NSError *)error;
這個功能可以說十分有用,可以讓我們定位到一些沒有引起崩潰的問題,我們可以在一些關鍵操作和網絡請求處上報一些異常信息,以此優化我們的程序;這些錯誤信息在錯誤分析可以被查看到。
-
上傳符號表
當我們到Bugly查看崩潰信息的時候,會發現堆棧信息打印了一堆地址,特別是信號量出錯的情況下,很難有效的定位到崩潰原因,這個時候就需要符號表了。
- 什么是符號表
符號表是內存地址與函數名、文件名、行號的映射表。符號表元素如下所示:
<起始地址> <結束地址> <函數> [<文件名:行號>]- 為什么要配置符號表?
為了能快速并準確地定位用戶APP發生Crash的代碼位置,Bugly使用符號表對APP發生Crash的程序堆棧進行解析和還原。
符號表可以在我們的工程中配置sh腳本快速上傳,手動上傳的話麻煩一點,詳細請看官方文檔.
-
不使用第三方自己收集異常日志?
看到Bugly只暴露了三個類就完成異常日志收集工作,是不是心癢癢想自己寫一個呢?我勸你還是別撒了,有個這么強大而且免費的SDK,折騰自己干嘛!!!好吧,也不是不能實現,研究一下NSException就會有些收獲;細心的你可能發現了一條有用的API:
typedef void NSUncaughtExceptionHandler(NSException *exception);
FOUNDATION_EXPORT NSUncaughtExceptionHandler * _Nullable NSGetUncaughtExceptionHandler(void);
FOUNDATION_EXPORT void NSSetUncaughtExceptionHandler(NSUncaughtExceptionHandler * _Nullable);
看到這里你可能想說,這不是就可以搞了嗎?但是NSSetUncaughtExceptionHandler這個函數在信號量出錯的情況下是不會回調的,他不能捕獲信號量異常,如果你還不想放棄可以看一下這篇博文。
推薦@chenfanfang關于NSException的文章:
iOS被開發者遺忘在角落的NSException-其實它很強大
iOS runtime實用篇--和常見崩潰say good-bye!