Приложение React-Native ios аварийно завершает работу без отчета

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

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

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

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

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


person Sasha    schedule 04.03.2016    source источник
comment
Я тоже пока не слышал об этой проблеме. Правильно ли я предполагаю, что вы обновили свой AppDelegate.m, чтобы использовать пакет? Предполагая, что мне любопытно, на какой версии RN вы работаете. Просто в качестве проверки работоспособности, возможно, попробуйте создать новое свежее приложение и убедитесь, что оно работает должным образом. Затем, методом проб и ошибок, добавляя к нему отрывочные кусочки, пока оно не сломается. отстой, но это то, что сразу приходит на ум.   -  person Chris Geirman    schedule 04.03.2016
comment
Ха да. Это именно то, что я решил сделать. Кажется, это что-то с моим приложением, хотя отчетов о сбоях нет, поскольку свежее приложение работает нормально, как и сокращение моего приложения до одной страницы Hello World.   -  person Sasha    schedule 04.03.2016
comment
В таком случае, я не думаю, что вы найдете здесь большую помощь, не поделившись своим кодом. К сожалению, TestFlight и Crashlytics сообщат вам только о сбое на нативной стороне. Вам придется попробовать что-то вроде getsentry.com, trackjs.com или аналогичный, чтобы получить отчет о сбое JS.   -  person Chris Geirman    schedule 04.03.2016


Ответы (3)


Как предположил Крис Гейрман, проблема заключалась в ошибке 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;
  }

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

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

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

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, поэтому приложение вылетало только в этих условиях.

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

person Sasha    schedule 07.03.2016
comment
Имея ту же проблему, что и вы. Как вы отследили проблему? Просто методом проб и ошибок? - person Joshua Pinter; 12.03.2016
comment
Да, к сожалению. Я сузил проблему до одного файла, просто закомментировав огромные разделы приложения, а затем я просто распечатал данные на странице вместо того, чтобы выполнять какие-либо этапы рендеринга. НАМНОГО проще с Fabric.io, чем с TestFlight, потому что последний занимает примерно в 100 раз больше времени на дистрибутив. Это было все еще супер утомительно, но не СЛИШКОМ плохо. - person Sasha; 12.03.2016
comment
Большое спасибо! Итак, использование Fabric.io полностью исключает необходимость в TestFlight? - person Joshua Pinter; 12.03.2016
comment
Что ж, у меня особый случай — я создаю это приложение для клиента с несколькими людьми, которые захотят видеть, как оно продвигается. Fabric.io отлично подходит для этого — я могу легко и быстро рассылать версии конкретным людям. Я понятия не имею, как/попадают ли они в магазин приложений в конечном итоге. Вообще не смотрел на это. Я перейду этот мост, когда доберусь до него, но Fabric — отличный инструмент для внутреннего прототипирования/совместного использования. - person Sasha; 12.03.2016
comment
@Саша, это была авария? Или приложение просто закрылось? У меня похожая проблема после добавления уведомлений в приложение iOS. - person Some Guy; 17.03.2016

Хочу поделиться собственным опытом падения на продакшене, тогда как на этапе разработки все работало нормально.

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

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

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

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

person eden    schedule 05.02.2017

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

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

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

person loopj    schedule 04.11.2016
comment
У меня та же проблема, что и у OP, но я использую Bugsnag. Об ошибках почему-то не сообщается. - person Lee; 24.01.2017
comment
У меня возникли проблемы с расследованием ситуации сбоя при запуске, которая влияет только на выпуск (так же, как и OP). Crashlytics дает мне уменьшенную (и бесполезную) трассировку стека. Приборные панели Bugsnag и Sentry пусты. Несмотря на то, что это похоже на исключение JS, кажется, что сбой происходит до загрузки обработчика Bugsnag/Sentry. - person paws; 13.03.2017
comment
минус, потому что вы рекламируете свою компанию - person connorbode; 25.08.2017