2016-07-06 2 views
3

Я успешно установил интеграцию Crashlytics для iOS для нашего проекта React Native и сумел получить зарегистрированную версию Android. Единственная проблема заключается в том, что он сообщает только о сбоях, связанных с Java/системой, - если есть исключение javascript, которое оно не регистрирует в отчетах. Я хотел бы заставить его работать, поскольку версия iOS уже имеет функциональность.Интеграция Crashlytics в React Native - Android

Я настроил отчетность, как указано в Fabric docs и this question - см. Второй ответ, я добавил onCreate в MainActivity.

В результате я попытался создать свой собственный NativeModuleCallExceptionHandler согласно this issue comment. Код для этого ниже:

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 получает уведомление, поэтому исключения попадают куда-нибудь!

Ссылки на исходный код приведены в комментарии к проблеме выше.

ответ

0

https://github.com/facebook/react-native/issues/1194

Короче говоря: вы можете использовать ErrorUtils.setGlobalHandler((err, isFatal) => { ... }); поймать Js исключения и бросить его Craslytics с Crashlytics.recordCustomExceptionName(...). react-native-fabric-crashlytics Модуль npm может сделать это автоматически.

Не забудьте добавить Fabric.with(this, new Crashlytics()) к onCreate() методе MainApplication (или MainActivity, если вы используете RN ниже 0,29).

+0

Небольшое замечание: ловить будет работать только в версии выпуска ('реакция-native-fabric-crashlytics' пропускает бросание в среду dev). – farwayer

Смежные вопросы