2016-03-04 86 views
18

我正在使用React Native构建一个iOS应用程序,并试图让它在手机上可测试。React-Native ios应用程序崩溃而无报告

如果我将手机插入计算机并直接“构建”到手机中,则应用程序已正确构建并可正确打开/操作,没有任何问题。

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

此外,没有崩溃报告 - 在TestFlight中,Crashlytics或XCode中,只要我重新插入电话即可。因此,我在这里黑暗中操作,没有任何有关突破的信息。在网上找不到类似的问题,所以我想我会问。任何想法可能会出错?

请让我知道是否有任何代码或其他数据可能需要查看。其中一些是保密的,但我会尝试发布一个近似版本。

+1

我还没有听说过这个问题。我正确地假设你已经更新了你的AppDelegate.m来使用这个包吗?假设我是,好奇你正在使用哪个RN版本。就像一个健全的检查,也许尝试建立一个新的应用程序,并确保按预期工作。然后,试验和错误,加入粗略的比特直到它破裂。糟透了,但这正是我想到的。 –

+0

哈耶。这正是我决定要做的。看起来似乎是关于我的应用程序的东西,即使没有崩溃报告,因为新鲜的应用程序工作正常,我的应用程序只能放到单个Hello World页面。 – Sasha

+1

在这种情况下,如果不分享您的代码,我认为您不会在这里找到很多帮助。不幸的是TestFlight和Crashlytics只会在本机出现故障时告诉你。你必须尝试像https://getsentry.com/,https://trackjs.com/或类似的东西来获取JS崩溃报告。 –

回答

11

正如克里斯盖尔曼建议,问题是一个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语句:

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属性。

为什么没有报告,我不知道(我遵循克里斯的建议和安装Sentry,但它似乎仍然没有报告该错误)。

但是,这是怎么回事。缩小/丑化发生在只有当我通过TestFlight/Fabric安装在手机上的应用程序,这就是为什么应用程序只在这些条件下坠毁。

希望这可以避免任何人因撕掉头发而陷入类似的错误。

+0

和你有同样的问题。你是如何追踪这个问题的?只是试验和错误? –

+0

是的,不幸的。我通过评论应用程序的大部分内容,将问题缩小到一个文件,然后我只是将数据打印到页面上,而不是通过任何渲染步骤。使用Fabric.io比使用TestFlight更容易,导致后者每个分发需要大约100倍的时间。它仍然非常乏味,但不是太糟糕。 – Sasha

+0

太好了,谢谢!那么,通过使用Fabric.io它是否完全不需要TestFlight? –

1

不知道你是否仍然有这个问题 - 但是如果你这样做,我建议检查Bugsnag react native error reporting--它报告JavaScript层以及本地层(java/cocoa)中的崩溃。

在使用缩小和/或混淆处理时,原始崩溃报告(如Sasha提到的)要解决的一个难题就是恢复原始堆栈跟踪 - 这是在Bugsnag中通过提供对JS源地图的完全支持来处理的,以及iOS符号和Android Proguard在本机层面的支持。

让我知道如果这能帮助 - 我是创始人@ Bugsnag

+0

我与OP有同样的问题,但我使用Bugsnag。由于某些原因,错误未被报告。 – Lee

+0

我一直在调查仅影响发布的崩溃启动情况(与OP相同)。 Crashlytics给我一个缩小的(并且无益的)堆栈跟踪。Bugsnag和Sentry仪表板出现空白。 即使它看起来是一个JS异常,它似乎在Bugsnag/Sentry处理程序加载之前发生崩溃。 – paws

+0

downvoted,因为你是为你的公司做广告 – connorbode

1

我想与大家分享我自己的生产阶段崩盘的经验,而一切工作,处于发展阶段的罚款。

我有类似的问题,这是由Reactotron记录器造成的。由于我没有将其捆绑在制作阶段,因此一行console.tron.log将我的应用完全隐身。 (它有点儿是我的错,因为我没有给出与'无控制台'设置有关的棉绒)

下面是我在我的根级文件root.js.中介绍的代码片段。

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

希望有人在浪费时间弄清楚什么是错的之前找到了这个。