React Native необработанные исключения не попадают в ErrorUtils и выпуск APK показывает пустой экран вместо сбоя при исключении JS - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь отправить необработанные исключения в коде JavaScript в Crashlytics.Я добавил код ниже, чтобы перехватить любые необработанные исключения JavaScript.Однако этот код (console.log или событие Crashlytics) не выполняется для любой ошибки, возникающей внутри компонента React.Например, если я добавляю throw new ReferenceError() в метод рендеринга моего основного компонента, я вижу красное поле ошибки, но ничего не происходит с точки зрения моей пользовательской обработки ошибок.

import { Platform } from 'react-native';
import StackTrace from 'stacktrace-js';
import { Crashlytics } from 'react-native-fabric';

const originalHandler = global.ErrorUtils.getGlobalHandler();
function errorHandler(e, isFatal) {
  StackTrace.fromError(e, { offline: true }).then((x) => {
    Crashlytics.recordCustomExceptionName(e.message, e.message, x.map(row => (Object.assign({}, row, {
      fileName: `${row.fileName}:${row.lineNumber || 0}:${row.columnNumber || 0}`,
    }))));
  });
  console.log('Error caught', e);
  // And then re-throw the exception with the original handler
  if (originalHandler) {
    if (Platform.OS === 'ios') {
      originalHandler(e, isFatal);
    } else {
      // On Android, throwing the original exception immediately results in the
      // recordCustomExceptionName() not finishing before the app crashes and therefore not logged
      // Add a delay to give it time to log the custom JS exception before crashing the app.
      // The user facing effect of this delay is that separate JS errors will appear as separate
      // issues in the Crashlytics dashboard.
      setTimeout(() => {
        originalHandler(e, isFatal);
      }, 3000);
    }
  }
}
global.ErrorUtils.setGlobalHandler(errorHandler);

Кроме того, я заметил, чтоесли я упаковываю то же приложение, что и подписанный релиз APK, приложение не падает.Вместо этого он показывает пустой экран.Я пытался без моего собственного обработчика ошибок, но он не потерпит крах.Недавно созданное приложение React Native APK падает в режиме выпуска, если я выкидываю ту же самую ошибку внутри компонента.Что заставляет меня думать, что проблема может быть с любой библиотекой, которую я добавил.Я включил мой package.json здесь.На данный момент я вижу только один способ - начать с пустого проекта и добавлять каждую библиотеку по одному, пока я не увижу проблему, но это было бы пустой тратой времени, если бы проблема была где-то еще.Поэтому, будьте благодарны, если кто-нибудь может дать мне подсказку или предложение точно определить основную причину.

{
  "name": "MyReactNativeApp",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest --coverage",
    "postinstall": "react-native-schemes-manager all"
  },
  "xcodeSchemes": {
    "Debug": [
      "Debug"
    ],
    "Release": [
      "Staging"
    ]
  },
  "dependencies": {
    "axios": "^0.18.0",
    "i18next": "^11.3.1",
    "lodash": "^4.17.10",
    "moment": "^2.22.1",
    "react": "16.3.1",
    "react-i18next": "^7.6.1",
    "react-native": "0.55.3",
    "react-native-config": "^0.11.5",
    "react-native-elements": "^0.19.1",
    "react-native-fabric": "^0.5.1",
    "react-native-sensitive-info": "^5.1.0",
    "react-native-vector-icons": "^4.6.0",
    "react-navigation": "^2.0.1",
    "react-navigation-redux-helpers": "^1.0.6",
    "react-redux": "^5.0.7",
    "redux": "^4.0.0",
    "redux-persist": "^5.9.1",
    "redux-persist-sensitive-storage": "^1.0.0",
    "redux-saga": "^0.16.0",
    "reselect": "^3.0.1",
    "stacktrace-js": "^2.0.0"
  },
  "devDependencies": {
    "babel-eslint": "^8.2.3",
    "babel-jest": "22.4.3",
    "babel-preset-react-native": "4.0.0",
    "enzyme": "^3.3.0",
    "enzyme-adapter-react-16": "^1.1.1",
    "enzyme-to-json": "^3.3.3",
    "eslint": "^4.19.1",
    "eslint-config-airbnb": "^16.1.0",
    "eslint-plugin-flowtype": "^2.46.3",
    "eslint-plugin-import": "^2.11.0",
    "eslint-plugin-jsx-a11y": "^6.0.3",
    "eslint-plugin-react": "^7.7.0",
    "eslint-plugin-react-native": "^3.2.1",
    "flow-bin": "^0.71.0",
    "jest": "22.4.3",
    "react-dom": "^16.3.2",
    "react-native-schemes-manager": "^1.0.4",
    "react-test-renderer": "16.3.1",
    "reactotron-react-native": "^1.14.0",
    "reactotron-redux": "^1.13.0",
    "reactotron-redux-saga": "^1.13.0",
    "redux-devtools-extension": "^2.13.2",
    "redux-mock-store": "^1.5.1"
  },
  "jest": {
    "preset": "react-native",
    "snapshotSerializers": [
      "enzyme-to-json/serializer"
    ],
    "setupFiles": [
      "<rootDir>/jest/setup.js"
    ],
    "moduleNameMapper": {
      "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/jest/assetsTransformer.js",
      "\\.(css|less)$": "<rootDir>/jest/assetsTransformer.js"
    }
  }
}
...