בלוח הבקרה Crashlytics, אפשר ללחוץ על בעיה כדי לקבל דוח אירועים מפורט. אתם יכולים להתאים אישית את הדוחות האלה כדי לעזור לכם להבין טוב יותר מה קורה באפליקציה ואת הנסיבות של האירועים שדווחו ל-Crashlytics.
מגדירים לאפליקציה רישום של מפתחות מותאמים אישית, הודעות מותאמות אישית ביומן ומזהי משתמשים.
מדווחים על חריגים אל Crashlytics.
קבלת יומני ניווט באופן אוטומטי אם האפליקציה משתמשת Firebase SDK for Google Analytics. היומנים האלה מאפשרים לכם לראות פעולות של המשתמשים שהובילו לאירוע שנאסף Crashlytics באפליקציה.
משביתים את הדיווח האוטומטי על קריסות ומפעילים דיווח על בסיס הסכמה למשתמשים. חשוב לזכור ש-Crashlytics אוסף באופן אוטומטי דוחות קריסה מכל המשתמשים באפליקציה.
הוספת מקשים בהתאמה אישית
מפתחות בהתאמה אישית עוזרים לכם לקבל את המצב הספציפי של האפליקציה לפני קריסת האפליקציה. אפשר לשייך דוחות קריסה לצמדי מפתח/ערך שרירותיים, ואז להשתמש במפתחות המותאמים אישית כדי לחפש ולסנן דוחות קריסה במסוף Firebase.
- במרכז הבקרה Crashlytics אפשר לחפש בעיות שתואמות למפתח מותאם אישית.
- כשבודקים בעיה ספציפית במסוף, אפשר לראות מפתחות מותאמים אישית שמשויכים לכל אירוע (כרטיסיית המשנה מפתחות) ואפילו לסנן את אירועים לפי מפתחות מותאמים אישית (תפריט סינון שבחלק העליון של הדף).
משתמשים בשיטה setCustomValue
כדי להגדיר צמדי מפתח/ערך. לדוגמה:
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
כשמגדירים מספרים שלמים, בוליאניים או צפים, יש להזין את הערך @(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"];
אפשר גם לשנות את הערך של מפתח קיים על ידי קריאה למפתח והגדרת ערך אחר. לדוגמה:
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
עם
NSמילון בתור הפרמטר היחיד:
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];
הוספת הודעות יומן בהתאמה אישית
כדי לתת הקשר נוסף לאירועים שמובילים לקריסה, אפשר להוסיף יומני Crashlytics בהתאמה אישית לאפליקציה. Crashlytics משייך את היומנים עם נתוני הקריסה ומציגה אותם בדף Crashlytics של במסוף Firebase, בכרטיסייה יומנים.
Swift
אפשר להשתמש ב-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 כולל דרך לזהות משתמשים באופן אנונימי ב- בדוחות הקריסה.
כדי להוסיף מזהי משתמשים לדוחות, מקצים לכל משתמש מזהה ייחודי בצורת מספר מזהה, אסימון או ערך גיבוב:
Swift
Crashlytics.crashlytics().setUserID("123456789")
Objective-C
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];
אם תצטרכו למחוק מזהה משתמש אחרי שתגדירו אותו, תוכלו לאפס את הערך למחרוזת ריקה. ניקוי מזהה משתמש לא מסיר מזהה קיים רשומות Crashlytics. אם צריך למחוק רשומות שמשויכות למשתמש מזהה, יש לפנות לתמיכה של Firebase.
דיווח על חריגים לא חמורים
בנוסף לדיווח אוטומטי על קריסות של האפליקציה, Crashlytics מאפשר מתעדת חריגות לא חמורות ושולחת אותן אליך בפעם הבאה שהאפליקציה השקות.
אפשר לתעד חריגים לא חמורים על ידי תיעוד של NSError
אובייקטים עם
recordError
. המקבץ 'recordError
' של השרשורים נשמר
[NSThread callStackReturnAddresses]
.
Swift
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
. זוהי הבחנה חשובה
בין תאונות חמורות לבין שגיאות שנרשמו ביומן. לדוגמה:
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];
כשמתעדים את השגיאה שלמעלה, נוצרת בעיה חדשה שמקובצת לפי
NSSomeErrorDomain
וגם -1001
שגיאות נוספות ביומן שמשתמשות באותם ערכים של דומיין וקוד מקובצות באותה בעיה. נתונים שנכללים בתוך
האובייקט userInfo
מומר לצמדי מפתח-ערך, ומוצג
קטע של מפתחות/יומנים בבעיה ספציפית.
יומנים ומפתחות בהתאמה אישית
בדומה לדוחות קריסה, אפשר להטמיע יומנים ומפתחות בהתאמה אישית כדי להוסיף הקשר ל-NSError
. עם זאת, יש הבדל בין היומנים שמצורפים לקריסות לבין היומנים שמצורפים לשגיאות ביומן. כשמתרחשת קריסה והאפליקציה מופעלת מחדש,
יומנים ש-Crashlytics מאחזר מהדיסק הם יומנים שנכתבו עד
זמן הקריסה. כשרושמים NSError
, האפליקציה לא עושה זאת באופן מיידי
לסגור. מכיוון ש-Crashlytics שולח את דוח השגיאות שתועדו ביומן רק בהפעלה הבאה של האפליקציה, וצריכה להיות הגבלה על נפח האחסון שהוקצה ליומנים בדיסק, אפשר לתעד מספיק אירועים אחרי תיעוד אירוע NSError
כדי שכל היומנים הרלוונטיים יימחקו עד ש-Crashlytics ישלח את הדוח מהמכשיר. חשוב לזכור את היתרה הזו כשנרשמים ביומן של NSErrors
ומשתמשים ביומנים וב
באפליקציה שלך.
שיקולי ביצועים
חשוב לזכור שהרשמה ביומן של NSError
עשויה להיות יקרה למדי. במועד שבו
לבצע את השיחה, Crashlytics מתעד את מקבץ השיחות של השרשור הנוכחי באמצעות
שנקרא 'פירוק סטאק'. התהליך הזה יכול להיות עתיר מעבד (CPU) וקלט/פלט (I/O),
במיוחד בארכיטקטורות שתומכות ב-DWARF unwinding (arm64 ו-x86).
לאחר השלמת ההפסקה, המידע נכתב לדיסק באופן סינכרוני.
כך ניתן למנוע אובדן נתונים אם השורה הבאה תקרוס.
למרות שבטוח להתקשר את ה-API הזה בשרשור ברקע. יש לזכור ששליחת הקריאה הזו מאבד את ההקשר של דוח הקריסות הנוכחי.
מה לגבי NSexcepts?
בשירות Crashlytics אין מתקן לרישום ביומן ולהקלטה של NSException
באופן ישיר. באופן כללי, ממשקי ה-API של Cocoa ו-Cocoa Touch
מתאים למצבים חריגים. פירוש הדבר הוא שהשימוש ב@catch
עלול להיות מסוכן מאוד באופן לא מכוון
תופעות לוואי בתהליך, גם אם משתמשים בו בזהירות. לעולם אל תשתמשו בהצהרות @catch
בקוד. פרטים נוספים זמינים במאמר
מסמכי התיעוד של Apple
בנושא.
התאמה אישית של דוחות הקריסות
אם האפליקציה פועלת בסביבה לא מותאמת (כמו C++ או Unity), אפשר להשתמש ממשק ה-API של מודל חריגים כדי לדווח על מטא-נתונים של קריסה בחריג המקורי של האפליקציה הפורמט. חריגים שדווחו מסומנים כחריגים לא חמורים.
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];
אפשר גם לאתחל מסגרות סטאק בהתאמה אישית רק עם כתובות:
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];
קבלת יומנים של נתיבי ניווט
יומני נתיבי ניווט עוזרים לך להבין טוב יותר את האינטראקציות שמשתמש שהובילו לקריסה באפליקציה, לאירוע לא קטלני או ל-ANR. היומנים האלה יכולים שימושיים כשמנסים לשחזר את הבעיה ולנפות באגים.
יומני מיקומים באתר מופעלים על ידי Google Analytics, לכן כדי לקבל יומני מיקומים באתר, צריך להפעיל את Google Analytics לפרויקט Firebase שלכם הוספה של Firebase SDK for Google Analytics לאפליקציה. לאחר העמידה בדרישות האלה, יומני המיקומים באתר מתועדים באופן אוטומטי כלול בנתוני אירוע בכרטיסייה יומנים כאשר מציגים את הפרטים של בעיה.
ערכת ה-SDK Analytics
האירוע screen_view
מתעד באופן אוטומטי
שמאפשר ליומני המיקומים להציג רשימה של מסכים שהוצגו לפני
קריסה, אירוע לא חמור או אירוע ANR. יומן נתיבי ניווט screen_view
מכיל
firebase_screen_class
.
יומני המיקומים באתר מאוכלסים גם אירועים מותאמים אישית שאתם מתעדים באופן ידני במסגרת האירוע סשן, כולל נתוני הפרמטר של האירוע. הנתונים האלה יכולים לעזור להציג סדרה מפעולות המשתמש שהובילו לקריסה, לאירוע לא קטלני או לאירוע ANR.
לתשומת ליבך: אפשר לשלוט באיסוף של נתוני Google Analytics ובשימוש בהם, שכולל את הנתונים שמאכלסים יומני נתיבי ניווט.
הפעלת דיווח על הסכמה
כברירת מחדל, Crashlytics אוסף דוחות קריסה באופן אוטומטי לכל משתמשי האפליקציה. כדי להעניק למשתמשים יותר שליטה בנתונים שהם שולחים, אפשר להפעיל להפעיל דיווח על ידי השבתת הדיווח האוטומטי ושליחת נתונים רק אל Crashlytics כשבוחרים בקוד:
כדי להשבית את האיסוף האוטומטי, צריך להוסיף מפתח חדש לקובץ
Info.plist
:- מפתח:
FirebaseCrashlyticsCollectionEnabled
- ערך:
false
- מפתח:
הפעלת איסוף למשתמשים נבחרים באמצעות קריאה לנתוני Crashlytics שינוי מברירת המחדל בזמן הריצה. ערך הביטול נשאר לאורך כל השקות של האפליקציה כדי לאפשר ל-Crashlytics לאסוף דוחות באופן אוטומטי.
כדי לבטל את ההסכמה לדיווח אוטומטי על קריסות, מעבירים את הערך
false
כערך לשינוי ברירת המחדל. אם הוא מוגדר ל-false
, הערך החדש לא יחול עד ההרצה הבאה של הפונקציה אפליקציה.Swift
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Objective-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
ניהול הנתונים של 'תובנות לגבי הקריסה'
התכונה 'תובנות לגבי קריסה' עוזרת לך לפתור בעיות על ידי השוואה בין הקריסות האנונימיות עוקב אחר עקבות מאפליקציות אחרות של Firebase ומיידע אתכם אם הבעיה חלק ממגמה גדולה יותר. הכלי 'תובנות לגבי הקריסה' מספק משאבים לבעיות רבות כדי לעזור לכם לנפות את הבאגים שגרמו לקריסה.
התכונה 'תובנות לגבי הקריסה' משתמשת בנתוני קריסות נצברים כדי לזהות מגמות יציבות נפוצות. אם לא רוצים לשתף את נתוני האפליקציה, אפשר לבטל את ההסכמה לשימוש ב'תובנות לגבי הקריסה'. בתפריט Crash Insights בראש רשימת הבעיות ב-Crashlytics במסוף Firebase.