Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önemli
Visual Studio App Center, 30 Haziran 2026'ya kadar desteklenmeye devam edecek Analiz ve Tanılama özellikleri dışında 31 Mart 2025'te kullanımdan kaldırılmıştır. Daha fazla bilgi edinin.
App Center Kilitlenmeleri, uygulamanız her kilitlenişinde otomatik olarak bir kilitlenme günlüğü oluşturur. Günlük, ilk olarak cihazın depolama alanına yazılır ve kullanıcı uygulamayı tekrar başlattığında, kilitlenme raporu App Center'a gönderilir. Kilitlenmeleri toplamak, hem beta uygulamalar hem de Uygulama Mağazası'na gönderilen canlı uygulamalar için çalışır. Çökme günlükleri, çökme sorununu çözmenize yardımcı olacak değerli bilgiler içerir.
Uygulamanızda SDK'yı henüz ayarlamadıysanız Başlarken bölümünü izleyin.
Ayrıca, macOS'ta kilitlenme günlükleri sembolizasyon gerektirir. Uygulamanız için sembollerin nasıl sağlanacağını açıklayan App Center Tanılama belgelerine göz atabilirsiniz.
Uyarı
4.0.0 App Center sürümünde büyük değişiklikler yapılmıştır.
App Center'ı önceki sürümlerden geçirmek için App Center SDK 4.0.0 ve üzeri sürümlere geçiş bölümünü izleyin.
Uzantılarda çökme raporlaması
App Center, macOS uzantılarında kilitlenme raporlamayı destekler. Kullanım, kapsayıcı uygulamasındakiyle aynıdır.
Test kilitlenmesi oluştur
App Center Çökmeleri, SDK'nın kolayca test edilmesi için bir test çökmesi oluşturmanızı sağlayan bir API sunar. Bu API yalnızca test/beta uygulamalarında kullanılabilir ve üretim uygulamalarında hiçbir şey yapmaz.
[MSACCrashes generateTestCrash];
Crashes.generateTestCrash()
Önceki kilitlenme hakkında daha fazla bilgi edinin
App Center Çökmesi, uygulamanızın çökmesi durumunda size daha fazla bilgi sağlayan iki API'si bulundurur.
Uygulama önceki oturumda düşük bellek uyarısı mı aldı?
SDK'yı başlattıktan sonra herhangi bir zamanda uygulamanın önceki oturumda bir bellek uyarısı almış olup olmadığını kontrol edebilirsiniz:
[MSACCrashes hasReceivedMemoryWarningInLastSession];
Crashes.hasReceivedMemoryWarningInLastSession
Uyarı
Bu yöntem yalnızca Crashes başlatıldıktan sonra kullanılmalıdır; başlamadan önce her zaman NO veya false döndürür.
Uyarı
Bazı durumlarda, belleği düşük olan bir cihaz olayları gönderemez.
Uygulama önceki oturumda kilitlendi mi?
SDK'yı başlattıktan sonra istediğiniz zaman uygulamanın önceki başlatmada kilitlenip kilitlenmediğini de kontrol edebilirsiniz:
[MSACCrashes hasCrashedInLastSession];
Crashes.hasCrashedInLastSession
Bu, kilitlenme gerçekleştikten sonra uygulamanızın davranışını veya kullanıcı arabirimini ayarlamak istemeniz durumunda kullanışlıdır.
Uyarı
Bu yöntem yalnızca MSACCrashes başlatıldıktan sonra kullanılmalıdır; başlamadan önce her zaman NO veya false döndürür.
Son çökme ile ilgili ayrıntılar
Uygulamanız daha önce kilitlendiyse son kilitlenmeyle ilgili ayrıntıları alabilirsiniz.
MSACErrorReport *crashReport = [MSACCrashes lastSessionCrashReport];
var crashReport = Crashes.lastSessionCrashReport
Uyarı
Yöntem yalnızca Crashes başlatıldıktan sonra kullanılmalıdır, nil her zaman başlamadan önce dönecektir.
Bu API için çok sayıda kullanım örneği vardır; en yaygın olanı bu API'yi çağıran ve özel CrashesDelegate'lerini uygulayan kişilerdir.
App Center Kilitlenmelerinin kullanımını özelleştirin
App Center Kilitlenmeleri, geliştiricilerin App Center'a kilitlenme günlükleri göndermeden önce ve gönderirken ek eylemler gerçekleştirebilmesi için geri çağrılar (callbacks) sağlar.
Özel davranışınızı eklemek için - protokolünü CrashesDelegatebenimsemeniz gerekir, tüm yöntemleri isteğe bağlıdır.
Temsilci olarak kaydol
[MSACCrashes setDelegate:self];
Crashes.delegate = self
Uyarı
App Center, başlatmadan hemen sonra kilitlenmeleri işlemeye başladığından, çağrısından önce temsilciyi AppCenter.start gerekir.
Kilitlenme işlenmeli mi?
Belirli bir çökme olayının işlenmesi gerekip gerekmediğine karar vermek istiyorsanız, crashes:shouldProcessErrorReport:-protokolünü benimseyen sınıfta CrashesDelegate-yöntemini uygulayın. Örneğin, yoksaymak isteyebileceğiniz ve App Center'a göndermek istemediğiniz bir sistem seviyesinde çökme olabilir.
- (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.
}
Ele Alınan Hatalar
App Center ayrıca yöntem aracılığıyla trackError işlenen özel durumları kullanarak hataları izlemenize de olanak tanır. Uygulama isteğe bağlı olarak, daha fazla bağlam sağlamak için işlenen bir hata raporuna özellikler veya/ve ekler ekleyebilir.
@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)
}
İzleme özel durumları için trackException yöntemini kullanabilirsiniz.
@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)
}
Kullanıcının hata raporu göndermek üzere onay isteyin
Kullanıcı gizliliği sizin için önemliyse, App Center'a kilitlenme raporu göndermeden önce kullanıcı onayı almak isteyebilirsiniz. SDK, App Center Çökmeler modülüne herhangi bir çökme raporu göndermeden önce kullanıcı onayını beklemesini belirten bir geri çağırım sağlar.
Bunu yapmayı seçerseniz, kullanıcının onayını almak sizin sorumluluğundadır; örneğin, aşağıdaki seçeneklerden birini içeren bir iletişim kutusu istemi aracılığıyla: Her zaman gönder, Gönder ve Gönderme. Girişe bağlı olarak App Center Crashes'e ne yapması gerektiğini belirteceksiniz ve bu durumda kilitlenme uygun şekilde işlenecektir.
Uyarı
SDK bunun için bir iletişim kutusu görüntülemez, uygulamanın kullanıcı onayı istemek için kendi kullanıcı arabirimini sağlaması gerekir.
Aşağıdaki yöntem, kullanıcı onay işleyicisinin nasıl ayarlandığını gösterir:
[MSACCrashes setUserConfirmationHandler:(^(NSArray<MSACErrorReport *> *errorReports) {
// Your code to present your UI to the user, e.g. an NSAlert.
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText:@"Sorry about that!"];
[alert setInformativeText:@"Do you want to send an anonymous crash report so we can fix the issue?"];
[alert addButtonWithTitle:@"Always send"];
[alert addButtonWithTitle:@"Send"];
[alert addButtonWithTitle:@"Don't send"];
[alert setAlertStyle:NSWarningAlertStyle];
switch ([alert runModal]) {
case NSAlertFirstButtonReturn:
[MSACCrashes notifyWithUserConfirmation:MSACUserConfirmationAlways];
break;
case NSAlertSecondButtonReturn:
[MSACCrashes notifyWithUserConfirmation:MSACUserConfirmationSend];
break;
case NSAlertThirdButtonReturn:
[MSACCrashes notifyWithUserConfirmation:MSACUserConfirmationDontSend];
break;
default:
break;
}
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 NSAlert.
let alert: NSAlert = NSAlert()
alert.messageText = "Sorry about that!"
alert.informativeText = "Do you want to send an anonymous crash report so we can fix the issue?"
alert.addButton(withTitle: "Always send")
alert.addButton(withTitle: "Send")
alert.addButton(withTitle: "Don't send")
alert.alertStyle = NSWarningAlertStyle
switch (alert.runModal()) {
case NSAlertFirstButtonReturn:
Crashes.notify(with: .always)
break;
case NSAlertSecondButtonReturn:
Crashes.notify(with: .send)
break;
case NSAlertThirdButtonReturn:
Crashes.notify(with: .dontSend)
break;
default:
break;
}
return true // Return true if the SDK should await user confirmation, otherwise return false.
})
Yukarıdaki işleyici bloğunda geri dönmeniz YES/true durumunda uygulamanız kullanıcı izni almalı ve aşağıdaki API'yi kullanarak sonucu SDK'ya iletmelidir. Yukarıdaki örnekte yaptığımız gibi, bunun için bir uyarı kullanıyorsanız, çağrıyı sonucuna (runModal) göre yaparsınız.
// Depending on the user'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)
Ana iş parçacığında gerçekleşen yakalanmamış özel durumları yakalamayı etkinleştirme
AppKit, birincil iş parçacığında oluşan özel durumları yakalar ve uygulamanın macOS'ta kilitlenmesini önler. Bu nedenle SDK bu kilitlenmeleri yakalayamaz. iOS davranışını taklit etmek için SDK başlatmadan önce bayrağı ayarlayın NSApplicationCrashOnExceptions , bu bayrak uygulamanın yakalanmayan özel durumlarda kilitlenmesine izin verir ve SDK bunları bildirebilir.
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"NSApplicationCrashOnExceptions" : @YES }];
UserDefaults.standard.register(defaults: ["NSApplicationCrashOnExceptions": true])
Uyarı
App Center SDK'sı, 1.10.0 ve altındaki sürümlerde bayrağı otomatik olarak ayarlar. Sürüm 1.11.0'dan itibaren bu bayrak artık otomatik olarak ayarlanmadı.
Uygulama ana sınıfının yöntem çağrılarının App Center Crashes'e iletilmesini devre dışı bırak
App Center Crashes SDK’si, uygulamanın ana sınıfındaki bazı yöntem çağrılarını kendisine yönlendirerek tümleştirmeyi geliştirmek amacıyla "swizzling" tekniğini kullanır. Yöntem kaydırma, çalışma zamanında yöntemlerin uygulanmasını değiştirmenin bir yoludur. Herhangi bir nedenle swizzling kullanmak istemiyorsanız (örneğin, belirli bir politika nedeniyle), Crashes'ın ana iş parçacığında atılan istisnaları doğru bir şekilde rapor edebilmesi için uygulamanın reportException: ve sendEvent: yöntemlerini kendiniz geçersiz kılmalısınız.
ReportExceptionApplication.m dosyası oluşturun ve aşağıdaki uygulamayı ekleyin:
@import Cocoa; @import AppCenterCrashes; @interface ReportExceptionApplication : NSApplication @end @implementation ReportExceptionApplication - (void)reportException:(NSException *)exception { [MSACCrashes applicationDidReportException:exception]; [super reportException:exception]; } - (void)sendEvent:(NSEvent *)theEvent { @try { [super sendEvent:theEvent]; } @catch (NSException *exception) { [self reportException:exception]; } } @endUyarı
try/catchSwift ile çalışmazNSException. Bu özel durumlar yalnızca Objective-C'da işlenebilir.Info.plist dosyasını açın ve Asıl sınıf alanındaki NSApplication değerini bu örnekteki uygulama sınıfı adınız olan ReportExceptionApplication ile değiştirin.
App Center SDK'de swizzling'i devre dışı bırakmak için
AppCenterApplicationForwarderEnabledanahtarını Info.plist dosyasına ekleyin ve değerini0olarak ayarlayın.
Kilitlenme günlüğü için gönderim durumu hakkında bilgi edinme
Bazen uygulamanızın çökme durumunu bilmek istersiniz. Yaygın kullanım örneklerinden biri, kullanıcılara uygulamanızın kilitlenme raporu gönderdiğini bildiren kullanıcı arabirimini göstermek veya başlatma işleminden sonra uygulamanızın hızla kilitlenmesi durumunda kilitlenme günlüklerinin gönderildiğinden emin olmak için uygulamanın davranışını ayarlamak istemenizdir.
CrashesDelegate-protocol, neler olduğu hakkında bildirim almak için uygulamanızda kullanabileceğiniz üç farklı geri çağırma tanımlar:
Aşağıdaki geri arama, SDK bir kilitlenme günlüğü göndermeden önce çağrılacaktır.
- (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.
}
Uç noktada ağ sorunları veya kesinti olması ve uygulamayı yeniden başlatmanız durumunda işlem willSendErrorReport yeniden başlatıldıktan sonra yeniden tetikleniyor.
SDK bir kilitlenme günlüğünü başarıyla gönderdikten sonra aşağıdaki geri arama tetiklenir
- (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.
}
SDK bir kilitlenme günlüğü göndermede başarısız olursa aşağıdaki geri çağrı işlevi çağrılır.
- (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.
}
Almak didFailSendingErrorReport, 4xx kodu gibi kurtarılamaz bir hata oluştuğu anlamına gelir. Örneğin, 401 yanlış olduğu anlamına gelir appSecret .
Bu geri çağırma bir ağ sorunu olduğunda tetiklenmez. Bu durumda SDK yeniden denemeye devam eder (ve ayrıca ağ bağlantısı kapatılırken yeniden denemeleri duraklatır).
Kilitlenme raporuna ek dosyalar ekleme
Kilitlenme raporuna ikili ve metin ekleri ekleyebilirsiniz. SDK, bunları App Center portalında görebilmeniz için çökme ile birlikte gönderir. Önceki uygulama başlatmalarından kaynaklanan depolanan çökme raporu gönderilmeden hemen önce, aşağıdaki geri çağrı işlevi tetiklenecektir. Kilitlenme gerçekleştiğinde çağrılmayacak. İşte bir kilitlenmeye metin ve resim eklemenin nasıl yapılacağına dair bir örnek:
- (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!]
}
Uyarı
Boyut sınırı şu anda 7 MB'tır. Daha büyük bir ek göndermeye çalışmak bir hatayı tetikler.
Çalışma zamanında App Center Çökmelerini etkinleştirme veya devre dışı bırakma
Çalışma zamanında App Center Crashes özelliğini etkinleştirebilir ve devre dışı bırakabilirsiniz. Devre dışı bırakırsanız SDK, uygulama için kilitlenme bildirimi yapmaz.
[MSACCrashes setEnabled:NO];
Crashes.enabled = false
App Center Kilitlenmelerini yeniden etkinleştirmek için aynı API'yi kullanın ancak parametre olarak geçirin YES/true .
[MSACCrashes setEnabled:YES];
Crashes.enabled = true
Durum, uygulama başlatmaları arasında cihazın depolama alanında kalıcı olur.
Uyarı
Crashes başlatıldıktan sonra bu yöntem yalnızca kullanılmalıdır.
App Center Kilitlenmelerinin etkinleştirilip etkinleştirilmediğini denetleyin
App Center'ın Çökmelerinin etkinleştirilip etkinleştirilmediğini de kontrol edebilirsiniz.
BOOL enabled = [MSACCrashes isEnabled];
var enabled = Crashes.enabled
Uyarı
Yöntem yalnızca Crashes başlatıldıktan sonra kullanılmalıdır, false her zaman başlamadan önce dönecektir.
Mach özel durum işlemesini devre dışı bırakma
Varsayılan olarak, App Center Crashes, Mach özel durum işleyicisini kullanarak Mach özel durum sunucusu üzerinden ölümcül sinyalleri (örneğin, yığın taşmalarını) yakalar.
disableMachExceptionHandler-method, Mach özel durum sunucusu aracılığıyla ölümcül sinyallerin yakalanmasını devre dışı bırakma seçeneği sağlar. Mach özel durum işleyicisini devre dışı bırakmak istiyorsanız, SDK'yı başlatmadan önce bu yöntemi çağırmalısınız. Tipik kurulum kodunuz şöyle görünür:
[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])