React-Native ios 应用程序崩溃而没有报告
React-Native ios App crashes without report
我正在使用 React Native 构建一个 iOS 应用程序并尝试让它在 phones 上进行测试。
如果我将 phone 插入计算机并将 "build" 直接连接到 phone,应用程序构建正确且 opens/operates 正确,没问题。
但是,如果我尝试使用 iTunes Connect 的 TestFlight 或 Fabric with Crashlytics 将其存档并发送到 phones,应用程序会在打开时立即崩溃。它简要地显示了启动屏幕,但仅此而已。
此外,在我重新插入 phone 后,在 TestFlight、Crashlytics 或 XCode 中没有崩溃报告。所以我在黑暗中操作,没有任何关于发生了什么问题的信息。在网上找不到类似的问题,所以我想我只是问问。知道哪里出了问题吗?
如果您需要查看任何代码或其他数据,请告诉我。其中一些是机密的,但我会尝试 post 一个大概的版本。
正如 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;
}
最后一行是问题所在。在我的本地模拟器上,如果我通过插入将应用程序构建到我的 phone,则可以正常工作。例如,如果消息模型继承自 BaseModel,则调用 var msg = new Message(data, relations); msg.className
returns Message
.
但是 bundling/archiving/sending 应用程序通过 TestFlight 或 Fabric.io 缩小和 丑化 JavaScript,这样 class 名称已更改。所以相反,如果我这样做 -- 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
值,我会遇到错误,因为我试图访问 [=20 的 color
属性 =].
为什么不报,我也不知道(我按照Chris的建议安装了Sentry,但是好像还是不报那个错)。
但这就是发生的事情。当我通过 TestFlight/Fabric 在 phone 上安装应用程序时 仅 发生 Minification/uglification,这就是应用程序仅在这些情况下崩溃的原因。
希望这可以避免任何人 运行 陷入类似的毛发问题。
不确定您是否仍然有这个问题 - 但如果有,我建议您检查 react native error reporting 的 Bugsnag - 它报告 JavaScript 层和本机中的崩溃层 (java/cocoa).
React Native 崩溃报告(正如 Sasha 提到的)中更难解决的问题之一是在使用缩小时恢复原始堆栈跟踪 and/or 混淆 - 这在 Bugsnag 中通过提供对 JS 源的完全支持来处理地图,以及 iOS 符号化和 Android 本地层的 Proguard 支持。
如果这有帮助请告诉我 - 我是 @Bugsnag 的创始人
我想分享我自己的生产阶段崩溃的经历,而在开发阶段一切正常。
我遇到了由 Reactotron 记录器引起的类似问题。由于我没有在生产阶段捆绑它,所以一行 console.tron.log 完全隐身地使我的应用程序崩溃。 (这是我的错,因为我根本不在乎我的 'no-console' 设置的 linter)
这是我在根级文件中引入的代码片段,root.js。
if (__DEV__) {
...
console.tron = Reactotron;
...
}
希望有人能在浪费时间找出问题之前找到它。
我正在使用 React Native 构建一个 iOS 应用程序并尝试让它在 phones 上进行测试。
如果我将 phone 插入计算机并将 "build" 直接连接到 phone,应用程序构建正确且 opens/operates 正确,没问题。
但是,如果我尝试使用 iTunes Connect 的 TestFlight 或 Fabric with Crashlytics 将其存档并发送到 phones,应用程序会在打开时立即崩溃。它简要地显示了启动屏幕,但仅此而已。
此外,在我重新插入 phone 后,在 TestFlight、Crashlytics 或 XCode 中没有崩溃报告。所以我在黑暗中操作,没有任何关于发生了什么问题的信息。在网上找不到类似的问题,所以我想我只是问问。知道哪里出了问题吗?
如果您需要查看任何代码或其他数据,请告诉我。其中一些是机密的,但我会尝试 post 一个大概的版本。
正如 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;
}
最后一行是问题所在。在我的本地模拟器上,如果我通过插入将应用程序构建到我的 phone,则可以正常工作。例如,如果消息模型继承自 BaseModel,则调用 var msg = new Message(data, relations); msg.className
returns Message
.
但是 bundling/archiving/sending 应用程序通过 TestFlight 或 Fabric.io 缩小和 丑化 JavaScript,这样 class 名称已更改。所以相反,如果我这样做 -- 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
值,我会遇到错误,因为我试图访问 [=20 的 color
属性 =].
为什么不报,我也不知道(我按照Chris的建议安装了Sentry,但是好像还是不报那个错)。
但这就是发生的事情。当我通过 TestFlight/Fabric 在 phone 上安装应用程序时 仅 发生 Minification/uglification,这就是应用程序仅在这些情况下崩溃的原因。
希望这可以避免任何人 运行 陷入类似的毛发问题。
不确定您是否仍然有这个问题 - 但如果有,我建议您检查 react native error reporting 的 Bugsnag - 它报告 JavaScript 层和本机中的崩溃层 (java/cocoa).
React Native 崩溃报告(正如 Sasha 提到的)中更难解决的问题之一是在使用缩小时恢复原始堆栈跟踪 and/or 混淆 - 这在 Bugsnag 中通过提供对 JS 源的完全支持来处理地图,以及 iOS 符号化和 Android 本地层的 Proguard 支持。
如果这有帮助请告诉我 - 我是 @Bugsnag 的创始人
我想分享我自己的生产阶段崩溃的经历,而在开发阶段一切正常。
我遇到了由 Reactotron 记录器引起的类似问题。由于我没有在生产阶段捆绑它,所以一行 console.tron.log 完全隐身地使我的应用程序崩溃。 (这是我的错,因为我根本不在乎我的 'no-console' 设置的 linter)
这是我在根级文件中引入的代码片段,root.js。
if (__DEV__) {
...
console.tron = Reactotron;
...
}
希望有人能在浪费时间找出问题之前找到它。