我已经为我们的 React Native 项目成功地为 iOS 设置了 Crashlytics 集成,并且还成功地注册了 Android 版本。唯一的问题是它只报告与 Java/系统相关的崩溃——如果抛出 javascript 异常,它不会在报告中注册。我想让它正常工作,因为 iOS 版本已经具备该功能。
我已经按照 Fabric docs 中的概述设置了报告和 this question - 请参阅第二个答案,我在 MainActivity 中添加了 onCreate
。
接下来,我尝试根据 this issue comment 创建自己的 NativeModuleCallExceptionHandler .代码如下:
package com.mypackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.modules.core.JavascriptException;
import com.facebook.react.bridge.NativeModuleCallExceptionHandler;
import java.util.Map;
import com.crashlytics.android.Crashlytics;
class CrashlyticsErrorModule extends ReactContextBaseJavaModule {
public CrashlyticsErrorModule (ReactApplicationContext reactContext) {
super(reactContext);
addExceptionHandler(reactContext);
}
@Override
public String getName() {
return "CrashlyticsErrorModule";
}
private void addExceptionHandler(ReactApplicationContext reactContext) {
reactContext.setNativeModuleCallExceptionHandler(new NativeModuleCallExceptionHandler() {
@Override
public void handleException(Exception e) {
if (e instanceof JavascriptException) {
Crashlytics.log(e.getMessage());
} else {
Crashlytics.logException(e);
}
}
});
}
代码编译没有错误,但是仍然没有报告 Javascript 异常。
即使在 onCreate()
或 addExceptionHandler()
方法结束时故意抛出运行时异常,handleException()
也不会被叫到。然而,Crashlytics 确实会收到通知,因此异常会在某处被捕获!!
源代码的链接在上面的问题评论中。
最佳答案
https://github.com/facebook/react-native/issues/1194
简而言之:您可以使用 ErrorUtils.setGlobalHandler((err, isFatal) => { ... });
来捕获 js 异常并使用 Crashlytics.recordCustomExceptionName 将其抛给 Craslytics (...)
。 react-native-fabric-crashlytics
npm 模块可以自动为您完成。
不要忘记将 Fabric.with(this, new Crashlytics())
添加到 MainApplication
的 onCreate()
方法(或MainActivity
如果您使用低于 0.29 的 RN)。
关于javascript - 将 Crashlytics 集成到 React Native - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38225845/