מדריך זה מתאר כיצד להתאים אישית את דוחות הקריסה שלך באמצעות Firebase Crashlytics SDK. כברירת מחדל, Crashlytics אוספת אוטומטית דוחות קריסה עבור כל משתמשי האפליקציה שלך (אתה יכול לבטל את הדיווח האוטומטי על קריסה ולהפעיל דיווח הסכמה עבור המשתמשים שלך במקום זאת). Crashlytics מספקת ארבעה מנגנוני רישום מחוץ לקופסה: מפתחות מותאמים אישית , יומנים מותאמים אישית , מזהי משתמש וחריגים שנתפסו .
הוסף מפתחות מותאמים אישית
מפתחות מותאמים אישית עוזרים לך לקבל את המצב הספציפי של האפליקציה שלך לקראת קריסה. אתה יכול לשייך צמדי מפתח/ערך שרירותיים לדוחות הקריסה שלך, ולאחר מכן להשתמש במפתחות המותאמים אישית כדי לחפש ולסנן דוחות קריסה במסוף Firebase.
- בלוח המחוונים של Crashlytics , תוכל לחפש בעיות התואמות למפתח מותאם אישית.
- כאשר אתה בודק בעיה ספציפית במסוף, אתה יכול להציג את המפתחות המותאמים אישית המשויכים לכל אירוע (כרטיסיית המשנה Keys ) ואפילו לסנן את האירועים לפי מפתחות מותאמים אישית (תפריט סינון בראש העמוד).
השתמש בשיטת setCustomValue
כדי להגדיר זוגות מפתח/ערך. לדוגמה:
מָהִיר
// 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
בעת הגדרת מספרים שלמים, בוליאנים או צפים, תיבת הערך כ- @( 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"];
ניתן גם לשנות את הערך של מפתח קיים על ידי קריאה למפתח והגדרתו לערך אחר. לדוגמה:
מָהִיר
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
עם NDictionary כפרמטר היחיד:
מָהִיר
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];
הוסף הודעות יומן מותאמות אישית
כדי לתת לעצמך יותר הקשר לאירועים שהובילו לקריסה, תוכל להוסיף יומני Crashlytics מותאמים אישית לאפליקציה שלך. Crashlytics משייך את היומנים לנתוני הקריסה שלך ומציג אותם בדף Crashlytics של מסוף Firebase , תחת הכרטיסייה יומנים .
מָהִיר
השתמש log()
או log(format:, arguments:)
כדי לעזור באיתור בעיות. אם אתה רוצה לקבל פלט יומן שימושי עם הודעות, האובייקט שאתה מעביר ל- log()
חייב להתאים למאפיין CustomStringConvertible
. log()
מחזירה את המאפיין description שאתה מגדיר עבור האובייקט. לדוגמה:
Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \(attributesDict)")
.log(format:, arguments:)
פורמט ערכים שהוחזרו מקריאת getVaList()
. לדוגמה:
Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))
לפרטים נוספים על אופן השימוש log()
או log(format:, arguments:)
, עיין בתיעוד ההפניה של Crashlytics.
Objective-C
השתמש log
או logWithFormat
כדי לעזור באיתור בעיות. שים לב שאם אתה רוצה לקבל פלט יומן שימושי עם הודעות, האובייקט שאתה מעביר לכל אחת מהשיטות חייב לעקוף את מאפיין מופע description
. לדוגמה:
[[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
וב- logWithFormat
, עיין בתיעוד ההפניה של Crashlytics.
הגדר מזהי משתמש
כדי לאבחן בעיה, לעתים קרובות כדאי לדעת מי מהמשתמשים שלך חווה קריסה נתונה. Crashlytics כולל דרך לזהות משתמשים באופן אנונימי בדוחות הקריסה שלך.
כדי להוסיף מזהי משתמש לדוחות שלך, הקצה לכל משתמש מזהה ייחודי בצורה של מספר מזהה, אסימון או ערך גיבוב:
מָהִיר
Crashlytics.crashlytics().setUserID("123456789")
Objective-C
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];
אם אי פעם תצטרך לנקות מזהה משתמש לאחר הגדרתו, אפס את הערך למחרוזת ריקה. ניקוי מזהה משתמש אינו מסיר רשומות Crashlytics קיימות. אם אתה צריך למחוק רשומות המשויכות למזהה משתמש, פנה לתמיכה של Firebase .
דווח על חריגים לא קטלניים
בנוסף לדיווח אוטומטי על קריסות האפליקציה שלך, Crashlytics מאפשרת לך להקליט חריגים לא קטלניים ולשלוח אותם אליך בפעם הבאה שהאפליקציה שלך תושק.
אתה יכול להקליט חריגים לא קטלניים על ידי הקלטת אובייקטי NSError
בשיטת recordError
. recordError
לוכדת את ערימת השיחות של השרשור על ידי קריאה ל- [NSThread callStackReturnAddresses]
.
מָהִיר
Crashlytics.crashlytics().record(error: error)
Objective-C
[[FIRCrashlytics crashlytics] recordError:error];
בעת שימוש בשיטת recordError
, חשוב להבין את מבנה NSError
וכיצד Crashlytics משתמש בנתונים כדי לקבץ קריסות. שימוש שגוי בשיטת recordError
עלול לגרום להתנהגות בלתי צפויה ועלול לגרום ל-Crashlytics להגביל את הדיווח על שגיאות מתועדות עבור האפליקציה שלך.
לאובייקט NSError
יש שלושה ארגומנטים:
-
domain: String
-
code: Int
-
userInfo: [AnyHashable : Any]? = nil
שלא כמו קריסות קטלניות, שמקובצות באמצעות ניתוח עקבות מחסנית, שגיאות מתועדות מקובצות לפי domain
code
. זוהי הבחנה חשובה בין קריסות קטלניות לבין שגיאות מתועדות. לדוגמה:
מָהִיר
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];
כאשר אתה רושם את השגיאה למעלה, זה יוצר בעיה חדשה שמקובצת לפי NSSomeErrorDomain
ו -1001
. שגיאות מתועדות נוספות המשתמשות באותם ערכי דומיין וקוד מקובצות תחת אותה בעיה. הנתונים הכלולים באובייקט userInfo
מומרים לצמדי מפתח-ערך ומוצגים במקטע מפתחות/יומנים בתוך בעיה בודדת.
יומנים ומפתחות מותאמים אישית
בדיוק כמו דוחות קריסה, אתה יכול להטמיע יומנים ומפתחות מותאמים אישית כדי להוסיף הקשר ל- NSError
. עם זאת, יש הבדל באילו יומנים מצורפים לקריסות לעומת שגיאות מתועדות. כאשר מתרחשת קריסה והאפליקציה מופעלת מחדש, היומנים ש-Cashlytics מאחזר מהדיסק הם אלו שנכתבו ממש עד למועד הקריסה. כאשר אתה רושם NSError
, האפליקציה לא מסתיימת מיד. מכיוון ש-Crashlytics שולחת את דוח השגיאה המתועד רק בהשקת האפליקציה הבאה וחייבת להגביל את כמות השטח המוקצה עבור יומנים בדיסק, ניתן לבצע רישום מספיק לאחר שנרשמת NSError
כך שכל היומנים הרלוונטיים יסובבו החוצה עד לזמן ש-Cashlytics שולח הדיווח מהמכשיר. זכור את האיזון הזה בעת רישום NSErrors
ושימוש ביומנים ומפתחות מותאמים אישית באפליקציה שלך.
שיקולי ביצועים
זכור כי רישום NSError
יכול להיות יקר למדי. בזמן שאתה מבצע את השיחה, Crashlytics לוכדת את ערימת השיחות של השרשור הנוכחי באמצעות תהליך שנקרא מחסנית. תהליך זה יכול להיות אינטנסיבי של מעבד ו-I/O, במיוחד בארכיטקטורות התומכות ב-DWARF (arm64 ו-x86). לאחר השלמת ההתנתקות, המידע נכתב לדיסק באופן סינכרוני. זה מונע אובדן נתונים אם השורה הבאה הייתה קורסת.
למרות שבטוח לקרוא ל-API זה על שרשור רקע, זכור ששיגור קריאה זו לתור אחר מאבד את ההקשר של מעקב המחסנית הנוכחי.
מה לגבי NSExceptions?
Crashlytics לא מציעה מתקן לרישום והקלטה של מופעי NSException
ישירות. באופן כללי, ממשקי API של Cocoa ו-Cocoa Touch אינם בטוחים במיוחד. זה אומר שלשימוש ב- @catch
עלולות להיות תופעות לוואי לא מכוונות חמורות מאוד בתהליך שלך, גם כאשר משתמשים בה בזהירות רבה. לעולם אל תשתמש בהצהרות @catch
בקוד שלך. אנא עיין בתיעוד של אפל בנושא.
התאם אישית את עקבות הערימה
אם האפליקציה שלך פועלת בסביבה לא מקורית (כגון C++ או Unity), תוכל להשתמש ב-Exception Model API כדי לדווח על מטא נתונים של קריסה בפורמט החריגה המקורי של האפליקציה שלך. חריגים שדווחו מסומנים כלא קטלניים.
מָהִיר
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];
ניתן לאתחל מסגרות ערימה מותאמות אישית עם כתובות בלבד:
מָהִיר
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];
אפשר דיווח על הסכמה
כברירת מחדל, Crashlytics אוספת אוטומטית דוחות קריסה עבור כל משתמשי האפליקציה שלך. כדי לתת למשתמשים שליטה רבה יותר על הנתונים שהם שולחים, תוכל להפעיל דיווח על הסכמה על ידי השבתת הדיווח האוטומטי ושליחת נתונים ל-Crashlytics רק כאשר תבחר בקוד שלך:
כבה את האיסוף האוטומטי על ידי הוספת מפתח חדש לקובץ
Info.plist
שלך:- מפתח:
FirebaseCrashlyticsCollectionEnabled
- ערך:
false
- מפתח:
אפשר איסוף עבור משתמשים נבחרים על ידי קריאה לעקיפה של איסוף הנתונים של Crashlytics בזמן ריצה. ערך העקיפה נמשך לאורך כל ההשקות של האפליקציה שלך כך ש-Crashlytics יכול לאסוף דוחות באופן אוטומטי.
כדי לבטל את הסכמתך לדיווח על קריסה אוטומטי, העבר את
false
כערך העקיפה. כאשר מוגדר כ-false
, הערך החדש אינו חל עד להרצה הבאה של האפליקציה.מָהִיר
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Objective-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
נהל נתוני Crash Insights
Crash Insights עוזר לך לפתור בעיות על ידי השוואת מעקבי הערימה האנונימיים שלך לעקבות מאפליקציות Firebase אחרות ומודיע לך אם הבעיה שלך היא חלק ממגמה גדולה יותר. עבור בעיות רבות, Crash Insights אפילו מספק משאבים שיעזרו לך לנפות באגים בקריסה.
Crash Insights משתמש בנתוני קריסה מצטברים כדי לזהות מגמות יציבות נפוצות. אם אתה מעדיף לא לשתף את נתוני האפליקציה שלך, תוכל לבטל את הסכמתך ל-Cash Insights מתפריט Crash Insights בראש רשימת הבעיות של Crashlytics במסוף Firebase .