Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

自定義您的 Firebase Crashlytics 崩潰報告

本指南介紹瞭如何使用 Firebase Crashlytics SDK 自定義崩潰報告。默認情況下,Crashlytics自動收集您的所有應用程序的用戶(可以關閉自動崩潰報告和崩潰報告能夠選擇在報告為您的用戶,而不是)。 Crashlytics提供了四個日誌機制開箱:自定義鍵自定義日誌用戶標識符捕獲的異常

添加自定義鍵

自定義鍵可幫助您獲取導致崩潰的應用程序的特定狀態。您可以將任意鍵/值對與崩潰報告相關聯,然後使用自定義鍵在 Firebase 控制台中搜索和過濾崩潰報告。

  • Crashlytics儀表盤,你可以搜索匹配的自定義密鑰的問題。
  • 當您查看在控制台的一個具體問題,您可以查看每個事件(子選項卡),甚至通過過濾器自定義鍵的事件(在頁面的頂部濾鏡菜單)相關的自定義鍵。

使用setCustomValue方法來設置鍵/值對。例如:

迅速

// Set int_key to 100.
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set str_key to "hello".
Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")

目標-C

當設置整數,布爾值,或浮筒,框中的值作為@( value )

// Set int_key to 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set str_key to "hello".
[[FIRCrashlytics crashlytics] setCustomValue:@"hello" forKey:@"str_key"];

您還可以通過調用鍵並將其設置為不同的值來修改現有鍵的值。例如:

迅速

Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set int_key to 50 from 100.
Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")

目標-C

[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set int_key to 50 from 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];

通過使用批量添加鍵/值對setCustomKeysAndValues方法與一個NSDictionary作為唯一的參數:

迅速

let keysAndValues = [
                 "string key" : "string value",
                 "string key 2" : "string value 2",
                 "boolean key" : true,
                 "boolean key 2" : false,
                 "float key" : 1.01,
                 "float key 2" : 2.02
                ] as [String : Any]

Crashlytics.crashlytics().setCustomKeysAndValues(keysAndValues)

目標-C

NSDictionary *keysAndValues =
    @{@"string key" : @"string value",
      @"string key 2" : @"string value 2",
      @"boolean key" : @(YES),
      @"boolean key 2" : @(NO),
      @"float key" : @(1.01),
      @"float key 2" : @(2.02)};

[[FIRCrashlytics crashlytics] setCustomKeysAndValues: keysAndValues];

添加自定義日誌消息

要為導致崩潰的事件提供更多上下文,您可以將自定義 Crashlytics 日誌添加到您的應用程序。 Crashlytics聯營公司與中的Crashlytics頁面的崩潰數據並顯示它們的日誌火力地堡控制台日誌選項卡下。

迅速

使用log()log(format:, arguments:) ,以幫助確定問題。如果你想獲得與消息的有用的日誌輸出,對象,你傳遞給log()必須符合CustomStringConvertible財產。 log()返回定義該對象的描述屬性。例如:

Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \(attributesDict)")

.log(format:, arguments:)格式從調用返回的值getVaList()例如:

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))

有關如何使用的詳細信息log()log(format:, arguments:) ,請參閱Crashlytics參考文檔

目標-C

使用loglogWithFormat以幫助確定問題。請注意,如果你想獲得與消息的有用的日誌輸出,你傳遞給任何方法的對象必須重寫description實例屬性。例如:

[[FIRCrashlytics crashlytics] log:@"Simple string message"];

[[FIRCrashlytics crashlytics] logWithFormat:@"Higgs-Boson detected! Bailing out... %@", attributesDict];

[[FIRCrashlytics crashlytics] logWithFormat:@"Logging a variable argument list %@" arguments:va_list_arg];

有關如何使用的詳細信息loglogWithFormat ,請參閱Crashlytics參考文檔

設置用戶標識符

要診斷問題,了解哪些用戶遇到了給定的崩潰通常很有幫助。 Crashlytics 包括一種在崩潰報告中匿名識別用戶的方法。

要將用戶 ID 添加到您的報告中,請以 ID 號、令牌或散列值的形式為每個用戶分配一個唯一標識符:

迅速

Crashlytics.crashlytics().setUserID("123456789")

目標-C

[[FIRCrashlytics crashlytics] setUserID:@"123456789"];

如果您在設置後需要清除用戶標識符,請將值重置為空字符串。清除用戶標識符不會刪除現有的 Crashlytics 記錄。如果您需要刪除一個用戶ID,相關的記錄接觸火力地堡的支持

報告非致命異常

除了自動報告您的應用程序崩潰之外,Crashlytics 還允許您記錄非致命異常並在您的應用程序下次啟動時將它們發送給您。

您可以通過錄製記錄非致命異常NSError與對象recordError方法。 recordError通過調用捕獲線程調用堆棧[NSThread callStackReturnAddresses]

迅速

Crashlytics.crashlytics().record(error: error)

目標-C

[[FIRCrashlytics crashlytics] recordError:error];

當使用recordError方法,了解是很重要的NSError結構和Crashlytics如何使用這些數據組崩潰。在不正確的使用recordError方法可能會導致不可預知的行為,並可能導致Crashlytics來限制你的應用程序記錄錯誤的報告。

一個NSError對象有三個參數:

  • domain: String
  • code: Int
  • userInfo: [AnyHashable : Any]? = nil

不像致命崩潰,其經由棧跟踪分析分組,記錄錯誤是由分組domaincode 。這是致命崩潰和記錄錯誤之間的重要區別。例如:

迅速

let userInfo = [
  NSLocalizedDescriptionKey: NSLocalizedString("The request failed.", comment: ""),
  NSLocalizedFailureReasonErrorKey: NSLocalizedString("The response returned a 404.", comment: ""),
  NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString("Does this page exist?", comment: ""),
  "ProductID": "123456",
  "View": "MainView"
]

let error = NSError.init(domain: NSCocoaErrorDomain,
                         code: -1001,
                         userInfo: userInfo)

目標-C

NSDictionary *userInfo = @{
  NSLocalizedDescriptionKey: NSLocalizedString(@"The request failed.", nil),
  NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The response returned a 404.", nil),
  NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Does this page exist?", nil),
  @"ProductID": @"123456",
  @"View": @"MainView",
};

NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
                                     code:-1001
                                 userInfo:userInfo];

當您登錄上述錯誤,它會創建一個由分組一個新的問題NSSomeErrorDomain-1001 。使用相同域和代碼值的其他已記錄錯誤分組在同一問題下。數據包含在所述內userInfo對象被轉換為鍵-值對,並在鍵顯示/個體問題內記錄部。

日誌和自定義鍵

就像崩潰報告,你可以嵌入日誌和自定義鍵上下文到NSError 。但是,附加到崩潰的日誌與記錄的錯誤的日誌有所不同。當發生崩潰並重新啟動應用程序時,Crashlytics 從磁盤檢索的日誌是在崩潰發生之前寫入的日誌。當你登錄一個NSError ,應用程序不立即終止。由於Crashlytics只將在下一個應用程序啟動的記錄的錯誤報告,必須限制分配磁盤上的日誌空間量,可以記錄足夠的後NSError被記錄下來,以便所有相關的日誌由Crashlytics發送時間旋出來自設備的報告。登錄時請記住這種平衡NSErrors和使用日誌和自定義鍵在您的應用程序。

性能注意事項

請記住,記錄的NSError可以是相當昂貴的。在您進行調用時,Crashlytics 使用稱為堆棧展開的過程捕獲當前線程的調用堆棧。此過程可能是 CPU 和 I/O 密集型的,尤其是在支持 DWARF 展開(arm64 和 x86)的體系結構上。展開完成後,信息同步寫入磁盤。如果下一行崩潰,這可以防止數據丟失。

雖然在後台線程上調用此 API 是安全的,但請記住,將此調用分派到另一個隊列會丟失當前堆棧跟踪的上下文。

NSExceptions 呢?

Crashlytics不提供用於記錄和錄音設施NSException直接實例。一般來說,Cocoa 和 Cocoa Touch API 不是異常安全的。這意味著使用@catch可以有非常嚴重的意想不到的副作用在你的過程中,格外小心使用時也是如此。你永遠不應該使用@catch在你的代碼語句。請參考蘋果的文檔主題演講。

啟用選擇加入報告

默認情況下,Crashlytics 會自動為您應用的所有用戶收集崩潰報告。為了讓用戶更好地控制他們發送的數據,您可以通過禁用自動報告並僅在您選擇在代碼中將數據發送到 Crashlytics 來啟用選擇加入報告:

  1. 通過添加新的關鍵是你關閉自動收集Info.plist文件:

    • 重點: FirebaseCrashlyticsCollectionEnabled
    • 價值: false
  2. 通過在運行時調用 Crashlytics 數據收集覆蓋,為選定用戶啟用收集。覆蓋值在您的應用程序啟動期間保持不變,因此 Crashlytics 可以自動收集報告。

    要選擇自動崩潰報告出來,通過false的倍率值。當設置為false ,新的值並不適用,直到應用程序的下一次運行。

    迅速

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    目標-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

管理崩潰洞察數據

Crash Insights 通過將您的匿名堆棧跟踪與來自其他 Firebase 應用的跟踪進行比較,並讓您知道您的問題是否屬於更大趨勢的一部分,從而幫助您解決問題。對於許多問題,Crash Insights 甚至提供資源來幫助您調試崩潰。

Crash Insights 使用匯總的崩潰數據來識別常見的穩定性趨勢。如果您不希望共享您的應用程序的數據,你可以在你的Crashlytics問題列表中的頂部退出從崩潰見解菜單崩潰見解的火力地堡控制台