این راهنما نحوه سفارشی کردن گزارشهای خرابی خود را با استفاده از Firebase Crashlytics SDK توضیح میدهد. بهطور پیشفرض، Crashlytics بهطور خودکار گزارشهای خرابی را برای همه کاربران برنامهتان جمعآوری میکند (شما میتوانید گزارش خودکار خرابی را غیرفعال کنید و بهجای آن ، گزارش انتخابی را برای کاربرانتان فعال کنید). Crashlytics چهار مکانیسم ثبت نام را ارائه میکند: کلیدهای سفارشی، گزارشهای ثبت سفارشی، شناسههای کاربر ، و موارد استثنا .
کلیدهای سفارشی را اضافه کنید
کلیدهای سفارشی به شما کمک می کنند تا وضعیت خاص برنامه خود را که منجر به خرابی می شود، دریافت کنید. میتوانید جفتهای کلید/مقدار دلخواه را با گزارشهای خرابی خود مرتبط کنید، سپس از کلیدهای سفارشی برای جستجو و فیلتر کردن گزارشهای خرابی در کنسول Firebase استفاده کنید.
- در داشبورد 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")
هدف-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")
هدف-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)
هدف-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 در زیر برگه Logs نمایش میدهد.
سریع
از 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 مراجعه کنید.
هدف-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")
هدف-C
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];
اگر بعد از تنظیم یک شناسه کاربری نیاز به پاک کردن آن داشتید، مقدار آن را به یک رشته خالی بازنشانی کنید. پاک کردن شناسه کاربر، سوابق موجود Crashlytics را حذف نمی کند. اگر نیاز به حذف سوابق مرتبط با شناسه کاربری دارید، با پشتیبانی Firebase تماس بگیرید .
استثناهای غیر کشنده را گزارش دهید
علاوه بر گزارش خودکار خرابیهای برنامه، Crashlytics به شما امکان میدهد استثناهای غیرمرگبار را ضبط کنید و دفعه بعد که برنامهتان راهاندازی شد، آنها را برای شما ارسال میکند.
با ضبط اشیاء NSError
با روش recordError
می توانید استثناهای غیر کشنده را ضبط کنید. recordError
پشته تماس رشته را با فراخوانی [NSThread callStackReturnAddresses]
می گیرد.
سریع
Crashlytics.crashlytics().record(error: error)
هدف-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)
هدف-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
به جفتهای کلید-مقدار تبدیل میشوند و در بخش keys/log در یک شماره جداگانه نمایش داده میشوند.
سیاههها و کلیدهای سفارشی
درست مانند گزارشهای خرابی، میتوانید گزارشها و کلیدهای سفارشی را برای افزودن زمینه به NSError
کنید. با این حال، در مواردی که گزارشهایی به خرابیها متصل میشوند در مقابل خطاهای ثبتشده تفاوت وجود دارد. هنگامی که یک خرابی رخ می دهد و برنامه دوباره راه اندازی می شود، گزارش هایی که Crashlytics از دیسک بازیابی می کند، مواردی هستند که درست تا زمان خرابی نوشته شده اند. وقتی یک خطای NSE را وارد NSError
، برنامه فوراً خاتمه نمییابد. از آنجایی که Crashlytics فقط گزارش خطای ثبتشده را در راهاندازی برنامه بعدی ارسال میکند و باید میزان فضای NSError
برای گزارشها روی دیسک را محدود کند، پس از ثبت خطای NSE میتوان به اندازه کافی وارد سیستم شد تا تمام گزارشهای مربوطه تا زمان ارسال Crashlytics چرخانده شوند. گزارش از دستگاه هنگام ثبت NSErrors
و استفاده از گزارشها و کلیدهای سفارشی در برنامه خود، این تعادل را در نظر داشته باشید.
ملاحظات عملکرد
به خاطر داشته باشید که ثبت یک NSError
می تواند نسبتاً گران باشد. در زمان برقراری تماس، Crashlytics پشته تماس رشته فعلی را با استفاده از فرآیندی به نام باز کردن پشته ضبط می کند. این فرآیند میتواند فشرده CPU و I/O باشد، بهویژه در معماریهایی که از باز کردن DWARF پشتیبانی میکنند (arm64 و x86). پس از اتمام باز کردن، اطلاعات به صورت همزمان روی دیسک نوشته می شود. در صورت خراب شدن خط بعدی، این از دست دادن داده ها جلوگیری می کند.
در حالی که فراخوانی این API در یک رشته پسزمینه ایمن است، به یاد داشته باشید که ارسال این تماس به یک صف دیگر، زمینه ردیابی پشته فعلی را از دست میدهد.
در مورد NSE Exceptions چطور؟
Crashlytics امکانی برای ثبت و ضبط مستقیم نمونه NSException
ارائه نمی دهد. به طور کلی، API های Cocoa و Cocoa Touch از نظر استثنایی ایمن نیستند. این بدان معناست که استفاده از @catch
میتواند عوارض جانبی ناخواسته بسیار جدی در فرآیند شما داشته باشد، حتی زمانی که با دقت زیاد استفاده شود. شما هرگز نباید از دستورات @catch
در کد خود استفاده کنید. لطفاً به مستندات اپل در مورد موضوع مراجعه کنید.
فعال کردن گزارش انتخابی
به طور پیش فرض، Crashlytics به طور خودکار گزارش های خرابی را برای همه کاربران برنامه شما جمع آوری می کند. برای اینکه کاربران کنترل بیشتری بر روی دادههایی که ارسال میکنند، داشته باشید، میتوانید با غیرفعال کردن گزارشدهی خودکار و ارسال دادهها به Crashlytics فقط زمانی که در کد خود انتخاب میکنید، گزارش انتخاب را فعال کنید:
با افزودن یک کلید جدید به فایل
Info.plist
خود، مجموعه خودکار را خاموش کنید:- کلید:
FirebaseCrashlyticsCollectionEnabled
- مقدار:
false
- کلید:
با فراخوانی لغو مجموعه داده های Crashlytics در زمان اجرا، مجموعه را برای کاربران منتخب فعال کنید. مقدار لغو در سراسر راه اندازی برنامه شما باقی می ماند بنابراین Crashlytics می تواند به طور خودکار گزارش ها را جمع آوری کند.
برای انصراف از گزارش خودکار خرابی،
false
را به عنوان مقدار نادیده بگیرید. وقتی رویfalse
تنظیم شود، مقدار جدید تا اجرای بعدی برنامه اعمال نمی شود.سریع
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
هدف-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
دادههای Crash Insights را مدیریت کنید
Crash Insights به شما کمک میکند با مقایسه ردیابیهای پشته ناشناس خود با ردیابیهای سایر برنامههای Firebase، مشکلات را حل کنید و به شما اطلاع میدهد که آیا مشکل شما بخشی از یک روند بزرگتر است. برای بسیاری از مسائل، Crash Insights حتی منابعی را برای کمک به رفع اشکال خرابی فراهم می کند.
Crash Insights از دادههای خرابی انبوه برای شناسایی روندهای رایج پایداری استفاده میکند. اگر ترجیح میدهید دادههای برنامهتان را به اشتراک نگذارید، میتوانید از منوی Crash Insights در بالای فهرست مشکلات Crashlytics در کنسول Firebase ، از Crash Insights انصراف دهید.