升級到 Firebase Crashlytics SDK

您現在可以使用新的官方 Firebase Crashlytics SDK 在您的應用中設置 Crashlytics,該 SDK 提供了改進的 API,與其他 Firebase 產品更加一致,使用起來更加直觀。

本指南介紹瞭如何從舊版 Fabric SDK 升級到新 SDK。它描述了新 API 帶來的更改、更改的原因以及如何更新代碼(如果需要)。

在你開始之前

第1步:添加火力地堡配置文件

  1. 打開你的項目設置。在您的應用程序卡,選擇您需要一個配置文件中的應用程序的捆綁ID。

  2. 點擊下載GoogleService-Info.plist中獲得你的火力地堡的iOS配置文件( GoogleService-Info.plist )。

  3. 將您的配置文件移動到 Xcode 項目的根目錄中。如果出現提示,請選擇將配置文件添加到所有目標。

如果你在你的項目中有多個包ID,必須每捆ID用在火力地堡控制台,以便每個應用程序都可以有自己的註冊應用關聯GoogleService-Info.plist文件。

第2步:添加火力地堡Crashlytics SDK

  1. 在的CocoaPods,更換FabricCrashlytics豆莢用Firebase/Crashlytics在所有目標吊艙。

    # Add the pod for Firebase Crashlytics
    pod 'Firebase/Crashlytics'
    # Recommended: Add the Firebase pod for Google Analytics pod 'Firebase/Analytics'
  2. 直接從 Fabric 中卸載或移除第三方依賴項,例如來自 Fabric Answers 和第三方套件的依賴項。

  3. 安裝和更新莢,然後打開你的.xcworkspace文件,看看在Xcode項目:

    pod install
    open YOUR_PROJECT.xcworkspace

第3步:更新您的代碼

  1. 在 Xcode 中,重建您的應用程序,然後再次重新打開您的 .xcworkspace 文件。

  2. 查看以下 SDK 更改並對您的代碼進行適當更新:


Crashlytics 現在根據 Firebase 安裝 ID 輪換 ID。

Crashlytics 使用 Crashlytics 安裝 UUID 來識別您的應用程序實例並將您的用戶數據與其設備相關聯。以前,當用戶設備的廣告 ID 發生變化時,Crashlytics 會輪換用戶的安裝 UUID。現在,Crashlytics 根據用戶的 Firebase 安裝 ID (FID) 輪換安裝 UUID。欲了解更多信息,請訪問管理火力地堡安裝的ID

造成改變的原因

使用 FID 與其他 Firebase SDK 一致。


運行和上傳符號腳本現在位於 FirebaseCrashlytics 中。

您現在可以訪問runupload-symbols來自新腳本FirebaseCrashlytics庫。請注意,您仍然可以撥打upload-symbols手動從您的構建過程中隨時隨地上傳dSYMs。

另外,面料的API_KEYBUILD_SECRET不再包含在新的SDK。相反,Crashlytics現在使用你的應用程序的GoogleService-info.plist你的應用與您的火力地堡項目關聯,並保留您的歷史事故數據。

面料 SDK

${PODS_ROOT}/Fabric/run API_KEY BUILD_SECRET
/path/to/pods/directory/Fabric/upload-symbols

Firebase Crashlytics SDK

${PODS_ROOT}/FirebaseCrashlytics/run
/path/to/pods/directory/FirebaseCrashlytics/upload-symbols

造成改變的原因

Crashlytics 不再使用 Fabric SDK 作為依賴項,因此我們將 CLI 工具移至新庫。


Crashlytics 庫現在稱為 FirebaseCrashlytics。

在您的應用中,更新您的導入路徑:

面料 SDK

迅速

import Crashlytics

目標-C

@import Crashlytics

Firebase Crashlytics SDK

迅速

import FirebaseCrashlytics

目標-C

@import FirebaseCrashlytics

造成改變的原因

更新的名稱Crashlytics庫使得它與其他火力地堡庫(例如,一致FirebaseFirestoreFirebaseAuth )。


FirebaseCrashlytics 不再適用於 Fabric SDK。

現在, FirebaseCrashlytics只能與火力地堡Crashlytics SDK初始化。你可以啟動的實例FirebaseCrashlytics通過調用FirebaseApp.configure斯威夫特或[FIRApp configure]在Objective-C。

在您的application:didFinishLaunchingWithOptions ,更換到呼叫Fabric.withstartWithAPIKey有一個呼叫FirebaseApp

面料 SDK

迅速

Fabric.with([Crashlytics.self])

目標-C

[Fabric with:@[[Crashlytics class]]];
+ startWithAPIKey:
+ startWithAPIKey:delegate:

Firebase Crashlytics SDK

迅速

FirebaseApp.configure()

目標-C

[FIRApp configure];

造成改變的原因

使用新方法初始化 Crashlytics 與其他 Firebase 服務的初始化方式更加一致。


刪除了 crash 和 throwException 方法。

新的SDK不再包括crashthrowException方法。相反,使用fatalError在夫特或在Objective-C空數組強制碰撞。

Firebase Crashlytics SDK

迅速

// Force a test crash
fatalError()

目標-C

// Force a test crash
@[][1];

造成改變的原因

不同類型的崩潰可能有多種原因,這些方法沒有明確說明導致崩潰是發生在運行時還是應用的原生 SDK 中。


sharedInstance 方法現在被命名為 crashlytics。

新的SDK不再包括sharedInstance方法。要初始化Crashlytics,使用crashlytics代替(讀取的參考文檔夫特Objective-C的獲得更多信息)。在您的應用程序委託中,更新您的初始化腳本:

面料 SDK

迅速

Crashlytics.sharedInstance()

目標-C

[Crashlytics sharedInstance];

Firebase Crashlytics SDK

迅速

Crashlytics.crashlytics()

目標-C

[FIRCrashlytics crashlytics];

造成改變的原因

我們將實例 getter 方法命名為與其他 Firebase SDK 一致。


setUserIdentifier 現在是 setUserID。 setUserName 和 setUserEmail 被刪除。

以前,您可以設置使用崩潰相關的姓名或電子郵件setUserNamesetUserEmail ,但這些方法將不再定義。到新的首選方法集ID為您的用戶是使用setUserID

面料 SDK

迅速

Crashlytics.sharedInstance().setUserIdentifier("user_id")

Crashlytics.sharedInstance().setUserEmail("user_email")

Crashlytics.sharedInstance().setUserName("user_name")

目標-C

[[Crashlytics sharedInstance] setUserIdentifier:@"user_id"];

[[Crashlytics sharedInstance] setUserEmail:@"user_email"];

[[Crashlytics sharedInstance] setUserName:@"user_name"];

Firebase Crashlytics SDK

迅速

Crashlytics.crashlytics().setUserID("user_id")

目標-C

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

造成改變的原因

我們採用的方法名稱setUserID ,以便與其他火力地堡API和去除一致setUserNamesetUserEmail勸阻通過Crashlytics記錄PII。


CLSLogv 和 CLSNSLogv 被日誌函數取代。

新的SDK不再包括CLSLogvCLSNSLogv功能。要添加自定義日誌消息,請使用新的測井方法Crashlytics庫。請注意,新方法不再打印到stdoutNSLog (我們建議您撰寫的包裝,如果你想保持這種行為)。

面料 SDK

迅速

CLSLogv("%@, %@", getVaList([first_arg, second_arg]))

CLSNSLogv("%@, %@", getVaList([first_arg, second_arg]))

目標-C

CLSLog(@"%@, %@", first_arg, second_arg);
CLSNSLog(@"%@, %@", first_arg, second_arg);

CLSLogv(@"%@, %@", args_va_list);
CLSNSLogv(@"%@, %@", args_va_list);

CLS_LOG(@"%@, %@", first_arg, second_arg);

Firebase Crashlytics SDK

迅速

Crashlytics.crashlytics().log("\(first_arg), \(second_arg)")

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList([first_arg, second_arg]))

目標-C

[[FIRCrashlytics crashlytics] log:@"first_arg, second_arg"];

[[FIRCrashlytics crashlytics] logWithFormat:@"%@, %@", first_arg, second_arg];

如果您使用CLS_LOG ,以下內容添加到一個頭文件才能繼續獲取文件名和行號在日誌語句:

#define CLS_LOG(__FORMAT__, ...) [[FIRCrashlytics crashlytics] logWithFormat:@"%s line %d $ " __FORMAT__, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__]

造成改變的原因

新方法需要實例,這使得測試代碼更加容易。


setCustomValue 正在替換 setObjectValue、setIntValue、setFloatValue 和 setBoolValue。

新 SDK 中不再包含自定義 setter 方法。以前,您可以使用該方法來設置鍵/值對與您的崩潰報告一起發送。現在,你可以使用setCustomValue:forKey到組鍵/值對所有數據類型。

面料 SDK

迅速

Crashlytics.sharedInstance().setObjectValue("value", forKey: "object_key")

Crashlytics.sharedInstance().setIntValue(100, forKey: "int_key")

Crashlytics.sharedInstance().setFloatValue(99.9, forKey: "float_key")

Crashlytics.sharedInstance().setBoolValue(true, forKey: "bool_key")

目標-C

[[Crashlytics sharedInstance] setObjectValue:@"key" forKey:@"object_key"];

[[Crashlytics sharedInstance] setIntValue:100 forKey:@"int_key"];

[[Crashlytics sharedInstance] setFloatValue:99.9 forKey:@"float_key"];

[[Crashlytics sharedInstance] setBoolValue:YES forKey:@"bool_key"];

Firebase Crashlytics SDK

迅速

Crashlytics.crashlytics().setCustomValue("value", forKey: "object_key")

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

Crashlytics.crashlytics().setCustomValue(99.9, forKey: "float_key")

Crashlytics.crashlytics().setCustomValue(true, forKey: "bool_key")

目標-C

[[FIRCrashlytics crashlytics] setCustomValue:@"value" forKey:@"object_key"];

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

[[FIRCrashlytics crashlytics] setCustomValue:@(99.9) forKey:@"float_key"];

[[FIRCrashlytics crashlytics] setCustomValue:@YES forKey:@"bool_key"];

造成改變的原因

新方法名稱是 Crashlytics 獨有的,並明確表明 Crashlytics 不符合鍵值對。


recordCustomExceptionName:reason:frameArray: 被異常模型 API 取代。

如果您的應用程序在非本地環境(例如 JavaScript 或 Unity)中運行,您可以使用異常模型 API 以應用程序的本地異常格式報告崩潰元數據。

面料 SDK

迅速

讓 topFrame = CLSStackFrame() topFrame.symbol = "doSomethingBad" topFrame.fileName = "bad.cc" topFrame.lineNumber = 23

let middleFrame = CLSStackFrame()
middleFrame.symbol = "doOtherStuff"
middleFrame.fileName = "stuff.cc"
middleFrame.lineNumber = 23;

let bottomFrame = CLSStackFrame()
bottomFrame.symbol = "main"
bottomFrame.fileName = "main.cc"
bottomFrame.lineNumber = 123

Crashlytics.sharedInstance().recordCustomExceptionName("FooException",
                                                       reason: "There was a foo.",
                                                       frameArray: [topFrame, middleFrame, bottomFrame])

目標-C

CLSStackFrame *topFrame = [[CLSStackFrame alloc] init];
topFrame.symbol = @"doSomethingBad";
topFrame.fileName = @"bad.cc";
topFrame.lineNumber = 23;

CLSStackFrame *middleFrame = [[CLSStackFrame alloc] init];
middleFrame.symbol = @"doOtherStuff";
middleFrame.fileName = @"stuff.cc";
middleFrame.lineNumber = 23;

CLSStackFrame *bottomFrame = [[CLSStackFrame alloc] init];
bottomFrame.symbol = @"main";
bottomFrame.fileName = @"main.cc";
bottomFrame.lineNumber = 123;

[[Crashlytics sharedInstance] recordCustomExceptionName:@"FooException"
                                                 reason:@"There was a foo."
                                             frameArray:@[topFrame, middleFrame, bottomFrame]];

Firebase Crashlytics SDK

迅速

var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame.init(symbol:"makeError" fileName:"handler.js" lineNumber:495),
  StackFrame.init(symbol:"then" fileName:"routes.js" lineNumber:102),
  StackFrame.init(symbol:"main" fileName:"app.js" lineNumber:12),
]

crashlytics.record(exceptionModel:ex)

目標-C

model.stackTrace = @[
  [FIRStackFrame stackFrameWithSymbol:@"makeError" fileName:@"handler.js" lineNumber:495],
  [FIRStackFrame stackFrameWithSymbol:@"then" fileName:@"routes.js" lineNumber:102],
  [FIRStackFrame stackFrameWithSymbol:@"main" fileName:@"app.js" lineNumber:12],
];

造成改變的原因

長期以來一直要求使用此功能,它允許您將 Crashlytics 擴展到其他平台,如 Unity、Flutter 或 React Native。



CrashlyticsDelegate 被用於處理崩潰報告的單獨方法所取代。

您現在可以使用一組新方法來處理崩潰報告:

  • didFinishLaunchingWithOptions現在由新的處理程序替換checkForUnsentReportsWithCompletion

  • crashlyticsDidDetectReportForLastExecution現在被替換didCrashDuringPreviousExecutiondidCrashDuringPreviousExecution可以讓你方便地檢測您的應用程序的最後一次運行期間發生崩潰。

  • crashlyticsCanUseBackgroundSessions現在永久設置為true。

  • 我們不再支持檢查CLSReport的委託對象。

默認情況下,Crashlytics自動上載在啟動時崩潰報告,你可以調用以前didFinishLaunchingWithOptions讓你的用戶選擇加入崩潰報告。現在,當你調用setCrashlyticsCollectionEnabled=false關閉自動崩潰報告,Crashlytics調用checkForUnsentReportsWithCompletion ,它可以讓用戶選擇是否發送故障報告,當你的應用程序崩潰。然後,您可以撥打sendUnsentReports中如果用戶選擇或deleteUnsentReports如果用戶選擇退出。

請注意,您也可以撥打sendUnsentReportsdeleteUnsentReports之外checkForUnsentReportsWithCompletion 。例如,如果您的用戶完全同意或不同意發送崩潰報告,您可能希望永久設置或禁用崩潰報告。請記住,如果您的應用程序在其生命週期的早期崩潰,您可能永遠不會收到崩潰報告。

面料 SDK

迅速

class YourClassName: CrashlyticsDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions

    ...
    Crashlytics.sharedInstance().delegate = self
    ...

    return true
  }

  func crashlyticsDidDetectReport(forLastExecution report: CLSReport, completionHandler: @escaping (Bool) -> Void) {
    /* ... handle unsent reports */
  }

  func crashlyticsCanUseBackgroundSessions(_ crashlytics: Crashlytics) -> Bool {
    return true
  }
}

目標-C

@interface YourClassName <CrashlyticsDelegate> ()
@end

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  ...
  [[Crashlytics sharedInstance] setDelegate:self];
  ...

  return YES;
}

-(void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler {
  // ... handle unsent reports
}

-(BOOL)crashlyticsCanUseBackgroundSessions:(Crashlytics *)crashlytics {
  return YES;
}

@end

Firebase Crashlytics SDK

迅速

/* You must set setCrashlyticsCollectionEnabled to false in order to use
checkForUnsentReportsWithCompletion. */

Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)

Crashlytics.crashlytics().checkForUnsentReports { hasUnsentReport in
  let hasUserConsent = false
  // ...get user consent.

  if hasUserConsent && hasUnsentReport {
    Crashlytics.crashlytics().sendUnsentReports()
  } else {
    Crashlytics.crashlytics().deleteUnsentReports()
  }
}

// Detect when a crash happens during your app's last run.
if Crashlytics.crashlytics().didCrashDuringPreviousExecution() {
  // ...notify the user.
}

目標-C

/* You must set setCrashlyticsCollectionEnabled to false in order to use
checkForUnsentReportsWithCompletion. */

[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:false];

[[FIRCrashlytics crashlytics] checkForUnsentReportsWithCompletion:^(BOOL hasUnsentReports) {
  BOOL hasConsent = false;
  // ...get consent from user.

  if (hasConsent && hasUnsentReports) {
    [[FIRCrashlytics crashlytics] sendUnsentReports];
  } else {
    [[FIRCrashlytics crashlytics] deleteUnsentReports];
  }
}];

// Detect when a crash happens during your app's last run.
if ([[FIRCrashlytics crashlytics] didCrashDuringPreviousExecution]) {
  // ...notify the user.
}

造成改變的原因

新的方法集讓您可以更好地控制應用程序的崩潰報告行為。此外,您不再需要在初始化 Crashlytics 之前設置 CrashlyticsDelegate。


firebase_crashlytics_collection_enabled 被 FirebaseCrashlyticsCollectionEnabled 取代。

當您設置FirebaseCrashlyticsCollectionEnabled在假Info.plist ,Crashlytics自動停止發送在啟動時崩潰報告。您的應用程序的第一次運行之後,您還可以通過禁用崩潰報告設置setCrashlyticsCollectionEnabledfalse在你的Crashlytics.h ,但要注意setCrashlyticsCollectionEnabled覆蓋此標誌。

通過更換關閉自動收集firebase_crashlytics_collection_enabled在關鍵Info.plist

  • 重點: FirebaseCrashlyticsCollectionEnabled

  • 價值: false

您的應用程序第一次運行之後,您還可以通過添加以下到您關閉自動收集Crashlytics.h

Firebase Crashlytics SDK

迅速

// setCrashlyticsCollectionEnabled is set to true by default.
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)

目標-C

// setCrashlyticsCollectionEnabled is set to true by default.
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:false];

造成改變的原因

現在,當您禁用自動崩潰報告時,您可以更好地控制 Crashlytics 如何處理未發送的崩潰報告。當您設置FirebaseCrashlyticsCollectionEnabled為false,你可以調用checkForUnsentReportsWithCompletion從您的應用程序並刪除未發送報告的任何地方發送或,取決於你的用戶選擇。


現在,Crashlytics 始終使用後台會話。

以前,您可以關閉後台會話,如果你不想通過設置來支持它在你的應用程序crashlyticsCanUseBackgroundSessions為false。現在, crashlyticsCanUseBackgroundSessions始終設置為true。

造成改變的原因

我們不再支持低於 7.0 的 iOS 版本或低於 OS X 10.9 的 macOS 版本,它們不支持後台會話。


Crashlytics 只能使用 Google Analytics 收集的數據。

升級到 Firebase Crashlytics SDK 後,您將無法再使用 Fabric Answers 收集數據。要獲取無崩潰用戶和麵包屑的指標,請改用 Google Analytics。請注意,您的歷史答案數據無法遷移到 Firebase。

訪問開始使用谷歌分析,以了解如何谷歌分析添加到您的應用程序。

造成改變的原因

我們現在提供 Google Analytics 來幫助您更深入地了解您的崩潰數據。借助 Analytics,您可以繼續在 Firebase 控制台中為您的應用收集統計信息。

下一步