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
Buka Setelan Project. Di kartu Aplikasi Anda, pilih ID paket aplikasi yang Anda perlukan file konfigurasinya.
Klik Download GoogleService-Info.plist untuk mendapatkan file konfigurasi platform Apple Firebase Anda (
GoogleService-Info.plist
).Anda dapat mendownload file konfigurasi platform Apple Firebase lagi kapan saja.
Pastikan nama file konfigurasi tidak ditambahi karakter lain, seperti
(2)
.
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
Dalam CocoaPods, ganti pod
Fabric
danCrashlytics
dengan podFirebase/Crashlytics
di semua target.# Add the pod for Firebase Crashlytics pod 'Firebase/Crashlytics'
# Recommended: Add the Firebase pod for Google Analytics pod 'Firebase/Analytics'Uninstal atau hapus dependensi pihak ketiga secara langsung dari Fabric, seperti dependensi dari Fabric Answers dan kit pihak ketiga.
Instal dan update pod, lalu buka file
.xcworkspace
untuk melihat project di Xcode:pod install
open YOUR_PROJECT.xcworkspace
Langkah 3: Perbarui kode
Di Xcode, build ulang aplikasi, lalu buka kembali file .xcworkspace Anda.
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 barucheckForUnsentReportsWithCompletion
.crashlyticsDidDetectReportForLastExecution
kini diganti dengandidCrashDuringPreviousExecution
.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
Uji implementasi Anda dengan sengaja menimbulkan error pengujian yang akan mengirim laporan error ke dasbor Crashlytics di Firebase console.
Sesuaikan penyiapan laporan error dengan menambahkan pelaporan keikutsertaan, log, kunci, dan pelacakan error non-fatal.
Tambahkan Google Analytics ke aplikasi Anda. Gabungkan keandalan Google Analytics dengan Firebase Crashlytics untuk melihat statistik pengguna bebas error di Firebase console.