【问题标题】:React-Native ios App crashes without reportReact-Native ios App 在没有报告的情况下崩溃
【发布时间】:2016-06-17 13:55:18
【问题描述】:

我正在使用 React Native 构建一个 iOS 应用程序,并试图让它在手机上进行测试。

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

但是,如果我尝试使用 iTunes Connect 的 TestFlight 或带有 Crashlytics 的 Fabric 将其存档并发送到手机,应用程序会在打开时立即崩溃。它简要显示了启动屏幕,但仅此而已。

此外,一旦我重新插入手机,在 TestFlight、Crashlytics 或 XCode 中都没有崩溃报告。所以我在这里是在黑暗中操作,没有任何关于发生什么问题的信息。网上没找到类似的问题,所以想问问。有什么想法可能会出错吗?

如果您需要查看任何代码或其他数据,请告诉我。其中一些是机密的,但我会尝试发布一个大概的版本。

【问题讨论】:

  • 我也没有听说过这个问题。我是否正确假设您已更新 AppDelegate.m 以使用捆绑包?假设我很好奇您使用的是哪个 RN 版本。作为健全性检查,也许尝试构建一个新的应用程序并确保它按预期工作。然后,反复试验,向它添加粗略的部分,直到它坏掉。很烂,但这就是直接想到的。
  • 哈哈。这正是我决定做的。尽管没有崩溃报告,但这似乎与我的应用程序有关,因为新应用程序运行良好,将我的应用程序缩减为单个 Hello World 页面也是如此。
  • 在这种情况下,如果不共享代码,我认为您不会在这里找到太多帮助。不幸的是,TestFlight 和 Crashlytics 只会在本地发生崩溃时告诉您。您必须尝试getsentry.comtrackjs.com 或类似的方法才能获得 JS 崩溃报告。

标签: ios xcode react-native crashlytics twitter-fabric


【解决方案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 捆绑/归档/发送应用程序的某些事情会缩小和 uglifying 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 值,我会遇到错误,因为我试图访问nullcolor 属性。

为什么没有报错,我不知道(我按照 Chris 的建议安装了 Sentry,但它似乎仍然没有报错)。

但这就是发生的事情。 在我通过 TestFlight/Fabric 在手机上安装应用程序时发生缩小/丑化,这就是应用程序仅在这些情况下崩溃的原因。

希望这可以避免遇到类似错误的人免于扯掉头发。

【讨论】:

  • 遇到和你一样的问题。你是如何追踪这个问题的?只是反复试验?
  • 是的,很遗憾。我通过注释掉应用程序的大部分内容将问题缩小到一个文件,然后我只是将数据打印到页面而不是执行任何渲染步骤。使用 Fabric.io 比使用 TestFlight 更容易,因为后者每次分发需要大约 100 倍的时间。它仍然非常乏味,但还不错。
  • 太好了,谢谢!那么,通过使用 Fabric.io 是否完全消除了对 TestFlight 的需求?
  • 嗯,我是一个特例——我正在为一个客户构建这个应用程序,他们有很多人希望看到它的进展。 Fabric.io 非常适合这一点——我可以轻松快速地将版本推送给特定的人。我不知道它最终如何/是否进入应用商店。根本没研究过。当我到达它时会跨越那座桥,但 Fabric 是用于内部原型设计/共享的绝佳工具。
  • @Sasha 是崩溃了吗?还是应用程序刚刚退出?向 iOS 应用添加通知后,我遇到了类似的问题。
【解决方案2】:

我想分享我自己在生产阶段崩溃的经历,而在开发阶段一切正常。

我遇到了由 Reactotron 记录器引起的类似问题。由于我没有在生产阶段捆绑它,因此一行 console.tron.log 完全隐蔽地使我的应用程序崩溃。 (这是我的错,因为我没有在乎我的 linter 设置为“no-console”)

这是我在根级文件 root.js 中引入的代码 sn-p。

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

希望有人在浪费时间找出问题所在之前发现这一点。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我遇到了与 OP 相同的问题,但我使用的是 Bugsnag。由于某种原因,没有报告错误。
    • 我在调查仅影响 Release(与 OP 相同)的启动时崩溃情况时遇到了麻烦。 Crashlytics 给了我一个缩小的(并且无用的)堆栈跟踪。 Bugsnag 和 Sentry 仪表板空无一物。尽管它看起来是一个 JS 异常,但似乎崩溃发生在 Bugsnag/Sentry 处理程序加载之前。
    • 投了反对票,因为你在为你的公司做广告
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多