我正在使用React Native构建一个iOS应用程序并尝试在手机上测试它。
如果我将手机插入电脑并直接“构建”到手机上,该应用程序可以正确构建并正常打开/操作,没问题。
但是如果我尝试将其存档并使用iTunes Connect的TestFlight或Fabric with Crashlytics将其发送到手机,则应用程序会在打开时立即崩溃。它简要地显示了启动屏幕,但没有更多。
此外,没有崩溃报告 - 在TestFlight,Crashlytics或XCode中,一旦我重新插入手机。所以我在黑暗中操作,没有任何关于什么破坏的信息。一直无法在网上找到类似的问题,所以我想我只是问。什么可能出错的想法?
如果您需要查看任何代码或其他数据,请与我们联系。其中一些是保密的,但我会尝试发布一个近似版本。
答案 0 :(得分:12)
正如Chris Geirman所说,问题是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捆绑/存档/发送应用程序会缩小和 uglifies JavaScript,以便更改类名。所以相反,如果我这样做 - var msg = new Message(data, relations); msg.className
- 我会找回一个随机变量名,比如't'。
这是我的应用程序中的一个问题,因为我的主页包含一个使用className的switch语句:
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
的{{1}}属性。
为什么没有报告,我不知道(我跟着Chris的建议并安装了Sentry,但似乎仍然没有报告该错误)。
但这就是发生的事情。当我通过TestFlight / Fabric在手机上安装应用程序时,缩小/丑化发生仅,这就是为什么应用程序仅在这些条件下崩溃的原因。
希望这可以帮助任何遇到类似错误的人免于撕掉他们的头发。
答案 1 :(得分:2)
我想分享我自己的制作阶段崩溃经验,而一切都在开发阶段运作良好。
我遇到了由 Reactotron 记录器引起的类似问题。由于我没有将它捆绑在生产阶段,因此一行console.tron.log使我的应用程序完全隐身崩溃。 (这有点我的错,因为我并没有因为没有控制台的设置而对我的内衣感到该死)
这是我在根级别文件root.js中引入的代码段。
if (__DEV__) {
...
console.tron = Reactotron;
...
}
希望有人在浪费时间弄清楚错误之前找到了这个。
答案 2 :(得分:1)
不确定您是否仍然遇到此问题 - 但如果您这样做,我建议您查看Bugsnag react native error reporting - 它会报告JavaScript层和本机层崩溃(java /可可)。
反应原生崩溃报告中要解决的难题之一(正如Sasha所提到的)是在使用缩小和/或混淆时恢复原始堆栈跟踪 - 这在Bugsnag中通过提供对JS源映射的完全支持来处理作为iOS符号和Android Proguard支持原生层。
如果这有帮助,请告诉我 - 我是创始人@ Bugsnag