Сбой приложения React-Native ios без отчета

Я создаю приложение iOS с помощью React Native и пытаюсь проверить его на телефонах.

Если я подключу свой телефон к компьютеру и "построю" прямо на телефон, приложение будет построено правильно и откроется/работает правильно, без проблем.

Но если я попытаюсь заархивировать его и отправить его на телефоны с помощью iTunes Connect TestFlight или Fabric с Crashlytics, приложение немедленно сработает после открытия. Он на короткое время показывает экран запуска, но не более того.

Кроме того, нет отчетов о сбоях - в TestFlight, в Crashlytics или в XCode, как только я снова подключу телефон. Поэтому я работаю в темноте здесь, без какой-либо информации о том, что происходит. Не удалось найти подобную проблему в Интернете, поэтому я решил, что просто спрошу. Любые идеи, что может пойти не так?

Пожалуйста, дайте мне знать, есть ли какой-либо код или другие данные, которые вам могут понадобиться. Некоторые из них конфиденциальны, но я постараюсь опубликовать примерную версию.

Ответы

Ответ 1

Как предложил Крис Гейрман, проблема была ошибкой JavaScript. Я не уверен, что люди с подобными проблемами найдут этот поток, но на случай, если это произойдет, вот странная ошибка, которая произошла.

Я создал простую систему ORM, используя BaseModel и кучу моделей, унаследованных от нее. Конструктор BaseModel выглядел так:

  constructor(props = {}, relations = {}) {
    Object.keys(props).forEach((k) => {
      // Save props to object
      this[k] = props[k];
    });

    this.relations = relations;
    this.className = this.constructor.name;
  }

Эта последняя проблема была проблемой. На моем локальном симуляторе, и если я создам приложение на своем телефоне, подключив его, это отлично работает. Как и в случае, если модель сообщения наследуется от BaseModel, вызов var msg = new Message(data, relations); msg.className возвращает Message.

Но что-то об объединении/архивировании/отправке приложения через TestFlight или Fabric.io минимизирует и угадывает JavaScript, так что имена классов изменяются. Поэтому вместо этого, если я это сделаю - var msg = new Message(data, relations); msg.className - я верну случайное имя переменной, что-то вроде 't'.

Это было проблемой в моем приложении, потому что на моей домашней странице содержался оператор switch, который работал с классомName:

iconContent() {
  return {
    Message: {
      icon: <Image style={styles.feedItemIconImage} source={ require('../assets/img/icon_message.png') } />,
      color: c.grass
    }, ...
  }[this.props.className] // from the model item
}

Но 'Message' не было, как и ожидалось, значением this.props.className - 't'. Итак, если бы я попытался выполнить туннелирование, скажем, значение color, я попал бы в ошибку, потому что я пытался получить доступ к свойству color null.

Почему это не сообщило, я не знаю (я следил за предложениями Криса и устанавливал Sentry, но он все еще, казалось, не сообщал об этой ошибке).

Но это то, что происходило. Когда я установил приложение на телефоне с помощью TestFlight/Fabric, при включении/отключении только , и почему приложение только разбилось в этих условиях.

Надеюсь, это спасет любого, кто сталкивается с подобной ошибкой, вырывая их волосы.

Ответ 2

Не уверен, что у вас все еще есть эта проблема, но если вы это сделаете, я бы рекомендовал проверить Bugsnag на отредактировать отчеты об ошибках в собственной среде - который сообщает об авариях как на уровне JavaScript, так и на внутренних слоях (java/ cocoa).

Одна из труднейших задач, которые необходимо решить при реагировании на отчеты о сбоях в родной аварии (как упоминал Саша), восстанавливает исходные трассировки стека при использовании минимизации и/или обфускации - это обрабатывается в Bugsnag, обеспечивая полную поддержку исходных карт JS, а также в качестве символики iOS и поддержки Android Proguard на собственных слоях.

Дайте мне знать, если это поможет - я основатель @Bugsnag

Ответ 3

Я бы хотел поделиться своим опытом с катастрофой на стадии производства, тогда как все отлично работало на стадии разработки.

У меня была аналогичная проблема, вызванная регистратором Reactotron. Поскольку я не собираю его на стадии производства, одна строка console.tron.log разбила мое приложение с полным стелсом. (Это своего рода моя вина, так как мне не наплевать на мой линкер с настройкой "no-console" )

Здесь фрагмент кода, который я представляю в файле корневого уровня, root.js.

  if (__DEV__) {
     ...
     console.tron = Reactotron;
     ...
  }

Надеюсь, что кто-нибудь найдет это, прежде чем тратить время на выяснение того, что случилось.