iOS集成Bugly異常上報

騰訊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!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在開發APP的過程中,崩潰等異常總是讓我們不堪其煩,不過開發階段的崩潰等問題,都是小事,可以進行處理,但是一旦發布...
    IUVO閱讀 14,626評論 3 27
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,937評論 18 139
  • 本文就捕獲iOS Crash、Crash日志組成、Crash日志符號化、異常信息解讀、常見的Crash五部分介紹。...
    xukuangbo_閱讀 1,597評論 0 0
  • [這是第14篇] 序: iOS Crash問題是iOS開發中難以忽視的存在,本文就捕獲iOS Crash、Cras...
    南華coder閱讀 9,950評論 21 116
  • 2017年的第一次晚睡,獻給了我該死的強迫癥。 今晚吃完晚餐后,散步后回家,和閨蜜說我想收拾一下房間。她說那就開始...
    夏天說早安閱讀 377評論 4 1