התאם אישית את דוחות הקריסה של Firebase Crashlytics

מדריך זה מתאר כיצד להתאים אישית את דוחות הקריסה שלך באמצעות SDK Firebase Crashlytics. כברירת מחדל, Crashlytics אוטומטית אוספת ודוחות קריסה לכל משתמשי האפליקציה (אתה יכול לכבות דיווח על קריסת אוטומטית לאפשר הצטרפות דיווח למשתמשים שלך במקום). Crashlytics מספק ארבעה מנגנוני רישום מקופסא: מפתחות מותאמים אישית , יומני מנהג , מזהי משתמשים , וכן חריגים נתפסו .

הוסף מפתחות מותאמים אישית

מפתחות מותאמים אישית עוזרים לך לקבל את המצב הספציפי של האפליקציה שלך לקראת קריסה. תוכל לשייך זוגות מפתחות/ערך שרירותיים לדוחות הקריסה שלך, ולאחר מכן להשתמש במקשים המותאמים אישית כדי לחפש ולסנן דוחות קריסה במסוף Firebase.

  • בשנות ה Dashboard Crashlytics , אתה יכול לחפש נושאים התואמים מפתח מותאם אישית.
  • כשאתה סוקר סוגיה מסוימת במסוף, אתה יכול להציג את המפתחות המותאמים אישית המשויכים לכל אירוע (בכרטיסיית המשנה מפתחות) ואף לסנן את האירועים על ידי מפתחות מותאמים אישית (תפריט מסנן בראש הדף).

השתמש 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 השיטה עם NSDictionary כפרמטר רק:

מָהִיר

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() מחזיר את רכוש התיאור שההגדרה עבור האובייקט. לדוגמה:

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 כולל דרך לזהות משתמשים באופן אנונימי בדוחות הקריסה שלך.

כדי להוסיף מזהי משתמש לדוחות שלך, הקצה לכל משתמש מזהה ייחודי בצורה של מספר מזהה, אסימון או ערך hash:

מָהִיר

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

Objective-C

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

אם אי פעם תצטרך לנקות מזהה משתמש לאחר שתגדיר אותו, אפס את הערך למחרוזת ריקה. ניקוי מזהה משתמש אינו מסיר רשומות Crashlytics קיימות. אם אתה צריך למחוק רשומות הקשורות משתמש ID, תמיכה במגע 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 . עם זאת, יש הבדל באילו יומנים מצורפים לקריסות לעומת שגיאות שנרשמו. כאשר מתרחשת קריסה והיישום מופעל מחדש, יומני ה- Crashlytics שאוחזרים מהדיסק הם אלה שנכתבו עד למועד ההתרסקות. כשתיכנס NSError , אם האפליקציה לא לסיים מיד. מכיוון Crashlytics רק שולחת את דוח השגיאה נרשם על השקת האפליקציה הבאה וחייבים להגביל את כמות השטח שהוקצה עבור יומני בדיסק, אפשר להתחבר מספיק לאחר NSError נרשם כך שכל המידע הרלוונטי לסובב את ידי בפעם Crashlytics שולחת הדיווח מהמכשיר. לשמור על שיווי זאת בחשבון בעת כניסת NSErrors ושימוש יומנים ומפתחות מותאמים אישית באפליקציה שלך.

שיקולי ביצוע

זכור כי כניסת NSError יכולה להיות די יקרה. בזמן ביצוע השיחה, Crashlytics לוכד את ערימת השיחות של החוט הנוכחי באמצעות תהליך שנקרא stack unwinding. תהליך זה יכול להיות אינטנסיבי במעבד וקלט/פלט, במיוחד בארכיטקטורות התומכות בפירוק DWARF (arm64 ו- x86). לאחר השלמת ההרפיה, המידע נכתב בדיסק באופן סינכרוני. זה מונע אובדן נתונים אם השורה הבאה הייתה מתרסקת.

אמנם בטוח לקרוא ל- API הזה בשרשור רקע, אך זכור ששליחת שיחה זו לתור אחר מאבדת את ההקשר של עקבות הערימה הנוכחית.

מה לגבי חריגות NSE?

Crashlytics אינו מציע מתקן להתחברות והקלטת NSException מקרים ישירות. באופן כללי, ממשקי ה- API של קקאו וקקאו טאץ 'אינם בטוחים במיוחד. כלומר, שימוש @catch יכול להיות תופעות לוואי לא מכוון מאוד רציניות בתהליך שלך, גם כאשר נעשה שימוש בזהירות רבה. אתה לא צריך להשתמש @catch דוחות בקוד שלך. עיין בתיעוד של אפל בנושא.

אפשר דיווח על הצטרפות

כברירת מחדל, Crashlytics אוספת באופן אוטומטי דוחות קריסה לכל משתמשי האפליקציה שלך. כדי לתת למשתמשים שליטה רבה יותר בנתונים שהם שולחים, תוכל לאפשר דיווח על הצטרפות על ידי השבתת דיווח אוטומטי ושליחת נתונים רק ל- Crashlytics כשאתה בוחר בקוד שלך:

  1. בטל איסוף אוטומטי על ידי הוספת מפתח חדש שלך Info.plist הקובץ:

    • מפתח: FirebaseCrashlyticsCollectionEnabled
    • ערך: false
  2. אפשר איסוף עבור משתמשים נבחרים על ידי התקשרות לביטול איסוף הנתונים של Crashlytics בזמן ריצה. ערך הדירוג נמשך בכל ההשקות של האפליקציה שלך, כך ש- Crashlytics תוכל לאסוף דוחות באופן אוטומטי.

    לביטול קבלת דיווח על קריסה אוטומטית, לעבור false כערך לעקוף. כאשר מוגדר false , הערך החדש אינו חל עד הריצה הבאה של האפליקציה.

    מָהִיר

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
    

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
    

נהל נתוני Crash Insights

Crash Insights עוזר לך לפתור בעיות על ידי השוואת עקבות הערימה האנונימיות שלך לעקבות מאפליקציות Firebase אחרות והודעתך אם הבעיה שלך היא חלק ממגמה גדולה יותר. בנושאים רבים, Crash Insights אף מספק משאבים שיעזרו לך לאתר באגים באיתור הקריסה.

Crash Insights משתמש בנתוני קריסה מצטברים כדי לזהות מגמות יציבות נפוצות. אם אתה מעדיף לא לשתף את נתוני האפליקציה, אתה יכול לבחור שלא תובנות Crash מהתפריט תובנות Crash בראש הרשימה בנושא Crashlytics שלך קונסולת Firebase .