Firebase Crashlytics kilitlenme raporlarınızı özelleştirin


Crashlytics kontrol panelinde bir sorunu tıklayarak ayrıntılı bir etkinlik raporu alabilirsiniz. Bu raporları, özel kampanyaları daha iyi anlamanıza yardımcı olacak şekilde özelleştirebilirsiniz. uygulamanızda neler olduğunu ve kendilerine bildirilen etkinliklerle ilgili koşulları Crashlytics

  • Uygulamanız Google Analytics için Firebase SDK'sını kullanıyorsa ekmek kırıntıları günlüklerini otomatik olarak alın. Bu günlükler, Uygulamanızda Crashlytics tarafından toplanan bir etkinlikle sonuçlanan kullanıcı işlemleri.

  • Otomatik kilitlenme raporlamasını kapatın ve Kullanıcılarınız için kayıt raporlamasını etkinleştirmeniz gerekir. Ancak, Varsayılan ayar olan Crashlytics, tüm kilitlenme raporlarını otomatik olarak toplar. kullanıcılara ulaşabiliyoruz.

Özel anahtarlar ekleyin

Özel anahtarlar, uygulamanızın kilitlenmesine yol açan belirli durumu öğrenmenize yardımcı olur. Rastgele anahtar/değer çiftlerini kilitlenme raporlarınızla ilişkilendirebilir ve ardından, Firebase konsolunda kilitlenme raporlarını aramak ve filtrelemek için özel anahtarları kullanın.

  • Crashlytics kontrol panelinde özel bir anahtarla eşleşen sorunları arayabilirsiniz.
  • Konsolda belirli bir sorunu incelerken her etkinlikle ilişkili özel anahtarları görüntüleyebilir (Anahtarlar alt sekmesi) ve hatta etkinlikleri özel anahtarlara göre filtreleyebilirsiniz (sayfanın üst kısmındaki Filtre menüsü).

Anahtar/değer çiftlerini ayarlamak için setCustomValue yöntemini kullanın. Örneğin:

Swift

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

Tam sayılar, boole değerleri veya kayan noktalı değerleri ayarlarken değeri @(value) olarak kutulayın.

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

// Set str_key to "hello".
[[FIRCrashlytics crashlytics] setCustomValue:@"hello" forKey:@"str_key"];

Ayrıca, mevcut bir anahtarı çağırıp farklı bir değere ayarlayarak anahtarın değerini değiştirebilirsiniz. Örneğin:

Swift

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

setCustomKeysAndValues yöntemini kullanarak toplu anahtar/değer çiftlerini Tek parametre olarak NSDictionary'yi seçin:

Swift

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

Özel günlük mesajları ekleme

Bir kilitlenmeye yol açan etkinliklerle ilgili daha fazla bağlam bilgisi sağlamak için özel Crashlytics günlüklerini kullanabilirsiniz. Crashlytics, günlükleri ilişkilendirir bu verileri kilitlenmenizi sağlar ve uygulamanın Crashlytics sayfasında Firebase konsolunda, Günlükler sekmesi altında.

Swift

Sorunların belirlenmesine yardımcı olması için log() veya log(format:, arguments:) kullanın. Mesajlar içeren yararlı bir günlük çıkışı almak istiyorsanız log()'e ilettiğiniz nesne CustomStringConvertible mülküne uygun olmalıdır. log(), kendisi için tanımladığınız açıklama özelliğini döndürür izin verir. Örneğin:

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

.log(format:, arguments:), getVaList() çağrısından döndürülen değerleri biçimlendirir. Örneğin:

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

log() veya log(format:, arguments:) özelliğinin nasıl kullanılacağıyla ilgili daha ayrıntılı bilgi için bakın: Crashlytics referans belgeleri.

Objective-C

Sorunların belirlenmesine yardımcı olması için log veya logWithFormat kullanın. mesaj içeren kullanışlı bir günlük çıkışı almak istiyorsanız iki yöntemin de description örnek özelliğini geçersiz kılması gerekir. Örneğin:

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

log ve logWithFormat işlemlerinin nasıl kullanılacağı hakkında daha fazla bilgi için Crashlytics referans belgeleri.

Kullanıcı tanımlayıcıları ayarlama

Bir sorunu teşhis etmek için genellikle hangi kullanıcılarınızın belirli bir kilitlenme yaşadığını bilmek yararlıdır. Crashlytics, kullanıcıların kimliğini anonim olarak belirlemenin bir yolunu içerir. kilitlenme raporları gösterilmektedir.

Raporlarınıza kullanıcı kimlikleri eklemek için her kullanıcıya kimlik numarası, jeton veya karma oluşturma işlemi uygulanmış değer biçiminde benzersiz bir tanımlayıcı atayın:

Swift

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

Objective-C

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

Bir kullanıcı tanımlayıcısını ayarladıktan sonra temizlemeniz gerekirse değeri boş bir dizeye sıfırlayın. Kullanıcı tanımlayıcısı temizlendiğinde mevcut Crashlytics kayıtları kaldırılmaz. Bir kullanıcı kimliğiyle ilişkili kayıtları silmeniz gerekiyorsa Firebase destek ekibiyle iletişime geçin.

Önemli olmayan istisnaları bildirin

Crashlytics, uygulamanızın kilitlenmelerini otomatik olarak bildirmenin yanı sıra, önemli olmayan istisnaları kaydedersiniz ve uygulamanız bir dahaki sefere bu istisnaları size gönderir lansman sonrasında gerçekleşebilir.

recordError yöntemiyle NSError nesnelerini kaydederek ölümcül olmayan istisnaları kaydedebilirsiniz. recordError, [NSThread callStackReturnAddresses] işlevini çağırarak mesaj dizisinin çağrı yığınını yakalar.

Swift

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

Objective-C

[[FIRCrashlytics crashlytics] recordError:error];

recordError yöntemini kullanırken NSError konusunu anlamak önemlidir. yapısı ve Crashlytics uygulamasının kilitlenmeleri gruplandırmak için verileri nasıl kullandığı hakkında bilgi verilmektedir. Yanlış recordError yönteminin kullanılması, öngörülemez davranışlara neden olabilir ve Crashlytics neden, uygulamanız için günlüğe kaydedilen hataların raporlanmasını sınırlayabilir.

NSError nesnesinin üç bağımsız değişkeni vardır:

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

Yığın izleme analiziyle gruplanan önemli kilitlenmelerin aksine, günlüğe kaydedilen hatalar domain ve code grubuna göre gruplandırılır. Bu, önemli kilitlenmeler ile günlüğe kaydedilen hatalar arasındaki önemli bir farktır. Örneğin:

Swift

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

Yukarıdaki hatayı günlüğe kaydettiğinizde şuna göre gruplandırılmış yeni bir sorun oluşturulur: NSSomeErrorDomain ve -1001. Aynı alan ve kod değerleri aynı sorun altında gruplandırılır. İçinde bulunduğu veriler userInfo nesnesi anahtar/değer çiftlerine dönüştürülür ve bu nesnel anahtarlar/günlükler bölümüne bakın.

Günlükler ve özel anahtarlar

Kilitlenme raporlarında olduğu gibi, bağlam bilgisi eklemek için günlükleri ve özel anahtarları yerleştirebilirsiniz. NSError. Ancak kilitlenmelere ve günlüklenen hatalara hangi günlüklerin eklendiği arasında bir fark vardır. Bir kilitlenme gerçekleştiğinde uygulama yeniden başlatıldığında, Crashlytics tarafından diskten alınan günlük kayıtları, kilitlenmenin zamanı geldi. Bir NSError günlüğe kaydedildiğinde uygulama hemen feshedilebilir. Crashlytics, yalnızca bir sonraki uygulama başlatıldığında günlüğe kaydedilen hata raporunu gönderir ve diskteki günlükler için ayrılan alan miktarını sınırlaması gerekir. Bu nedenle, bir NSError kaydedildikten sonra yeterli günlük kaydı yapmak mümkündür. Böylece, Crashlytics raporu cihazdan gönderene kadar tüm ilgili günlükler silinir. NSErrors günlük kaydını yaparken ve günlükleri kullanırken bu dengeyi aklınızda bulundurun. ekleyebilirsiniz.

Performansla ilgili konular

NSError günlük kaydının oldukça pahalı olabileceğini unutmayın. O dönemde ki çağrıyı yaparsa Crashlytics, geçerli ileti dizisinin çağrı yığınını adlı bir dizi işlemden oluşur. Bu işlem CPU ve G/Ç yoğun olabilir. Özellikle DWARF geri sarmasını destekleyen mimarilerde (arm64 ve x86). Sarma işlemi tamamlandıktan sonra bilgiler diske senkronize olarak yazılır. Bu, sonraki satırın çökmesi durumunda veri kaybını önler.

Telefon etmek güvenli olsa da bir arka plan iş parçacığı üzerinde bu API'yi kullanmak istiyorsanız, bu çağrıyı başka bir sırası, geçerli yığın izlemenin bağlamını kaybeder.

NSExceptions nedir?

Crashlytics, NSException örneklerini doğrudan günlüğe kaydetme ve kaydetme olanağı sunmaz. Genel olarak Cocoa ve Cocoa Touch API'leri istisnalardan korunaklı değildir. Bu durum, @catch kullanımında çok ciddi istenmeyen kullanımların olabileceği anlamına gelir. yan etkilere yol açabilir. Kodunuzda hiçbir zaman @catch ifadeleri kullanmamalısınız. Daha fazla bilgi için lütfen Apple'ın belgeleri çok önemsiyor.

Yığın izlemeyi özelleştirme

Uygulamanız yerel olmayan bir ortamda (C++ veya Unity gibi) çalışıyorsa kilitlenme meta verilerini uygulamanızın yerel istisna biçiminde bildirmek için Exception Model API'yi kullanabilirsiniz. Bildirilen istisnalar önemli olmayanlar olarak işaretlenir.

Swift

var  ex = ExceptionModel(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame(symbol:"makeError", file:"handler.js", line:495),
  StackFrame(symbol:"then", file:"routes.js", line:102),
  StackFrame(symbol:"main", file:"app.js", line:12),
]

crashlytics.record(exceptionModel:ex)

Objective-C

FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
model.stackTrace = @[
  [FIRStackFrame stackFrameWithSymbol:@"makeError" file:@"handler.js" line:495],
  [FIRStackFrame stackFrameWithSymbol:@"then" file:@"routes.js" line:102],
  [FIRStackFrame stackFrameWithSymbol:@"main" file:@"app.js" line:12],
];

[[FIRCrashlytics crashlytics] recordExceptionModel:model];

Özel yığın çerçeveleri yalnızca şu adreslerle de başlatılabilir:

Swift

var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame(address:0xfa12123),
  StackFrame(address:12412412),
  StackFrame(address:194129124),
]

crashlytics.record(exceptionModel:ex)

Objective-C

FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
model.stackTrace = @[
  [FIRStackFrame stackFrameWithAddress:0xfa12123],
  [FIRStackFrame stackFrameWithAddress:12412412],
  [FIRStackFrame stackFrameWithAddress:194129124],
];


[[FIRCrashlytics crashlytics] recordExceptionModel:model];

İçerik haritası günlüklerini alma

İçerik haritası günlükleri, kullanıcının kilitlenme, önemli olmayan veya ANR etkinliğine neden olan sorunları içerir. Bu günlükler yardımcı olabilir.

Kırıntı günlükleri Google Analytics tarafından desteklenir. Bu nedenle, breadcrumb günlüklerini almak için Firebase projeniz için Google Analytics'i etkinleştirmeniz ve Google Analytics için Firebase SDK'sını uygulamanıza eklemeniz gerekir. Bu koşullar karşılandığında, bir sorunun ayrıntılarını görüntülediğinizde breadcrumb günlükleri, Günlükler sekmesindeki bir etkinliğin verilerine otomatik olarak eklenir.

Analytics SDK'sı, screen_view etkinliğini otomatik olarak günlüğe kaydeder. Bu sayede, içerik haritası günlükleri kilitlenme, ölümcül olmayan veya ANR etkinliğinden önce görüntülenen ekranların listesini gösterebilir. screen_view içerik haritası günlüğü bir firebase_screen_class parametresi içeriyor.

İçerik haritası günlükleri ayrıca özel etkinlikler oluşturabilirsiniz. oturumuna ait verileri toplar. Bu veriler, seçtiğiniz seriyi göstermeye yardımcı olabilir Kilitlenme, önemli olmayan veya ANR etkinliğiyle sonuçlanan kullanıcı işlemlerinin sayısı.

Şunları yapabilirsiniz: Google Analytics verilerinin toplanmasını ve kullanımını kontrol edebilir, Bu işlem, içerik haritası günlüklerini dolduran verileri içerir.

Etkinleştirme raporlamasını etkinleştirme

Varsayılan olarak Crashlytics, tüm mobil cihazlarınız için kilitlenme raporlarını kullanıcılara ulaşabiliyoruz. Kullanıcılara gönderdikleri veriler üzerinde daha fazla kontrol sahibi olma imkanı tanımak için otomatik raporlamayı devre dışı bırakarak ve yalnızca kodunuzda Crashlytics'ye veri göndermeyi seçtiğinizde etkinleştirerek etkinleştirmeyi etkinleştirebilirsiniz:

  1. Info.plist dosyanıza yeni bir anahtar ekleyerek otomatik toplamayı devre dışı bırakın:

    • Anahtar: FirebaseCrashlyticsCollectionEnabled
    • Değer: false
  2. Çalışma zamanında Crashlytics veri toplama geçersiz kılma işlevini çağırarak belirli kullanıcılar için toplamayı etkinleştirin. Üzeride yazılan değer, uygulamanızın lansmanlarında devam eder. Böylece Crashlytics raporları otomatik olarak toplayabilir.

    Otomatik kilitlenme raporlamasını devre dışı bırakmak için geçersiz kılma değeri olarak false değerini iletin. false olarak ayarlandığında yeni değer, uygulamanın bir sonraki çalıştırılmasına kadar uygulanmaz.

    Swift

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Crash Insights verilerini yönetme

Crash Insights, anonimleştirilmiş yığınınızı karşılaştırarak sorunları çözmenize yardımcı olur diğer Firebase uygulamalarından gelen izleri izler ve sorununuzun büyük bir trendin parçası haline geldi. Kilitlenme Analizleri, birçok sorun için kilitlenmeyi ayıklamanıza yardımcı olacak kaynaklar bile sağlar.

Crash Insights, yaygın kararlılık trendlerini belirlemek için birleştirilmiş kilitlenme verilerini kullanır. Uygulamanızın verilerini paylaşmak istemiyorsanız Firebase konsolundaki Crashlytics sorun listenizin üst kısmındaki Kilitlenme Analizleri menüsünden Kilitlenme Analizleri'ni devre dışı bırakabilirsiniz.