Сбой приложения 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;
...
}
Надеюсь, что кто-нибудь найдет это, прежде чем тратить время на выяснение того, что случилось.