App Center Kerusakan (iOS)

Penting

Visual Studio App Center dihentikan pada 31 Maret 2025, kecuali untuk fitur Analitik dan Diagnostik, yang akan terus didukung hingga 30 Juni 2026. Pelajari lebih lanjut.

App Center Crash akan secara otomatis menghasilkan log crash setiap kali aplikasi Anda mengalami crash. Log pertama kali ditulis ke penyimpanan perangkat dan ketika pengguna memulai aplikasi lagi, laporan crash akan dikirim ke App Center. Mengumpulkan crash berfungsi untuk aplikasi beta dan langsung, yaitu yang sudah dikirim ke App Store. Log crash berisi informasi berharga bagi Anda untuk membantu memperbaiki crash.

Ikuti bagian Memulai jika Anda belum menyiapkan SDK di aplikasi Anda.

Selain itu, log crash di iOS memerlukan penyimbolan, periksa dokumentasi Diagnostik App Center yang menjelaskan bagaimana cara menyediakan simbol untuk aplikasi Anda.

Nota

SDK tidak akan meneruskan log crash apa pun jika Anda dilampirkan ke debugger. Pastikan debugger tidak terpasang saat aplikasi mengalami crash.

Nota

Untuk menerima jejak tumpukan yang dilambangkan dengan benar, pastikan bitcode dinonaktifkan. Anda dapat mempelajari lebih lanjut tentang bitcode dalam dokumentasi Simbolikasi iOS App Center.

Nota

Versi 4.0.0 dari App Center diperkenalkan perubahan besar. Ikuti bagian Migrasi ke App Center SDK 4.0.0 dan yang lebih tinggi untuk memigrasikan App Center dari versi sebelumnya.

Pelaporan crash dalam ekstensi

App Center mendukung pelaporan crash di ekstensi iOS. Penggunaannya sama seperti dalam aplikasi kontainer.

Membuat crash pengujian

App Center Crashes memberi Anda API untuk menghasilkan crash uji yang mempermudah pengujian SDK. API ini hanya dapat digunakan dalam aplikasi pengujian/beta dan tidak akan melakukan apa pun di aplikasi produksi.

[MSACCrashes generateTestCrash];
Crashes.generateTestCrash()

Dapatkan informasi selengkapnya tentang crash sebelumnya

App Center Crashes memiliki dua API yang memberi Anda informasi lebih lanjut jika aplikasi Anda mengalami crash.

Apakah aplikasi menerima peringatan memori rendah di sesi sebelumnya?

Kapan saja setelah memulai SDK, Anda dapat memeriksa apakah aplikasi menerima peringatan memori di sesi sebelumnya:

[MSACCrashes hasReceivedMemoryWarningInLastSession];
Crashes.hasReceivedMemoryWarningInLastSession

Nota

Metode ini hanya boleh digunakan setelah Crashes dimulai, metode ini akan selalu kembali NO atau false sebelum dimulai.

Nota

Dalam beberapa kasus, perangkat dengan memori rendah tidak dapat mengirim peristiwa.

Apakah aplikasi mengalami crash di sesi sebelumnya?

Kapan saja setelah memulai SDK, Anda dapat memeriksa apakah aplikasi mengalami crash di peluncuran sebelumnya:

[MSACCrashes hasCrashedInLastSession];
Crashes.hasCrashedInLastSession

Ini berguna jika Anda ingin menyesuaikan perilaku atau UI aplikasi Anda setelah crash terjadi.

Nota

Metode ini hanya boleh digunakan setelah MSACCrashes dimulai, metode ini akan selalu kembali NO atau false sebelum dimulai.

Detail-detail tentang kerusakan terakhir

Jika aplikasi Anda mengalami crash sebelumnya, Anda bisa mendapatkan detail tentang crash terakhir.

MSACErrorReport *crashReport = [MSACCrashes lastSessionCrashReport];
var crashReport = Crashes.lastSessionCrashReport

Nota

Metode ini hanya boleh digunakan setelah Crashes dimulai, metode ini akan selalu kembali nil sebelum dimulai.

Ada banyak kasus penggunaan untuk API ini, yang paling umum adalah orang-orang yang memanggil API ini dan menerapkan CrashesDelegate kustom mereka.

Sesuaikan penggunaan App Center Crashes Anda

App Center Crash menyediakan panggilan balik bagi pengembang untuk melakukan tindakan tambahan sebelum dan saat mengirim log crash ke App Center.

Untuk menambahkan perilaku kustom, Anda perlu mengadopsi CrashesDelegate-protokol, semua metodenya bersifat opsional.

Mendaftar sebagai delegasi

[MSACCrashes setDelegate:self];
Crashes.delegate = self

Nota

Anda harus mengatur delegasi sebelum memanggil AppCenter.start, karena App Center mulai memproses crash segera setelah awal.

Apakah kerusakan harus diproses?

Terapkan metode crashes:shouldProcessErrorReport: dalam kelas yang mengadopsi protokol CrashesDelegate jika Anda ingin memutuskan apakah crash tertentu perlu diproses atau tidak. Misalnya, mungkin ada crash tingkat sistem yang ingin Anda abaikan dan tidak ingin Anda kirim ke App Center.

- (BOOL)crashes:(MSACCrashes *)crashes shouldProcessErrorReport:(MSACErrorReport *)errorReport {
  return YES; // return YES if the crash report should be processed, otherwise NO.
}
func crashes(_ crashes: Crashes, shouldProcess errorReport: ErrorReport) -> Bool {
  return true; // return true if the crash report should be processed, otherwise false.
}

Kesalahan Yang Ditangani

App Center juga memungkinkan Anda melacak kesalahan dengan menggunakan pengecualian yang ditangani melalui trackError metode. Aplikasi dapat secara opsional melampirkan properti atau/dan lampiran ke laporan kesalahan yang ditangani untuk memberikan konteks lebih lanjut.

@try {
  // Throw error.
} @catch (NSError *error) {

  // Init attachments.
  NSArray<MSACErrorAttachmentLog *> attachments = @[ MSACErrorAttachmentLog attachmentWithText:@"Hello world!" filename:@"hello.txt"] ]

  // Init properties.
  NSDictionary *properties = @{ "Category" : "Music", "Wifi" : "On" };

  // Track errors.
  [MSACCrashes trackError:error withProperties:properties attachments:attachments];
  [MSACCrashes trackError:error withProperties:properties attachments:nil];
  [MSACCrashes trackError:error withProperties:nil attachments:attachments];
  [MSACCrashes trackError:error withProperties:nil attachments:nil];
}
do {
  // Throw error.
} catch {

  // Init attachments.
  let attachments = [ErrorAttachmentLog.attachment(withText: "Hello world!", filename: "hello.txt")]

  // Init properties.
  let properties:Dictionary<String, String> = ["Category" : "Music", "Wifi" : "On"]

  // Track errors.
  Crashes.trackError(error, properties: properties, attachments: attachments)
  Crashes.trackError(error, properties: properties, attachments: nil)
  Crashes.trackError(error, properties: nil, attachments: attachments)
  Crashes.trackError(error, properties: nil, attachments: nil)
}

Untuk pengecualian trek, Anda dapat menggunakan metode trackException.

@try {
  // Throw exceptions.
} @catch (NSException *exception) {

  // Init exceptions.
  MSACExceptionModel *customException1 = [MSACExceptionModel initWithType:@"Custom exception" exceptionMessage:"Track custom exception.", stackTrace:exception.callStackSymbols];
  MSACExceptionModel *customException2 = [MSACExceptionModel initWithException:exception];

  // Track exceptions.
  [MSACCrashes trackException:customException1 withProperties:properties attachments:nil];
  [MSACCrashes trackException:customException2 withProperties:properties attachments:nil];
}
do {
  // Throw exception.
} catch {

  // Init exception.
  let exception = ExceptionModel(withType: "Custom exception", exceptionMessage: "Track custom exception.", stackTrace: Thread.callStackSymbols)

  // Track exception.
  Crashes.trackException(exception, properties: properties, attachments: nil)
}

Jika privasi pengguna penting bagi Anda, Anda mungkin ingin mendapatkan konfirmasi pengguna sebelum mengirim laporan crash ke App Center. SDK mengekspos panggilan balik yang memberi tahu App Center Crashes untuk menunggu konfirmasi dari pengguna sebelum mengirimkan laporan crash.

Jika Anda memilih untuk melakukannya, Anda bertanggung jawab untuk mendapatkan konfirmasi pengguna, misalnya, melalui perintah dialog dengan salah satu opsi berikut: Selalu kirim, Kirim, dan Jangan kirim. Berdasarkan input, Anda akan memberi tahu App Center Crashes apa yang harus dilakukan dan crash kemudian akan ditangani sesuai dengan itu.

Nota

SDK tidak menampilkan dialog untuk ini, aplikasi harus menyediakan UI sendiri untuk meminta persetujuan pengguna.

Nota

Aplikasi tidak boleh memanggil notifyWithUserConfirmation secara eksplisit jika tidak menerapkan dialog konfirmasi pengguna; modul Crash akan menangani pengiriman log untuk Anda secara implisit.

Metode berikut menunjukkan cara menyiapkan handler konfirmasi pengguna:

[MSACCrashes setUserConfirmationHandler:(^(NSArray<MSACErrorReport *> *errorReports) {

  // Your code to present your UI to the user, e.g. an UIAlertController.
  UIAlertController *alertController = [UIAlertController
      alertControllerWithTitle:@"Sorry about that!"
                      message:@"Do you want to send an anonymous crash report so we can fix the issue?"
                preferredStyle:UIAlertControllerStyleAlert];

  [alertController
      addAction:[UIAlertAction actionWithTitle:@"Don't send"
                                        style:UIAlertActionStyleCancel
                                      handler:^(UIAlertAction *action) {
                                        [MSACCrashes notifyWithUserConfirmation:MSACUserConfirmationDontSend];
                                      }]];

  [alertController
      addAction:[UIAlertAction actionWithTitle:@"Send"
                                        style:UIAlertActionStyleDefault
                                      handler:^(UIAlertAction *action) {
                                        [MSACCrashes notifyWithUserConfirmation:MSACUserConfirmationSend];
                                      }]];

  [alertController
      addAction:[UIAlertAction actionWithTitle:@"Always send"
                                        style:UIAlertActionStyleDefault
                                      handler:^(UIAlertAction *action) {
                                        [MSACCrashes notifyWithUserConfirmation:MSACUserConfirmationAlways];
                                      }]];
  // Show the alert controller.
  [self.window.rootViewController presentViewController:alertController animated:YES completion:nil];
  return YES; // Return YES if the SDK should await user confirmation, otherwise NO.
})];
Crashes.setUserConfirmationHandler({ (errorReports: [ErrorReport]) in

  // Your code to present your UI to the user, e.g. an UIAlertController.
  let alertController = UIAlertController(title: "Sorry about that!",
                                          message: "Do you want to send an anonymous crash report so we can fix the issue?",
                                          preferredStyle:.alert)

  alertController.addAction(UIAlertAction(title: "Don't send", style: .cancel) {_ in
    Crashes.notify(with: .dontSend)
  })

  alertController.addAction(UIAlertAction(title: "Send", style: .default) {_ in
    Crashes.notify(with: .send)
  })

  alertController.addAction(UIAlertAction(title: "Always send", style: .default) {_ in
    Crashes.notify(with: .always)
  })

  // Show the alert controller.
  self.window?.rootViewController?.present(alertController, animated: true)
  return true // Return true if the SDK should await user confirmation, otherwise return false.
})

Jika Anda mengembalikan YES/true pada blok handler di atas, aplikasi Anda harus mendapatkan izin pengguna dan mengirim pesan ke SDK dengan hasilnya menggunakan API berikut. Jika Anda menggunakan peringatan untuk ini, seperti yang kami lakukan pada contoh di atas, Anda akan memanggilnya dari dalam implementasi callback alertView:clickedButtonAtIndex: Anda.

// Depending on the users's choice, call notifyWithUserConfirmation: with the right value.
[MSACCrashes notifyWithUserConfirmation:MSACUserConfirmationDontSend];
[MSACCrashes notifyWithUserConfirmation:MSACUserConfirmationSend];
[MSACCrashes notifyWithUserConfirmation:MSACUserConfirmationAlways];
// Depending on the user's choice, call notify(with:) with the right value.
Crashes.notify(with: .dontSend)
Crashes.notify(with: .send)
Crashes.notify(with: .always)

Dapatkan informasi tentang status pengiriman log kerusakan.

Terkadang, Anda ingin mengetahui status crash aplikasi Anda. Kasus penggunaan umum adalah Anda mungkin ingin menampilkan UI yang memberi tahu pengguna bahwa aplikasi Anda mengirimkan laporan crash, atau, jika aplikasi Anda mengalami crash dengan cepat setelah peluncuran, Anda ingin menyesuaikan perilaku aplikasi untuk memastikan log crash dapat dikirimkan. CrashesDelegate-protocol mendefinisikan tiga panggilan balik berbeda yang dapat Anda gunakan di aplikasi Anda untuk diberi tahu tentang apa yang terjadi:

Panggilan balik berikut akan dipanggil sebelum SDK mengirim log crash

- (void)crashes:(MSACCrashes *)crashes willSendErrorReport:(MSACErrorReport *)errorReport {
  // Your code, e.g. to present a custom UI.
}
func crashes(_ crashes: Crashes, willSend errorReport: ErrorReport) {
  // Your code, e.g. to present a custom UI.
}

Jika kami mengalami masalah jaringan atau pemadaman di titik akhir, dan Anda memulai ulang aplikasi, willSendErrorReport dipicu lagi setelah proses dimulai ulang.

Panggilan balik berikut akan dipanggil setelah SDK berhasil mengirim log crash

- (void)crashes:(MSACCrashes *)crashes didSucceedSendingErrorReport:(MSACErrorReport *)errorReport {
  // Your code, e.g. to hide the custom UI.
}
func crashes(_ crashes: Crashes, didSucceedSending errorReport: ErrorReport) {
  // Your code goes here.
}

Panggilan balik berikut akan dipanggil jika SDK gagal mengirim log crash

- (void)crashes:(MSACCrashes *)crashes didFailSendingErrorReport:(MSACErrorReport *)errorReport withError:(NSError *)error {
  // Your code goes here.
}
func crashes(_ crashes: Crashes, didFailSending errorReport: ErrorReport, withError error: Error) {
  // Your code goes here.
}

Penerimaan didFailSendingErrorReport berarti terjadi kesalahan yang tidak dapat dipulihkan seperti kode 4xx . Misalnya, 401 berarti appSecret salah.

Panggilan balik ini tidak dipicu jika merupakan masalah jaringan. Dalam hal ini, SDK terus mencoba kembali (dan juga menjeda percobaan kembali saat koneksi jaringan tidak berfungsi).

Tambahkan lampiran ke laporan crash

Anda dapat menambahkan lampiran biner dan teks ke laporan crash. SDK akan mengirimkannya bersama dengan kerusakan sehingga Anda dapat melihatnya di portal App Center. Fungsi pemanggilan kembali berikut akan dijalankan tepat sebelum mengirimkan laporan crash yang tersimpan dari peluncuran aplikasi sebelumnya. Ini tidak akan dipanggil ketika crash terjadi. Berikut adalah contoh cara melampirkan teks dan gambar pada laporan crash:

- (NSArray<MSACErrorAttachmentLog *> *)attachmentsWithCrashes:(MSACCrashes *)crashes
                                             forErrorReport:(MSACErrorReport *)errorReport {
  MSACErrorAttachmentLog *attachment1 = [MSACErrorAttachmentLog attachmentWithText:@"Hello world!" filename:@"hello.txt"];
  MSACErrorAttachmentLog *attachment2 = [MSACErrorAttachmentLog attachmentWithBinary:[@"Fake image" dataUsingEncoding:NSUTF8StringEncoding] filename:@"fake_image.jpeg" contentType:@"image/jpeg"];
  return @[ attachment1, attachment2 ];
}
func attachments(with crashes: Crashes, for errorReport: ErrorReport) -> [ErrorAttachmentLog]? {
  let attachment1 = ErrorAttachmentLog.attachment(withText: "Hello world!", filename: "hello.txt")
  let attachment2 = ErrorAttachmentLog.attachment(withBinary: "Fake image".data(using: String.Encoding.utf8), filename: nil, contentType: "image/jpeg")
  return [attachment1!, attachment2!]
}

Nota

Batas ukuran saat ini adalah 7 MB. Mencoba mengirim lampiran yang lebih besar akan memicu kesalahan.

Mengaktifkan atau menonaktifkan App Center Crash selama waktu eksekusi

Anda dapat mengaktifkan dan menonaktifkan App Center Crash pada runtime. Jika Anda menonaktifkannya, SDK tidak akan melakukan pelaporan crash untuk aplikasi.

[MSACCrashes setEnabled:NO];
Crashes.enabled = false

Untuk mengaktifkan App Center Crashes lagi, gunakan API yang sama tetapi masukkan YES/true sebagai parameter.

[MSACCrashes setEnabled:YES];
Crashes.enabled = true

Status ini bertahan di penyimpanan perangkat di seluruh peluncuran aplikasi.

Nota

Metode ini hanya boleh digunakan setelah Crashes dimulai.

Periksa apakah App Center Crashes diaktifkan

Anda juga dapat memeriksa apakah App Center Crash diaktifkan atau tidak:

BOOL enabled = [MSACCrashes isEnabled];
var enabled = Crashes.enabled

Nota

Metode ini hanya boleh digunakan setelah Crashes dimulai, metode ini akan selalu kembali false sebelum dimulai.

Menonaktifkan penanganan pengecualian Mach

Secara default, App Center Crash menggunakan handler pengecualian Mach untuk menangkap sinyal fatal, misalnya luapan tumpukan, melalui server pengecualian Mach.

Metode disableMachExceptionHandler menyediakan opsi untuk menonaktifkan penangkapan sinyal fatal melalui server pengecualian Mach. Jika Anda ingin menonaktifkan handler pengecualian Mach, Anda harus memanggil metode ini SEBELUM memulai SDK. Kode penyiapan umum Anda akan terlihat seperti ini:

[MSACCrashes disableMachExceptionHandler];
[MSACAppCenter start:@"{Your App Secret}" withServices:@[[MSACAnalytics class], [MSACCrashes class]]];
Crashes.disableMachExceptionHandler()
AppCenter.start(withAppSecret: "{Your App Secret}", services: [Analytics.self, Crashes.self])