अपनी 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")

उद्देश्य सी

पूर्णांक, बूलियन या फ़्लोट सेट करते समय, मान को @( 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")

उद्देश्य सी

[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set int_key to 50 from 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];

केवल पैरामीटर के रूप में NSDictionary के साथ setCustomKeysAndValues ​​विधि का उपयोग करके थोक में कुंजी/मान जोड़े जोड़ें:

तीव्र

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)

उद्देश्य सी

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 लॉग को आपके क्रैश डेटा से जोड़ता है और उन्हें Firebase कंसोल के Crashlytics पृष्ठ में, लॉग्स टैब के अंतर्गत प्रदर्शित करता है।

तीव्र

समस्याओं को इंगित करने में सहायता के लिए 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:) का उपयोग करने के तरीके के बारे में अधिक जानकारी के लिए, क्रैशलिटिक्स संदर्भ दस्तावेज़ देखें।

उद्देश्य सी

समस्याओं का पता लगाने में सहायता के लिए 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 संदर्भ दस्तावेज़ देखें।

उपयोगकर्ता पहचानकर्ता सेट करें

प्लेसहोल्डर96

किसी समस्या का निदान करने के लिए, यह जानना अक्सर सहायक होता है कि आपके किस उपयोगकर्ता ने किसी क्रैश का अनुभव किया है। Crashlytics में आपकी क्रैश रिपोर्ट में गुमनाम रूप से उपयोगकर्ताओं की पहचान करने का एक तरीका शामिल है।

अपनी रिपोर्ट में उपयोगकर्ता आईडी जोड़ने के लिए, प्रत्येक उपयोगकर्ता को एक आईडी नंबर, टोकन या हैश मान के रूप में एक विशिष्ट पहचानकर्ता निर्दिष्ट करें:

तीव्र

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

उद्देश्य सी

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

यदि आपको किसी उपयोगकर्ता पहचानकर्ता को सेट करने के बाद उसे साफ़ करने की आवश्यकता है, तो मान को रिक्त स्ट्रिंग पर रीसेट करें। उपयोगकर्ता पहचानकर्ता को साफ़ करने से मौजूदा Crashlytics रिकॉर्ड नहीं हटते। यदि आप किसी उपयोगकर्ता आईडी से जुड़े रिकॉर्ड को हटाना चाहते हैं, तो फायरबेस समर्थन से संपर्क करें

गैर-घातक अपवादों की रिपोर्ट करें

आपके ऐप के क्रैश होने की स्वचालित रूप से रिपोर्ट करने के अलावा, Crashlytics आपको गैर-घातक अपवादों को रिकॉर्ड करने देता है और अगली बार आपका ऐप लॉन्च होने पर उन्हें आपको भेजता है।

आप गैर-घातक अपवादों को recordError विधि के साथ NSError ऑब्जेक्ट रिकॉर्ड करके रिकॉर्ड कर सकते हैं। recordError [NSThread callStackReturnAddresses] कॉल करके थ्रेड के कॉल स्टैक को कैप्चर करता है।

तीव्र

Crashlytics.crashlytics().record(error: error)

उद्देश्य सी

[[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)

उद्देश्य सी

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 अनइंडिंग (arm64 और x86) का समर्थन करते हैं। खोलना पूरा होने के बाद, जानकारी को डिस्क पर सिंक्रोनस रूप से लिखा जाता है। यह डेटा हानि को रोकता है यदि अगली पंक्ति क्रैश हो जाती है।

हालांकि इस एपीआई को बैकग्राउंड थ्रेड पर कॉल करना सुरक्षित है, याद रखें कि इस कॉल को दूसरी कतार में भेजने से वर्तमान स्टैक ट्रेस का संदर्भ खो जाता है।

एनएसईएक्सप्शन के बारे में क्या?

Crashlytics सीधे NSException इंस्टेंस को लॉगिंग और रिकॉर्ड करने की सुविधा प्रदान नहीं करता है। सामान्यतया, कोको और कोको टच एपीआई अपवाद-सुरक्षित नहीं हैं। इसका मतलब है कि @catch के उपयोग से आपकी प्रक्रिया में बहुत गंभीर अनपेक्षित दुष्प्रभाव हो सकते हैं, तब भी जब अत्यधिक सावधानी के साथ उपयोग किया जाता है। आपको अपने कोड में कभी भी @catch स्टेटमेंट का उपयोग नहीं करना चाहिए। कृपया विषय पर Apple के दस्तावेज़ देखें।

ऑप्ट-इन रिपोर्टिंग सक्षम करें

डिफ़ॉल्ट रूप से, Crashlytics आपके ऐप के सभी उपयोगकर्ताओं के लिए स्वचालित रूप से क्रैश रिपोर्ट एकत्र करता है। उपयोगकर्ताओं को उनके द्वारा भेजे जाने वाले डेटा पर अधिक नियंत्रण देने के लिए, आप स्वचालित रिपोर्टिंग को अक्षम करके और केवल Crashlytics को डेटा भेजकर ऑप्ट-इन रिपोर्टिंग सक्षम कर सकते हैं, जब आप अपने कोड में चुनते हैं:

  1. अपनी Info.plist फ़ाइल में एक नई कुंजी जोड़कर स्वचालित संग्रह बंद करें:

    • कुंजी: FirebaseCrashlyticsCollectionEnabled
    • मान: false
  2. Crashlytics डेटा संग्रह ओवरराइड को रनटाइम पर कॉल करके चुनिंदा उपयोगकर्ताओं के लिए संग्रह सक्षम करें। ओवरराइड मान आपके ऐप्लिकेशन के सभी लॉन्च पर बना रहता है, इसलिए Crashlytics स्वचालित रूप से रिपोर्ट एकत्र कर सकता है।

    स्वचालित क्रैश रिपोर्टिंग से ऑप्ट आउट करने के लिए, false को ओवरराइड मान के रूप में पास करें। जब false पर सेट किया जाता है, तो नया मान ऐप के अगले रन तक लागू नहीं होता है।

    तीव्र

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    उद्देश्य सी

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

क्रैश इनसाइट डेटा प्रबंधित करें

Crash Insights आपके अनाम स्टैक ट्रेस की तुलना अन्य Firebase ऐप्स के ट्रैस से करके और आपको यह बताकर समस्याओं को हल करने में मदद करता है कि क्या आपकी समस्या किसी बड़े चलन का हिस्सा है। कई मुद्दों के लिए, क्रैश इनसाइट्स आपको क्रैश को डीबग करने में मदद करने के लिए संसाधन भी प्रदान करता है।

क्रैश इनसाइट्स सामान्य स्थिरता रुझानों की पहचान करने के लिए एकत्रित क्रैश डेटा का उपयोग करता है। यदि आप अपने ऐप का डेटा साझा नहीं करना चाहते हैं, तो आप Firebase कंसोल में अपनी Crashlytics समस्या सूची के शीर्ष पर Crash Insights मेनू से Crash Insights से ऑप्ट-आउट कर सकते हैं।