Bu kılavuz, Firebase Crashlytics SDK'sını kullanarak kilitlenme raporlarınızı nasıl özelleştireceğinizi açıklamaktadır. Crashlytics, varsayılan olarak, uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak toplar (bunun yerine, otomatik kilitlenme raporlamasını kapatabilir ve kullanıcılarınız için kaydolma raporlamasını etkinleştirebilirsiniz ). Crashlytics kullanıma hazır dört günlük kaydı mekanizması sağlar: özel anahtarlar , özel günlükler , kullanıcı tanımlayıcıları ve yakalanan istisnalar .
Özel anahtarlar ekleyin
Özel anahtarlar, uygulamanızın çökmeye neden olan belirli durumunu almanıza yardımcı olur. Rastgele anahtar/değer çiftlerini kilitlenme raporlarınızla ilişkilendirebilir, ardından Firebase konsolunda kilitlenme raporlarını aramak ve filtrelemek için özel anahtarları kullanabilirsiniz.
- Crashlytics panosunda , özel bir anahtarla eşleşen sorunları arayabilirsiniz.
- Konsolda belirli bir sorunu incelerken, her olay için ilişkili özel anahtarları görüntüleyebilir ( Anahtarlar alt sekmesi) ve hatta olayları ö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:
Süratli
// Set int_key to 100. Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key") // Set str_key to "hello". Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")
Amaç-C
Tamsayıları, boolean'ları veya değişkenleri 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"];
Mevcut bir anahtarın değerini, anahtarı çağırıp farklı bir değere ayarlayarak da değiştirebilirsiniz. Örneğin:
Süratli
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key") // Set int_key to 50 from 100. Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")
Amaç-C
[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"]; // Set int_key to 50 from 100. [[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];
Tek parametre olarak bir NSDictionary ile setCustomKeysAndValues
yöntemini kullanarak anahtar/değer çiftlerini toplu olarak ekleyin:
Süratli
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)
Amaç-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ı ekleyin
Kilitlenmeye neden olan olaylar hakkında kendinize daha fazla bağlam sağlamak için uygulamanıza özel Crashlytics günlükleri ekleyebilirsiniz. Crashlytics, günlükleri kilitlenme verilerinizle ilişkilendirir ve bunları Firebase konsolunun Crashlytics sayfasında, Günlükler sekmesi altında görüntüler.
Süratli
Sorunları saptamaya yardımcı olması için log()
veya log(format:, arguments:)
kullanın. İletilerle yararlı bir günlük çıktısı almak istiyorsanız, log()
işlevine ilettiğiniz nesnenin CustomStringConvertible
özelliğine uygun olması gerekir. log()
nesne için tanımladığınız açıklama özelliğini döndürür. Ö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:)
nasıl kullanılacağı hakkında daha fazla ayrıntı için Crashlytics başvuru belgelerine bakın.
Amaç-C
Sorunları saptamaya yardımcı olması için log
veya logWithFormat
kullanın. Mesajlarla faydalı bir günlük çıktısı almak istiyorsanız, her iki yönteme de ilettiğiniz nesnenin description
örnek özelliğini geçersiz kılması gerektiğini unutmayın. Ö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
nasıl kullanılacağı hakkında daha fazla ayrıntı için Crashlytics referans belgelerine bakın.
Kullanıcı tanımlayıcılarını ayarla
Bir sorunu teşhis etmek için, hangi kullanıcılarınızın belirli bir kilitlenme yaşadığını bilmek genellikle yardımcı olur. Crashlytics, kilitlenme raporlarınızdaki kullanıcıları anonim olarak tanımlamanın bir yolunu içerir.
Raporlarınıza kullanıcı kimlikleri eklemek için, her kullanıcıya kimlik numarası, belirteç veya karma değer biçiminde benzersiz bir tanımlayıcı atayın:
Süratli
Crashlytics.crashlytics().setUserID("123456789")
Amaç-C
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];
Ayarladıktan sonra bir kullanıcı tanımlayıcısını silmeniz gerekirse, değeri boş bir dizeye sıfırlayın. Bir kullanıcı tanımlayıcısının silinmesi mevcut Crashlytics kayıtlarını kaldırmaz. Bir kullanıcı kimliğiyle ilişkili kayıtları silmeniz gerekirse Firebase destek ekibiyle iletişime geçin .
Önemli olmayan istisnaları bildir
Crashlytics, uygulamanızın kilitlenmelerini otomatik olarak bildirmenin yanı sıra, önemli olmayan istisnaları kaydetmenize olanak tanır ve uygulamanız bir sonraki başlatılışında bunları size gönderir.
NSError
nesnelerini recordError
yöntemiyle kaydederek önemli olmayan özel durumları kaydedebilirsiniz. recordError
[NSThread callStackReturnAddresses]
öğesini çağırarak iş parçacığının çağrı yığınını yakalar.
Süratli
Crashlytics.crashlytics().record(error: error)
Amaç-C
[[FIRCrashlytics crashlytics] recordError:error];
recordError
yöntemini kullanırken, NSError
yapısını ve Crashlytics'in çökmeleri gruplandırmak için verileri nasıl kullandığını anlamak önemlidir. recordError
yönteminin yanlış kullanımı öngörülemeyen davranışlara neden olabilir ve Crashlytics'in uygulamanız için günlüğe kaydedilen hataların raporlanmasını sınırlamasına neden olabilir.
Bir NSError
nesnesinin üç bağımsız değişkeni vardır:
-
domain: String
-
code: Int
-
userInfo: [AnyHashable : Any]? = nil
Yığın izleme analizi yoluyla gruplanan ölümcül çökmelerin aksine, günlüğe kaydedilen hatalar domain
ve code
göre gruplandırılır. Bu, ölümcül çökmeler ve günlüğe kaydedilen hatalar arasındaki önemli bir ayrımdır. Örneğin:
Süratli
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)
Amaç-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, NSSomeErrorDomain
ve -1001
tarafından gruplanan yeni bir sorun oluşturur. Aynı etki alanını ve kod değerlerini kullanan ek günlüğe kaydedilen hatalar, aynı sorun altında gruplandırılır. userInfo
nesnesi içinde yer alan veriler, anahtar/değer çiftlerine dönüştürülür ve ayrı bir sorun içindeki anahtarlar/günlükler bölümünde görüntülenir.
Günlükler ve özel anahtarlar
Kilitlenme raporlarında olduğu gibi, NSError
bağlam eklemek için günlükleri ve özel anahtarları gömebilirsiniz. Ancak, kilitlenmelere hangi günlüklerin eklendiği ile günlüğe kaydedilen hatalar arasında bir fark vardır. Bir kilitlenme meydana geldiğinde ve uygulama yeniden başlatıldığında, Crashlytics'in diskten aldığı günlükler, kilitlenme anına kadar yazılmış olanlardır. Bir NSError
oturumu açtığınızda, uygulama hemen sonlandırılmaz. Crashlytics, günlüğe kaydedilen hata raporunu yalnızca bir sonraki uygulama başlatmasında gönderdiğinden ve diskteki günlükler için ayrılan alan miktarını sınırlaması gerektiğinden, bir NSError
kaydedildikten sonra, Crashlytics'in gönderdiği zamana kadar ilgili tüm günlüklerin döndürülmesi için yeterince günlük kaydı yapmak mümkündür. cihazdan alınan rapor. Uygulamanızda NSErrors
günlüğe kaydederken ve günlükleri ve özel anahtarları kullanırken bu dengeyi aklınızda bulundurun.
Performans hususları
Bir NSError
günlüğe kaydetmenin oldukça pahalı olabileceğini unutmayın. Arama yaptığınız sırada Crashlytics, yığın çözme adı verilen bir işlem kullanarak mevcut ileti dizisinin çağrı yığınını yakalar. Bu işlem, özellikle DWARF çözmeyi destekleyen mimarilerde (arm64 ve x86) CPU ve G/Ç açısından yoğun olabilir. Çözme işlemi tamamlandıktan sonra, bilgi senkronize olarak diske yazılır. Bu, bir sonraki satırın çökmesi durumunda veri kaybını önler.
Bu API'yi bir arka plan iş parçacığında çağırmak güvenli olsa da, bu çağrıyı başka bir kuyruğa göndermenin mevcut yığın izleme bağlamını kaybettiğini unutmayın.
Peki ya NSExceptions?
Crashlytics, NSException
örneklerini doğrudan günlüğe kaydetme ve kaydetme olanağı sunmaz. Genel olarak konuşursak, Kakao ve Kakao Dokunma API'leri istisnalar için güvenli değildir. Bu, @catch
kullanımının, son derece dikkatli bir şekilde kullanıldığında bile, işleminizde çok ciddi istenmeyen yan etkilere sahip olabileceği anlamına gelir. Kodunuzda asla @catch
deyimlerini kullanmamalısınız. Lütfen konuyla ilgili Apple belgelerine bakın.
Yığın izlerini ö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 İstisna Modeli API'sini kullanabilirsiniz. Bildirilen istisnalar, önemli olmayan olarak işaretlenir.
Süratli
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)
Amaç-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 adreslerle de başlatılabilir:
Süratli
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)
Amaç-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];
Kaydolma raporlamasını etkinleştir
Varsayılan olarak Crashlytics, uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak toplar. Kullanıcılara gönderdikleri veriler üzerinde daha fazla kontrol sağlamak için, otomatik raporlamayı devre dışı bırakarak ve yalnızca kodunuzda seçtiğinizde Crashlytics'e veri göndererek isteğe bağlı raporlamayı etkinleştirebilirsiniz:
Info.plist
dosyanıza yeni bir anahtar ekleyerek otomatik toplamayı kapatın:- Anahtar:
FirebaseCrashlyticsCollectionEnabled
- Değer:
false
- Anahtar:
Çalışma zamanında Crashlytics veri toplamayı geçersiz kılmayı çağırarak belirli kullanıcılar için toplamayı etkinleştirin. Geçersiz kılma değeri, uygulamanızın başlatılması boyunca 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
iletin.false
olarak ayarlandığında, yeni değer, uygulamanın bir sonraki çalıştırılmasına kadar geçerli olmaz.Süratli
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Amaç-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
Crash Insights verilerini yönetin
Crash Insights, anonimleştirilmiş yığın izlerinizi diğer Firebase uygulamalarındaki izlerle karşılaştırarak ve sorununuzun daha büyük bir eğilimin parçası olup olmadığını size bildirerek sorunları çözmenize yardımcı olur. Crash Insights, birçok sorun için, kilitlenme hatalarını ayıklamanıza yardımcı olacak kaynaklar bile sağlar.
Crash Insights, ortak kararlılık eğilimlerini belirlemek için birleştirilmiş kilitlenme verilerini kullanır. Uygulamanızın verilerini paylaşmamayı tercih ederseniz, Firebase konsolundaki Crashlytics sorun listenizin üst kısmındaki Crash Insights menüsünden Crash Insights'ı devre dışı bırakabilirsiniz.