Mengupgrade ke Firebase Crashlytics SDK

Anda kini dapat menyiapkan Crashlytics di aplikasi menggunakan Firebase Crashlytics SDK resmi baru, yang menawarkan API yang lebih baik dan lebih konsisten dengan produk Firebase lainnya serta lebih intuitif untuk digunakan.

Panduan ini menjelaskan cara mengupgrade ke SDK baru dari Fabric SDK yang lama. Panduan ini menjelaskan perubahan yang ada pada API baru, alasan perubahan, dan cara mengubah kode Anda, jika diperlukan.

Sebelum memulai

Langkah 1: Tambahkan file konfigurasi Firebase

  1. Buka Setelan Project. Di kartu Aplikasi Anda, pilih ID paket aplikasi yang Anda perlukan file konfigurasinya.

  2. Klik Download GoogleService-Info.plist untuk mendapatkan file konfigurasi platform Apple Firebase Anda (GoogleService-Info.plist).

  3. Pindahkan file konfigurasi ke root project Xcode Anda. Jika diminta, pilih untuk menambahkan file konfigurasi ke semua target.

Jika ada beberapa ID paket dalam project, Anda harus mengaitkan setiap ID paket dengan aplikasi yang terdaftar di Firebase console, sehingga setiap aplikasi dapat memiliki file GoogleService-Info.plist sendiri.

Langkah 2: Tambahkan Firebase Crashlytics SDK

  1. Dalam CocoaPods, ganti pod Fabric dan Crashlytics dengan pod Firebase/Crashlytics di semua target.

    # Add the pod for Firebase Crashlytics
    pod 'Firebase/Crashlytics'
    # Recommended: Add the Firebase pod for Google Analytics pod 'Firebase/Analytics'
  2. Uninstal atau hapus dependensi pihak ketiga secara langsung dari Fabric, seperti dependensi dari Fabric Answers dan kit pihak ketiga.

  3. Instal dan update pod, lalu buka file .xcworkspace untuk melihat project di Xcode:

    pod install
    open YOUR_PROJECT.xcworkspace

Langkah 3: Perbarui kode

  1. Di Xcode, build ulang aplikasi, lalu buka kembali file .xcworkspace Anda.

  2. Tinjau perubahan SDK berikut dan lakukan perubahan yang sesuai pada kode Anda:


Crashlytics kini merotasi ID berdasarkan ID penginstalan Firebase.

Crashlytics menggunakan UUID Penginstalan Crashlytics untuk mengidentifikasi instance aplikasi Anda dan untuk mengaitkan data pengguna dengan perangkat mereka. Sebelumnya, Crashlytics merotasi UUID Penginstalan pengguna saat ID iklan perangkat mereka berubah. Sekarang, Crashlytics merotasi UUID Penginstalan berdasarkan ID penginstalan Firebase (FID) pengguna. Untuk informasi selengkapnya, buka Mengelola ID penginstalan Firebase.

Alasan perubahan

Penggunaan FID konsisten dengan Firebase SDK lainnya.


Skrip run dan upload-symbols sekarang berada di FirebaseCrashlytics.

Sekarang Anda dapat mengakses skrip run dan upload-symbols dari library FirebaseCrashlytics baru. Perhatikan bahwa Anda masih dapat memanggil upload-symbols dari mana pun dalam proses build untuk mengupload dSYM secara manual.

Selain itu, API_KEY dan BUILD_SECRET Fabric tidak lagi disertakan dalam SDK baru. Sebaliknya, Crashlytics kini menggunakan GoogleService-info.plist aplikasi Anda untuk mengaitkan aplikasi dengan project Firebase dan mempertahankan data error historis Anda.

Fabric 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

Alasan perubahan

Crashlytics tidak lagi menggunakan Fabric SDK sebagai dependensi sehingga kami memindahkan alat CLI ke library baru.


Library Crashlytics sekarang disebut FirebaseCrashlytics.

Di aplikasi Anda, ubah jalur impor Anda:

Fabric SDK

Swift

import Crashlytics

Objective-C

@import Crashlytics

Firebase Crashlytics SDK

Swift

import FirebaseCrashlytics

Objective-C

@import FirebaseCrashlytics

Alasan perubahan

Memperbarui nama library Crashlytics akan membuatnya konsisten dengan library Firebase lainnya (misalnya FirebaseFirestore dan FirebaseAuth).


FirebaseCrashlytics tidak lagi berfungsi dengan Fabric SDK.

Sekarang, FirebaseCrashlytics hanya dapat diinisialisasi dengan Firebase Crashlytics SDK. Anda dapat memulai instance FirebaseCrashlytics dengan memanggil FirebaseApp.configure di Swift atau [FIRApp configure] di Objective-C.

Dalam application:didFinishLaunchingWithOptions Anda, ganti panggilan ke Fabric.with dan startWithAPIKey dengan panggilan ke FirebaseApp:

Fabric SDK

Swift

Fabric.with([Crashlytics.self])

Objective-C

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

Firebase Crashlytics SDK

Swift

FirebaseApp.configure()

Objective-C

[FIRApp configure];

Alasan perubahan

Menggunakan metode baru untuk menginisialisasi Crashlytics lebih konsisten dengan cara inisialisasi layanan Firebase lainnya.


Metode error dan throwException dihapus.

SDK baru tidak lagi menyertakan metode crash atau throwException. Sebagai gantinya, gunakan fatalError di Swift atau array kosong di Objective-C untuk menimbulkan error secara sengaja.

Firebase Crashlytics SDK

Swift

// Force a test crash
fatalError()

Objective-C

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

Alasan perubahan

Jenis error yang berbeda dapat terjadi karena berbagai alasan, dan metode ini tidak menentukan dengan jelas apakah error terjadi selama runtime atau di SDK native aplikasi Anda.


Metode sharedInstance kini bernama crashlytics.

SDK baru tidak lagi menyertakan metode sharedInstance. Untuk menginisialisasi Crashlytics, gunakan crashlytics (baca dokumentasi referensi untuk Swift atau Objective-C untuk informasi lebih lanjut). Di delegasi aplikasi Anda, update skrip inisialisasi Anda:

Fabric SDK

Swift

Crashlytics.sharedInstance()

Objective-C

[Crashlytics sharedInstance];

Firebase Crashlytics SDK

Swift

Crashlytics.crashlytics()

Objective-C

[FIRCrashlytics crashlytics];

Alasan perubahan

Kami mengganti nama metode pengambil instance agar konsisten dengan Firebase SDK lainnya.


setUserIdentifier kini menjadi setUserID. setUserName dan setUserEmail dihapus.

Sebelumnya, Anda dapat menetapkan nama atau email yang terkait dengan error menggunakan setUserName dan setUserEmail, tetapi metode ini tidak akan ditentukan lagi. Metode pilihan baru untuk menetapkan ID bagi pengguna adalah menggunakan setUserID.

Fabric SDK

Swift

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

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

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

Objective-C

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

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

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

Firebase Crashlytics SDK

Swift

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

Objective-C

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

Alasan perubahan

Kami menggunakan nama metode setUserID agar konsisten dengan Firebase API lainnya dan menghapus setUserName serta setUserEmail untuk mencegah logging PII melalui Crashlytics.


CLSLogv dan CLSNSLogv diganti dengan fungsi logging.

SDK baru tidak lagi menyertakan fungsi CLSLogv atau CLSNSLogv. Untuk menambahkan pesan log kustom, gunakan metode logging baru di library Crashlytics. Perhatikan bahwa metode baru tidak lagi dicetak ke stdout atau NSLog (sebaiknya tuliskan wrapper jika Anda ingin mempertahankan perilaku ini).

Fabric SDK

Swift

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

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

Objective-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

Swift

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

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

Objective-C

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

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

Jika Anda menggunakan CLS_LOG, tambahkan kode berikut ke file header untuk terus mendapatkan nama file dan nomor baris dalam laporan log:

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

Alasan perubahan

Metode baru memerlukan instance sehingga mempermudah pengujian kode.


setCustomValue menggantikan setObjectValue, setIntValue, setFloatValue, dan setBoolValue.

Metode penyetel kustom tidak lagi disertakan dalam SDK baru. Sebelumnya, Anda dapat menggunakan metode tersebut untuk menetapkan key-value pair untuk dikirimkan bersama dengan laporan error. Sekarang Anda dapat menggunakan setCustomValue:forKey untuk menetapkan key-value pair untuk semua jenis data.

Fabric SDK

Swift

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")

Objective-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

Swift

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")

Objective-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"];

Alasan perubahan

Nama metode baru bersifat unik untuk Crashlytics dan memperjelas bahwa Crashlytics tidak mematuhi nilai kunci.


recordCustomExceptionName:reason:frameArray: diganti dengan Exception Model API.

Jika aplikasi Anda berjalan di lingkungan non-native (misalnya, JavaScript atau Unity), Anda dapat menggunakan Exception Model API untuk melaporkan metadata error dalam format pengecualian native aplikasi Anda.

Fabric SDK

Swift

let 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])

Objective-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

Swift

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)

Objective-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],
];

Alasan perubahan

Fitur ini telah lama diminta dan memungkinkan Anda memperluas Crashlytics ke platform lain, seperti Unity, Flutter, atau React Native.



CrashlyticsDelegate diganti dengan metode terpisah untuk menangani laporan error.

Kini Anda dapat menggunakan serangkaian metode baru untuk menangani laporan error:

  • didFinishLaunchingWithOptions kini diganti dengan pengendali baru checkForUnsentReportsWithCompletion.

  • crashlyticsDidDetectReportForLastExecution kini diganti dengan didCrashDuringPreviousExecution. didCrashDuringPreviousExecution memungkinkan Anda dengan mudah mendeteksi error yang terjadi saat aplikasi Anda dijalankan terakhir kali.

  • crashlyticsCanUseBackgroundSessions sekarang disetel ke true secara permanen.

  • Kami tidak lagi mendukung pemeriksaan objek CLSReport dalam delegasi.

Secara default, Crashlytics otomatis mengupload laporan error saat dimulai, dan sebelumnya Anda dapat memanggil didFinishLaunchingWithOptions untuk memungkinkan pengguna memilih ikut serta dalam pelaporan error. Sekarang, saat Anda memanggil setCrashlyticsCollectionEnabled=false untuk menonaktifkan pelaporan error otomatis, Crashlytics akan memanggil checkForUnsentReportsWithCompletion, yang memungkinkan pengguna memilih apakah akan mengirimkan laporan error atau tidak saat aplikasi Anda mengalami error. Selanjutnya, Anda dapat memanggil sendUnsentReports jika pengguna memilih untuk mengirimkannya atau memanggil deleteUnsentReports jika pengguna memilih untuk tidak mengirimkannya.

Perhatikan bahwa Anda juga dapat memanggil sendUnsentReports dan deleteUnsentReports di luar checkForUnsentReportsWithCompletion. Misalnya, Anda mungkin ingin menyiapkan atau menonaktifkan pelaporan error secara permanen jika pengguna telah memberikan persetujuan atau penolakan menyeluruh untuk mengirimkan laporan error. Perlu diingat bahwa Anda mungkin tidak akan pernah menerima laporan error jika aplikasi mengalami error lebih awal dalam siklus prosesnya.

Fabric SDK

Swift

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
  }
}

Objective-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

Swift

/* 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.
}

Objective-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.
}

Alasan perubahan

Kumpulan metode baru ini memberi Anda kontrol lebih atas perilaku pelaporan error aplikasi. Selain itu, Anda tidak perlu lagi menyiapkan CrashlyticsDelegate sebelum menginisialisasi Crashlytics.


firebase_crashlytics_collection_enabled diganti dengan FirebaseCrashlyticsCollectionEnabled.

Saat Anda menetapkan FirebaseCrashlyticsCollectionEnabled ke false di Info.plist, Crashlytics berhenti mengirimkan laporan error secara otomatis pada saat dimulai. Setelah aplikasi Anda dijalankan pertama kali, Anda juga dapat menonaktifkan pelaporan error dengan menetapkan setCrashlyticsCollectionEnabled ke false di Crashlytics.h, tetapi perhatikan bahwa setCrashlyticsCollectionEnabled akan mengganti flag ini.

Nonaktifkan pengumpulan otomatis dengan mengganti kunci firebase_crashlytics_collection_enabled di Info.plist Anda:

  • Kunci: FirebaseCrashlyticsCollectionEnabled

  • Nilai: false

Setelah menjalankan aplikasi untuk pertama kalinya, Anda juga dapat menonaktifkan pengumpulan otomatis dengan menambahkan kode berikut ke Crashlytics.h:

Firebase Crashlytics SDK

Swift

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

Objective-C

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

Alasan perubahan

Sekarang Anda memiliki kontrol lebih terhadap cara Crashlytics menangani laporan error yang tidak terkirim saat Anda menonaktifkan pelaporan error otomatis. Setelah menetapkan FirebaseCrashlyticsCollectionEnabled ke false, Anda dapat memanggil checkForUnsentReportsWithCompletion dari mana saja di aplikasi, dan mengirim atau menghapus laporan yang tidak terkirim, bergantung pada apa yang dipilih pengguna.


Kini, Crashlytics selalu menggunakan sesi latar belakang.

Sebelumnya, Anda dapat menonaktifkan sesi latar belakang jika tidak ingin mendukungnya di aplikasi dengan menetapkan crashlyticsCanUseBackgroundSessions ke false. Sekarang, crashlyticsCanUseBackgroundSessions selalu ditetapkan ke true.

Alasan perubahan

Kami tidak lagi mendukung versi iOS di bawah 7.0 atau versi macOS di bawah OS X 10.9, yang tidak mendukung sesi latar belakang.


Crashlytics hanya dapat menggunakan data yang dikumpulkan oleh Google Analytics.

Anda tidak lagi dapat mengumpulkan data dengan Fabric Answers setelah mengupgrade ke Firebase Crashlytics SDK. Untuk mendapatkan metrik bagi pengguna bebas error dan breadcrumb, beralihlah untuk menggunakan Google Analytics. Perhatikan bahwa data Answers historis Anda tidak dapat dimigrasikan ke Firebase.

Lihat Mulai menggunakan Google Analytics untuk mempelajari cara menambahkan Google Analytics ke aplikasi Anda.

Alasan perubahan

Kini kami menawarkan Google Analytics untuk membantu Anda mendapatkan lebih banyak insight tentang data error. Dengan Analytics, Anda dapat terus mengumpulkan statistik untuk aplikasi di Firebase console.

Langkah berikutnya