قم بتخصيص تقارير الأعطال الخاصة بـ Firebase Crashlytics

في لوحة معلومات Crashlytics، يمكنك النقر فوق مشكلة والحصول على تقرير مفصل عن الحدث. يمكنك تخصيص هذه التقارير لمساعدتك على فهم ما يحدث في تطبيقك بشكل أفضل والظروف المحيطة بالأحداث التي تم الإبلاغ عنها إلى Crashlytics.

الإبلاغ عن الاستثناءات التي لم يتم اكتشافها

يمكنك اكتشاف جميع الأخطاء "الفادحة" التي يتم طرحها داخل إطار عمل Flutter تلقائيًا عن طريق تجاوز FlutterError.onError باستخدام FirebaseCrashlytics.instance.recordFlutterFatalError . بدلًا من ذلك، للتعرف على الاستثناءات "غير القاتلة" أيضًا، قم بتجاوز FlutterError.onError باستخدام FirebaseCrashlytics.instance.recordFlutterError :

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();
  bool weWantFatalErrorRecording = true;
  FlutterError.onError = (errorDetails) {
    if(weWantFatalErrorRecording){
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    } else {
      FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
    }
  };

  runApp(MyApp());
}

أخطاء غير متزامنة

لا يتم اكتشاف الأخطاء غير المتزامنة بواسطة إطار عمل Flutter:

ElevatedButton(
  onPressed: () async {
    throw Error();
  }
  ...
)

لاكتشاف مثل هذه الأخطاء، يمكنك استخدام معالج PlatformDispatcher.instance.onError :

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    FlutterError.onError = (errorDetails) {
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    };
    // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
    PlatformDispatcher.instance.onError = (error, stack) {
      FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
      return true;
    };
    runApp(MyApp());

}

أخطاء خارج الرفرفة

لاكتشاف الأخطاء التي تحدث خارج سياق Flutter، قم بتثبيت مستمع الأخطاء على Isolate الحالية:

Isolate.current.addErrorListener(RawReceivePort((pair) async {
  final List<dynamic> errorAndStacktrace = pair;
  await FirebaseCrashlytics.instance.recordError(
    errorAndStacktrace.first,
    errorAndStacktrace.last,
    fatal: true,
  );
}).sendPort);

تم الإبلاغ عن الاستثناءات

بالإضافة إلى الإبلاغ تلقائيًا عن أعطال تطبيقك، يتيح لك Crashlytics تسجيل الاستثناءات غير المميتة وإرسالها إليك في المرة التالية التي يتم فيها الإبلاغ عن حدث مميت أو عند إعادة تشغيل التطبيق.

استخدم التابع recordError لتسجيل الاستثناءات غير القاتلة في كتل الالتقاط الخاصة بتطبيقك. على سبيل المثال:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error'
);

// Or you can use:
await FirebaseCrashlytics.instance.recordFlutterError(errorDetails);

قد ترغب أيضًا في تسجيل مزيد من المعلومات حول الخطأ المحتمل باستخدام خاصية information :

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error',
  information: ['further diagnostic information about the error', 'version 2.0'],
);

تظهر هذه الاستثناءات كمشكلات غير مميتة في وحدة تحكم Firebase. يحتوي ملخص المشكلة على جميع معلومات الحالة التي تحصل عليها عادةً من الأعطال، بالإضافة إلى التفاصيل حسب الإصدار والأجهزة.

تقوم Crashlytics بمعالجة الاستثناءات في سلسلة محادثات خلفية مخصصة لتقليل تأثير الأداء على تطبيقك. لتقليل حركة مرور الشبكة للمستخدمين، ستقوم Crashlytics بتحديد عدد التقارير المرسلة من الجهاز، إذا لزم الأمر.

إضافة مفاتيح مخصصة

تساعدك المفاتيح المخصصة في الحصول على الحالة المحددة لتطبيقك والتي تؤدي إلى حدوث عطل. يمكنك ربط أزواج مفاتيح/قيم عشوائية بتقارير الأعطال، ثم استخدام المفاتيح المخصصة للبحث في تقارير الأعطال وتصفيتها في وحدة تحكم Firebase.

  • في لوحة معلومات Crashlytics ، يمكنك البحث عن المشكلات التي تطابق مفتاحًا مخصصًا.

  • عندما تقوم بمراجعة مشكلة معينة في وحدة التحكم، يمكنك عرض المفاتيح المخصصة المرتبطة بكل حدث (علامة التبويب الفرعية المفاتيح ) وحتى تصفية الأحداث حسب المفاتيح المخصصة (قائمة التصفية في أعلى الصفحة).

استخدم طريقة مثيل setCustomKey لتعيين أزواج المفتاح/القيمة. وهنا بعض الأمثلة:

// Set a key to a string.
FirebaseCrashlytics.instance.setCustomKey('str_key', 'hello');

// Set a key to a boolean.
FirebaseCrashlytics.instance.setCustomKey("bool_key", true);

// Set a key to an int.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1);

// Set a key to a long.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1L);

// Set a key to a float.
FirebaseCrashlytics.instance.setCustomKey("float_key", 1.0f);

// Set a key to a double.
FirebaseCrashlytics.instance.setCustomKey("double_key", 1.0);

إضافة رسائل السجل المخصصة

لمنح نفسك المزيد من السياق للأحداث التي سبقت حدوث العطل، يمكنك إضافة سجلات Crashlytics مخصصة إلى تطبيقك. يقوم Crashlytics بربط السجلات ببيانات الأعطال الخاصة بك ويعرضها في وحدة تحكم Firebase ، ضمن علامة التبويب سجلات Crashlytics.

استخدم log للمساعدة في تحديد المشكلات. على سبيل المثال:

FirebaseCrashlytics.instance.log("Higgs-Boson detected! Bailing out");

تعيين معرفات المستخدم

لتشخيص مشكلة ما، من المفيد غالبًا معرفة المستخدمين الذين تعرضوا لعطل معين. يتضمن Crashlytics طريقة للتعرف على المستخدمين بشكل مجهول في تقارير الأعطال الخاصة بك.

لإضافة معرفات مستخدمين إلى تقاريرك، قم بتعيين معرف فريد لكل مستخدم في شكل رقم معرف أو رمز مميز أو قيمة مجزأة:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

إذا احتجت في أي وقت إلى مسح معرف المستخدم بعد تعيينه، فأعد تعيين القيمة إلى سلسلة فارغة. لا يؤدي مسح معرف المستخدم إلى إزالة سجلات Crashlytics الموجودة. إذا كنت بحاجة إلى حذف السجلات المرتبطة بمعرف المستخدم، فاتصل بدعم Firebase .

الحصول على سجلات مسار التنقل

تمنحك سجلات التنقل فهمًا أفضل للتفاعلات التي أجراها المستخدم مع تطبيقك والتي أدت إلى حدوث عطل أو حدث غير مميت أو ANR. يمكن أن تكون هذه السجلات مفيدة عند محاولة إعادة إنتاج مشكلة ما وتصحيح أخطائها.

يتم تشغيل سجلات التنقل بواسطة Google Analytics، لذا للحصول على سجلات التنقل، تحتاج إلى تمكين Google Analytics لمشروع Firebase الخاص بك وإضافة Firebase SDK لـ Google Analytics إلى تطبيقك. بمجرد استيفاء هذه المتطلبات، يتم تضمين سجلات التنقل تلقائيًا مع بيانات الحدث ضمن علامة التبويب "السجلات" عند عرض تفاصيل المشكلة.

تقوم Analytics SDK تلقائيًا بتسجيل حدث screen_view الذي يمكّن سجلات مسار التنقل من عرض قائمة بالشاشات التي تم عرضها قبل حدث العطل أو الحدث غير الفادح أو حدث ANR. يحتوي سجل مسار التنقل screen_view على معلمة firebase_screen_class .

تتم أيضًا تعبئة سجلات التنقل التفصيلي بأي أحداث مخصصة تقوم بتسجيلها يدويًا خلال جلسة المستخدم، بما في ذلك بيانات معلمات الحدث. يمكن أن تساعد هذه البيانات في إظهار سلسلة من إجراءات المستخدم التي تؤدي إلى حدوث عطل أو حدث غير مميت أو حدث ANR.

لاحظ أنه يمكنك التحكم في جمع واستخدام بيانات Google Analytics ، والتي تتضمن البيانات التي تملأ سجلات التنقل.

تمكين الاشتراك في التقارير

افتراضيًا، يقوم Crashlytics تلقائيًا بجمع تقارير الأعطال لجميع مستخدمي تطبيقك. لمنح المستخدمين المزيد من التحكم في البيانات التي يرسلونها، يمكنك تمكين إعداد التقارير عن طريق تعطيل التقارير التلقائية وإرسال البيانات إلى Crashlytics فقط عندما تختار ذلك في التعليمات البرمجية الخاصة بك:

  1. قم بإيقاف تشغيل التجميع التلقائي محليًا:

    منصات أبل

    أضف مفتاحًا جديدًا إلى ملف Info.plist الخاص بك:

    • المفتاح: FirebaseCrashlyticsCollectionEnabled
    • القيمة: false

    ذكري المظهر

    في كتلة application الخاصة بملف AndroidManifest.xml ، أضف علامة meta-data لإيقاف التجميع التلقائي:

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. قم بتمكين التجميع لمستخدمين محددين عن طريق استدعاء تجاوز مجموعة بيانات Crashlytics في وقت التشغيل.

    تستمر قيمة التجاوز عبر عمليات تشغيل تطبيقك حتى يتمكن Crashlytics من جمع التقارير تلقائيًا. لإلغاء الاشتراك في إعداد تقارير الأعطال التلقائية، قم بتمرير false كقيمة التجاوز. عند التعيين على false ، لا يتم تطبيق القيمة الجديدة حتى التشغيل التالي للتطبيق.

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

إدارة بيانات Crash Insights

تساعدك Crash Insights على حل المشكلات عن طريق مقارنة تتبعات المكدس المجهولة الهوية بالتتبعات من تطبيقات Firebase الأخرى وإعلامك بما إذا كانت مشكلتك جزءًا من اتجاه أكبر. بالنسبة للعديد من المشكلات، توفر Crash Insights أيضًا موارد لمساعدتك في تصحيح أخطاء العطل.

يستخدم Crash Insights بيانات الأعطال المجمعة لتحديد اتجاهات الاستقرار الشائعة. إذا كنت تفضل عدم مشاركة بيانات تطبيقك، فيمكنك إلغاء الاشتراك في Crash Insights من قائمة Crash Insights الموجودة أعلى قائمة مشكلات Crashlytics في وحدة تحكم Firebase .