Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Sesuaikan laporan kerusakan Firebase Crashlytics Anda

Panduan ini menjelaskan cara menyesuaikan laporan kerusakan Anda menggunakan Firebase Crashlytics SDK. Secara default, Crashlytics secara otomatis mengumpulkan laporan kerusakan untuk semua pengguna aplikasi Anda (Anda dapat menonaktifkan pelaporan kerusakan otomatis dan mengaktifkan pelaporan keikutsertaan untuk pengguna Anda). Crashlytics menyediakan empat mekanisme logging di luar kotak: kunci khusus , log khusus , pengenal pengguna , dan pengecualian yang tertangkap .

Tambahkan kunci khusus

Kunci khusus membantu Anda mendapatkan status spesifik aplikasi yang mengarah ke error. Anda dapat mengaitkan pasangan kunci/nilai arbitrer dengan laporan kerusakan, lalu menggunakan kunci khusus untuk menelusuri dan memfilter laporan kerusakan di Firebase console.

  • Di dasbor Crashlytics , Anda dapat menelusuri masalah yang cocok dengan kunci khusus.
  • Saat Anda meninjau masalah tertentu di konsol, Anda dapat melihat kunci khusus yang terkait untuk setiap peristiwa ( Subtab tombol ) dan bahkan memfilter peristiwa dengan tombol khusus ( Menu filter di bagian atas halaman).

Gunakan metode setCustomValue untuk menyetel pasangan kunci/nilai. Sebagai contoh:

Cepat

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

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

Objective-C

Saat menyetel integer, boolean, atau float, kotakkan nilainya sebagai @( 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"];

Anda juga dapat mengubah nilai kunci yang ada dengan memanggil kunci dan menyetelnya ke nilai yang berbeda. Sebagai contoh:

Cepat

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

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

Objective-C

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

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

Tambahkan pasangan kunci/nilai secara massal menggunakan metode setCustomKeysAndValues ​​dengan NSDictionary sebagai satu-satunya parameter:

Cepat

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)

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

Tambahkan pesan log khusus

Untuk memberi Anda lebih banyak konteks untuk peristiwa yang mengarah ke error, Anda dapat menambahkan log Crashlytics kustom ke aplikasi Anda. Crashlytics mengaitkan log dengan data error Anda dan menampilkannya di halaman Crashlytics di Firebase console , di bawah tab Log .

Cepat

Gunakan log() atau log(format:, arguments:) untuk membantu menentukan masalah. Jika Anda ingin mendapatkan output log yang berguna dengan pesan, objek yang Anda teruskan ke log() harus sesuai dengan properti CustomStringConvertible . log() mengembalikan properti deskripsi yang Anda tetapkan untuk objek. Sebagai contoh:

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

.log(format:, arguments:) memformat nilai yang dikembalikan dari pemanggilan getVaList() . Sebagai contoh:

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

Untuk detail selengkapnya tentang cara menggunakan log() atau log(format:, arguments:) , lihat dokumentasi referensi Crashlytics .

Objective-C

Gunakan log atau logWithFormat untuk membantu menentukan masalah. Perhatikan bahwa jika Anda ingin mendapatkan output log yang berguna dengan pesan, objek yang Anda teruskan ke salah satu metode harus mengganti properti instance description . Sebagai contoh:

[[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];

Untuk detail selengkapnya tentang cara menggunakan log dan logWithFormat , lihat dokumentasi referensi Crashlytics .

Tetapkan pengidentifikasi pengguna

Untuk mendiagnosis masalah, mengetahui pengguna mana yang mengalami error tertentu sering kali membantu. Crashlytics menyertakan cara untuk mengidentifikasi pengguna secara anonim dalam laporan kerusakan Anda.

Untuk menambahkan ID pengguna ke laporan Anda, tetapkan setiap pengguna pengidentifikasi unik dalam bentuk nomor ID, token, atau nilai hash:

Cepat

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

Objective-C

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

Jika Anda perlu menghapus pengenal pengguna setelah Anda menyetelnya, setel ulang nilainya ke string kosong. Menghapus pengenal pengguna tidak menghapus data Crashlytics yang ada. Jika Anda perlu menghapus catatan yang terkait dengan ID pengguna, hubungi dukungan Firebase .

Laporkan pengecualian non-fatal

Selain melaporkan kerusakan aplikasi secara otomatis, Crashlytics memungkinkan Anda merekam pengecualian non-fatal dan mengirimkannya kepada Anda saat aplikasi diluncurkan lagi.

Anda dapat merekam pengecualian non-fatal dengan merekam objek NSError dengan metode recordError . recordError menangkap tumpukan panggilan utas dengan memanggil [NSThread callStackReturnAddresses] .

Cepat

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

Objective-C

[[FIRCrashlytics crashlytics] recordError:error];

Saat menggunakan metode recordError , penting untuk memahami struktur NSError dan cara Crashlytics menggunakan data untuk mengelompokkan error. Penggunaan metode recordError yang salah dapat menyebabkan perilaku yang tidak terduga dan dapat menyebabkan Crashlytics membatasi pelaporan kesalahan yang dicatat untuk aplikasi Anda.

Objek NSError memiliki tiga argumen:

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

Tidak seperti kerusakan fatal, yang dikelompokkan melalui analisis pelacakan tumpukan, kesalahan yang dicatat dikelompokkan berdasarkan domain dan code . Ini adalah perbedaan penting antara crash fatal dan kesalahan yang dicatat. Sebagai contoh:

Cepat

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)

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

Saat Anda mencatat kesalahan di atas, itu membuat masalah baru yang dikelompokkan berdasarkan NSSomeErrorDomain dan -1001 . Kesalahan log tambahan yang menggunakan domain dan nilai kode yang sama dikelompokkan dalam masalah yang sama. Data yang terkandung dalam objek userInfo dikonversi menjadi pasangan nilai kunci dan ditampilkan di bagian kunci/log dalam masalah individual.

Log dan kunci khusus

Sama seperti laporan kerusakan, Anda dapat menyematkan log dan kunci khusus untuk menambahkan konteks ke NSError . Namun, ada perbedaan dalam log yang dilampirkan ke error versus error yang dicatat. Saat terjadi error dan aplikasi diluncurkan kembali, log yang diambil Crashlytics dari disk adalah yang ditulis hingga saat error. Saat Anda mencatat NSError , aplikasi tidak langsung berhenti. Karena Crashlytics hanya mengirimkan laporan kesalahan yang dicatat pada peluncuran aplikasi berikutnya dan harus membatasi jumlah ruang yang dialokasikan untuk log pada disk, dimungkinkan untuk mencatat cukup banyak setelah NSError dicatat sehingga semua log yang relevan dirotasi pada saat Crashlytics mengirim laporan dari perangkat. Ingatlah keseimbangan ini saat mencatat NSErrors dan menggunakan log dan kunci khusus di aplikasi Anda.

Pertimbangan kinerja

Perlu diingat bahwa mencatat NSError bisa cukup mahal. Saat Anda melakukan panggilan, Crashlytics menangkap tumpukan panggilan utas saat ini menggunakan proses yang disebut pelepasan tumpukan. Proses ini dapat menjadi intensif CPU dan I/O, terutama pada arsitektur yang mendukung pelepasan DWARF (arm64 dan x86). Setelah pelepasan selesai, informasi ditulis ke disk secara serempak. Ini mencegah kehilangan data jika baris berikutnya mogok.

Meskipun aman untuk memanggil API ini di utas latar belakang, ingatlah bahwa mengirimkan panggilan ini ke antrean lain akan kehilangan konteks pelacakan tumpukan saat ini.

Bagaimana dengan NSExceptions?

Crashlytics tidak menawarkan fasilitas untuk mencatat dan merekam NSException secara langsung. Secara umum, Cocoa dan Cocoa Touch API tidak terkecuali. Itu berarti penggunaan @catch dapat memiliki efek samping yang tidak diinginkan yang sangat serius dalam proses Anda, bahkan ketika digunakan dengan sangat hati-hati. Anda tidak boleh menggunakan pernyataan @catch dalam kode Anda. Silakan merujuk ke dokumentasi Apple tentang topik tersebut.

Aktifkan pelaporan keikutsertaan

Secara default, Crashlytics secara otomatis mengumpulkan laporan kerusakan untuk semua pengguna aplikasi Anda. Untuk memberi pengguna lebih banyak kontrol atas data yang mereka kirim, Anda dapat mengaktifkan pelaporan keikutsertaan dengan menonaktifkan pelaporan otomatis dan hanya mengirim data ke Crashlytics jika Anda memilih untuk melakukannya dalam kode Anda:

  1. Matikan pengumpulan otomatis dengan menambahkan kunci baru ke file Info.plist Anda:

    • Kunci: FirebaseCrashlyticsCollectionEnabled
    • Nilai: false
  2. Aktifkan pengumpulan untuk pengguna tertentu dengan memanggil penggantian pengumpulan data Crashlytics saat runtime. Nilai penggantian tetap ada di seluruh peluncuran aplikasi Anda sehingga Crashlytics dapat mengumpulkan laporan secara otomatis.

    Untuk menyisih dari pelaporan kerusakan otomatis, berikan false sebagai nilai penggantian. Jika disetel ke false , nilai baru tidak berlaku hingga aplikasi dijalankan berikutnya.

    Cepat

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Kelola data Crash Insights

Crash Insights membantu Anda menyelesaikan masalah dengan membandingkan pelacakan tumpukan anonim Anda dengan pelacakan dari aplikasi Firebase lain dan memberi tahu Anda jika masalah Anda merupakan bagian dari tren yang lebih besar. Untuk banyak masalah, Crash Insights bahkan menyediakan sumber daya untuk membantu Anda men-debug kerusakan tersebut.

Crash Insights menggunakan data kerusakan agregat untuk mengidentifikasi tren stabilitas umum. Jika Anda memilih untuk tidak membagikan data aplikasi, Anda dapat menyisih dari Crash Insights dari menu Crash Insights di bagian atas daftar masalah Crashlytics di Firebase console .