首页 文章

React-Native ios应用程序在没有报告的情况下崩溃

提问于
浏览
19

我正在使用React Native构建一个iOS应用程序,并尝试在手机上测试它 .

如果我将手机插入计算机并直接“构建”到手机,该应用程序正确构建并正确打开/运行,没问题 .

但是,如果我尝试将其存档并使用iTunes Connect的TestFlight或Fabric with Crashlytics将其发送到手机,则应用程序会在打开时立即崩溃 . 它简要地显示了启动屏幕,但没有更多 .

此外,没有崩溃报告 - 在TestFlight,Crashlytics或XCode中,一旦我重新插入手机 . 所以我在黑暗中操作,没有任何关于什么破坏的信息 . 一直无法在网上找到类似的问题,所以我想我只是问 . 什么想法可能会出错?

如果您可能需要查看任何代码或其他数据,请与我们联系 . 其中一些是保密的,但我会尝试发布一个近似版本 .

3 回答

  • 1

    正如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捆绑/存档/发送应用程序的内容会缩小和丑化JavaScript,以便更改类名 . 所以相反,如果我这样做 - var msg = new Message(data, relations); msg.className - 我'll get back a random variable name, something like ' t' .

    这是我的应用程序中的问题,因为我的主页包含一个switchName语句,该语句使用了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' 的 Value . 所以,如果我试图隧道进入,例如 color 值,我会遇到错误,因为我试图访问 nullcolor 属性 .

    为什么没有报告,我不知道(我跟着Chris的建议并安装了Sentry,但似乎仍然没有报告该错误) .

    但那就是发生了什么 . 当我通过TestFlight / Fabric在手机上安装应用程序时,缩小/丑化发生了 only ,这就是为什么应用程序仅在这些条件下崩溃的原因 .

    希望这可以避免任何遇到类似错误的人撕掉他们的头发 .

  • 12

    不确定你是否还有这个问题 - 但如果你这样做,我建议你查看Bugsnag的react native error reporting - 它报告了JavaScript层和本机层(java / cocoa)的崩溃 .

    反应原生崩溃报告中要解决的难题之一(正如Sasha所提到的)是在使用缩小和/或混淆时恢复原始堆栈跟踪 - 这在Bugsnag中通过提供对JS源映射的完全支持以及iOS符号来处理和原始图层的Android Proguard支持 .

    如果这有帮助,请告诉我 - 我是@ Bugsnag的创始人

  • 1

    我想分享我自己的 生产环境 阶段崩溃经验,而一切在开发阶段都很好 .

    我遇到了由 Reactotron Logger 引起的类似问题 . 由于我没有将它捆绑在 生产环境 阶段,因此一行console.tron.log使我的应用程序完全隐身崩溃 . (这有点我的错,因为我没有't give a damn about my linter with '无控制台设置)

    这是我在根级别文件root.js中介绍的代码片段 .

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

    希望有人在浪费时间找出错误之前找到这个 .

相关问题