2016-11-21 71 views
10

我们使用React Native构建了一款应用程序,以改进我们以前的Cordova应用程序的UX和功能。React本机在生产中崩溃

一切都很顺利。几个月的开发,QA,应用程序审查,然后我们发布到App Store。它适用于我们尝试过的所有设备,从iPhone 4到iPhone 6s +,我们在iOS 8.3(可以通过xCode下载的最早模拟器)上测试到10.0。

发布之后,很多用户开始报告该应用在闪屏甚至消失之前崩溃。我们在应用程序审查,测试或其他任何地方未见过的行为。

我们调查了xCode中的“崩溃”,他们显然没有出现,因为数百名用户经历了崩溃,我们只能看到少数 - 这似乎与创业无关。

我们发布了Crashlytics集成的更新版本,但这也没有帮助。我们也没有得到Crashlytics这个具体问题的错误,这意味着这个问题可能发生在

任何想法我应该在哪里看下?我们真的不想恢复到旧版本,并失去了数月的工作。

该应用程序使用大约100MB的内存,当一切都加载,所以这应该不是我想的问题。它发生在所有设备上的所有iOS版本上。我们无法将错误隔离到只有特定用户。

+1

是Crashlytics给你一个崩溃的堆栈跟踪,或者是你没有得到任何有关的任何更新回到你所有的崩溃?如果你什么都看不到,那么甚至在Crashlytics初始化发生之前它可能会崩溃。 –

+1

这里有一些信息缺失,我们需要帮助你:首先,crashlytics会给你什么?其次,你能隔离一个这样做的设备吗?(这将是最重要的)。好消息是,一旦你获得了这样的设备,你通常可以在本地发布设备并进行复制。一旦你有了上面的内容,我觉得这个问题会很快得到解决。医生不能在没有看到病人的情况下对待他人。 – GantMan

+0

在Crashlytics初始化之前一定会发生崩溃。我无法隔离正在发生的设备。我会相应地更新这个问题。 – ewooycom

回答

2

的问题了,因为我们和用户之间的沟通不良的这么长时间来解决。应用程序实际上是不会崩溃,只是没有启动(这是在一些用户的眼中相同)。

当我们发现后,我们意识到其中一个事件没有触发(隐藏扩展启动画面的事件),这是用户卡住的地方。我们使用的一个库没有正确处理错误情况,这使我们的工作变得更加困难。在测试中我很幸运地进入该状态,并且可以从那里继续。

我更新了处理该场景的代码,现在问题已解决。

+0

我有这个问题。哪个活动应该开火?你是如何解决这个问题的? –

5

当似乎没有任何其他分析途径时,我会采取简单的伐木后退措施。

我以前在生产iOS应用程序中使用了以下技术。这是一项需要设置的工作,但一旦做到这一点,它对于未来的其他许多问题都是非常有用的。不仅仅是崩溃,而且还有其他奇怪的行为,用户报告你无法在测试环境中复制这些行为。

  1. 应用程序应该做的第一件事是检查如果以前的启动是通过读取下一个步骤应该在开始和先前启动的结束被写入默认某些值(细节成功与否)。如果以前的启动不成功,给用户选择以某种“安全模式”运行(这意味着取决于你的应用在启动时要做的事情,但对我而言,这意味着不加载任何数据,或者做除了显示UI之外,没有任何与数据相关的项目;对于某些应用程序,甚至可以加载完全不同的UI,其中仅包括诊断工具或数据删除/重置工具)。
  2. 确定上一次启动是否正常(或者这是有史以来的第一次启动)之后,应用程序应该做的下一件事是尽快将某种“startupBegan”状态写入默认值,然后稍后只有当它完全启动时(“完全启动”意味着依赖于应用程序,但是您确实要确保用户界面在这一点上完全响应,并且正在显示它需要的所有内容;这可能有点难以确定,因为有些事情在启动画面消失后才运行;如果找不到任何其他方式,我想你可以用计时器触发它,但这会是相当难看 - 最好找到一些方法来确定启动是否完全完成)。这些值可以用来确定启动是否开始,但没有完成,并且是步骤1(上面)用来确定前一次启动是否成功的。
  3. 在应用程序中包含大量日志记录,并将日志写入文件。我认为有第三方工具可以实现此目的,但是我编写了自己的方法(如下),只需将stderr重定向到文件,如果在生产环境中运行并且未连接到XCode。请注意,NSLog()写入stderr,而不是stdout。
  4. 使应用程序能够将日志文件发送到您的支持电子邮件地址 - 这必须在应用程序的“安全模式”(以及正常模式下)中可用。在正常模式下,我将其做得相当晦涩,以至于一切正常时用户不会注意到它(例如,在“设置”或“关于”视图底部的按钮)。我告诉用户如何在提交支持请求时找到该按钮,我真的很需要这些支持请求。
  5. 在每次启动时旋转日志以防止它们消耗太多空间,但一定要保持几次旋转,否则只会从“安全模式”启动中获取日志,这是毫无用处的。

对此有许多变化是可能的。包括诸如只在用户为其配置设置时才启用日志记录的事情。有时,当用户报告特定问题时,您可能需要在代码的特定区域添加大量日志记录,然后在问题解决后重新删除它(如果您担心记录周围的性能/存储问题)。

对于我(的Objective-C)应用程序,对于包括我的代码在启动状态写入默认的地方是如下(可能有更好的地方更适合您的应用程序):

  • “startupBegan”早在应用程序委托的application:didFinishLaunchingWithOptions:
  • “startupCompleted”在端视图控制器的viewDidAppear(NOT viewWillAppear!有很多东西可以去错了这两者之间发送)

PS。我的旧的日志重定向和轮换方法是像这样(的Objective-C):

- (void)logRedirectRotate { 
    // If stderr not going to an XCode console (then running in production) 
    if (! isatty(STDERR_FILENO)) { 
     // Rotate logs 

     int rotationsCount = 3; 
     NSMutableArray *logRotations = [NSMutableArray array]; 

     for (int i = 0; i < rotationsCount; i++) { 
      [logRotations addObject:[pathToLogsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"appnameorbundleid.%d.log", i]]]; 
     } 

     [[NSFileManager defaultManager] removeItemAtPath:[logRotations lastObject] error:nil]; 

     for (int i = rotationsCount - 1; i > 0; i--) { 
      [[NSFileManager defaultManager] moveItemAtPath:[logRotations objectAtIndex:i - 1] toPath:[logRotations objectAtIndex:i] error:nil]; 
     } 

     // Redirect stderr to current log file rotation 
     freopen([[logRotations objectAtIndex:0] cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); 
    } 
} 
+0

您的建议非常感谢。我开始实施,但是在完成之前我们走上了正轨。我会给你赏金,因为我从你的答案中得到了一些有益于未来的想法。谢谢! – ewooycom

+0

嘿谢谢!很高兴听到你解决了。我很好奇听到实际发生的事情,所以读你自己的答案很有意思。 –

0

我有这个问题,我的情况可能很具体,但我会分享我的经验。

这里的关键是应用程序只在生产中崩溃,所以它只是在生产中被解雇了,这是搞乱了构建。在我们的案例中,罪魁祸首是缩小的React's dependencies之一。

东西拿走:

  1. 密切注视你的依赖
  2. 使用崩溃日志