diff --git a/docs/crashlytics/usage/index.md b/docs/crashlytics/usage/index.md index a0b5aa2c74..6f07efc1f1 100644 --- a/docs/crashlytics/usage/index.md +++ b/docs/crashlytics/usage/index.md @@ -220,3 +220,16 @@ React Native. You can disable Crashlytics NDK in your `firebase.json` config. } } ``` + +## Crashlytics additional non-fatal issue generation + +React Native Crashlytics module is generating additional non-fatal issues on JavaScript exceptions by default. Sometimes it is not desirable behavior since it might duplicate issues and hide original exceptions logs. You can disable this behavior by setting appropriate option to false: + +```json +// /firebase.json +{ + "react-native": { + "crashlytics_is_error_generation_on_js_crash_enabled": false + } +} +``` diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/Constants.java b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/Constants.java index 4d1a709409..746e50884d 100644 --- a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/Constants.java +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/Constants.java @@ -21,4 +21,5 @@ class Constants { final static String KEY_CRASHLYTICS_NDK_ENABLED = "crashlytics_ndk_enabled"; final static String KEY_CRASHLYTICS_DEBUG_ENABLED = "crashlytics_debug_enabled"; final static String KEY_CRASHLYTICS_AUTO_COLLECTION_ENABLED = "crashlytics_auto_collection_enabled"; + final static String KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED = "crashlytics_is_error_generation_on_js_crash_enabled"; } diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsInitProvider.java b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsInitProvider.java index b4b1c1a734..4bd97f134b 100644 --- a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsInitProvider.java +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsInitProvider.java @@ -46,6 +46,23 @@ static boolean isCrashlyticsCollectionEnabled() { return enabled; } + static boolean isErrorGenerationOnJSCrashEnabled() { + boolean enabled; + ReactNativeFirebaseJSON json = ReactNativeFirebaseJSON.getSharedInstance(); + ReactNativeFirebaseMeta meta = ReactNativeFirebaseMeta.getSharedInstance(); + ReactNativeFirebasePreferences prefs = ReactNativeFirebasePreferences.getSharedInstance(); + + if (prefs.contains(KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED)) { + enabled = prefs.getBooleanValue(KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED, true); + } else if (json.contains(KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED)) { + enabled = json.getBooleanValue(KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED, true); + } else { + enabled = meta.getBooleanValue(KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED, true); + } + + return enabled; + } + @Override public boolean onCreate() { super.onCreate(); diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsModule.java b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsModule.java index 68a3d97dc7..e518d73e0d 100644 --- a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsModule.java +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsModule.java @@ -185,6 +185,10 @@ public Map getConstants() { "isCrashlyticsCollectionEnabled", ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled() ); + constants.put( + "isErrorGenerationOnJSCrashEnabled", + ReactNativeFirebaseCrashlyticsInitProvider.isErrorGenerationOnJSCrashEnabled() + ); return constants; } } diff --git a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsInitProvider.h b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsInitProvider.h index bdca3aed9b..d20451662c 100644 --- a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsInitProvider.h +++ b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsInitProvider.h @@ -22,6 +22,8 @@ + (BOOL)isCrashlyticsCollectionEnabled; ++ (BOOL)isErrorGenerationOnJSCrashEnabled; + /// Returns one or more FIRComponents that will be registered in /// FIRApp and participate in dependency resolution and injection. + (NSArray *)componentsToRegister; diff --git a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsInitProvider.m b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsInitProvider.m index d29b34747d..1255bff248 100644 --- a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsInitProvider.m +++ b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsInitProvider.m @@ -25,6 +25,7 @@ NSString *const KEY_CRASHLYTICS_DEBUG_ENABLED = @"crashlytics_debug_enabled"; NSString *const KEY_CRASHLYTICS_AUTO_COLLECTION_ENABLED = @"crashlytics_auto_collection_enabled"; +NSString *const KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED = @"crashlytics_is_error_generation_on_js_crash_enabled"; @implementation RNFBCrashlyticsInitProvider @@ -52,6 +53,26 @@ + (BOOL)isCrashlyticsCollectionEnabled { return enabled; } ++ (BOOL)isErrorGenerationOnJSCrashEnabled { + BOOL enabled; + + if ([[RNFBPreferences shared] contains:KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED]) { + enabled = [[RNFBPreferences shared] getBooleanValue:KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED defaultValue:YES]; + DLog(@"isErrorGenerationOnJSCrashEnabled via RNFBPreferences: %d", enabled); + } else if ([[RNFBJSON shared] contains:KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED]) { + enabled = [[RNFBJSON shared] getBooleanValue:KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED defaultValue:YES]; + DLog(@"isErrorGenerationOnJSCrashEnabled via RNFBJSON: %d", enabled); + } else { + // Note that if we're here, and the key is not set on the app's bundle, we default to "YES" + enabled = [RNFBMeta getBooleanValue:KEY_CRASHLYTICS_IS_ERROR_GENERATION_ON_JS_CRASH_ENABLED defaultValue:YES]; + DLog(@"isErrorGenerationOnJSCrashEnabled via RNFBMeta: %d", enabled); + } + + DLog(@"isErrorGenerationOnJSCrashEnabled: %d", enabled); + + return enabled; +} + + (NSArray *)componentsToRegister { return @[]; } diff --git a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.m b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.m index 6efc62ec0e..6ddba21171 100644 --- a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.m +++ b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.m @@ -32,6 +32,7 @@ @implementation RNFBCrashlyticsModule - (NSDictionary *)constantsToExport { NSMutableDictionary *constants = [NSMutableDictionary new]; constants[@"isCrashlyticsCollectionEnabled"] = @([RCTConvert BOOL:@([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled])]); + constants[@"isErrorGenerationOnJSCrashEnabled"] = @([RCTConvert BOOL:@([RNFBCrashlyticsInitProvider isErrorGenerationOnJSCrashEnabled])]); return constants; } diff --git a/packages/crashlytics/lib/handlers.js b/packages/crashlytics/lib/handlers.js index abf51c3515..487f0feded 100644 --- a/packages/crashlytics/lib/handlers.js +++ b/packages/crashlytics/lib/handlers.js @@ -75,11 +75,13 @@ export const setGlobalErrorHandler = once(nativeModule => { return originalHandler(error, fatal); } - try { - const stackFrames = await StackTrace.fromError(error, { offline: true }); - await nativeModule.recordErrorPromise(createNativeErrorObj(error, stackFrames, false)); - } catch (_) { - // do nothing + if (nativeModule.isErrorGenerationOnJSCrashEnabled) { + try { + const stackFrames = await StackTrace.fromError(error, { offline: true }); + await nativeModule.recordErrorPromise(createNativeErrorObj(error, stackFrames, false)); + } catch (_) { + // do nothing + } } return originalHandler(error, fatal); } diff --git a/tests/firebase.json b/tests/firebase.json index 9ca386ebf7..776fde2a29 100644 --- a/tests/firebase.json +++ b/tests/firebase.json @@ -8,6 +8,7 @@ "crashlytics_debug_enabled": true, "crashlytics_disable_auto_disabler": false, "crashlytics_auto_collection_enabled": true, + "crashlytics_is_error_generation_on_js_crash_enabled": true, "messaging_auto_init_enabled": true, "messaging_android_headless_task_timeout": 30000,