Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

گزارش های خرابی Firebase Crashlytics خود را سفارشی کنید

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

این راهنما نحوه سفارشی کردن گزارش‌های خرابی خود را با استفاده از 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 مفید با پیام‌ها دریافت کنید، شیئی که به 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 در کد خود استفاده کنید. لطفاً به مستندات اپل در مورد موضوع مراجعه کنید.

سفارشی کردن ردپای پشته

اگر برنامه شما در یک محیط غیر بومی (مانند 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)

هدف-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)

هدف-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 فقط در صورت انتخاب در کد، گزارش انتخاب را فعال کنید:

  1. با افزودن یک کلید جدید به فایل Info.plist خود، مجموعه خودکار را خاموش کنید:

    • کلید: FirebaseCrashlyticsCollectionEnabled
    • مقدار: false
  2. با فراخوانی لغو مجموعه داده های 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 انصراف دهید.