我们使用React Native构建了一个应用程序,以改进我们以前的Cordova应用程序的用户体验和功能。
一切都很顺利。几个月的开发,QA,App审查,然后我们发布到App Store。它适用于我们尝试过的所有设备,从iPhone 4s到iPhone 6s +,我们在iOS 8.3(可以通过xCode下载的最早的模拟器)上测试到10.0。
发布后,许多用户开始报告应用程序在启动屏幕崩溃之前崩溃。我们在应用审核,测试或其他任何地方都没有看到过的行为。
我们调查了"崩溃"在xCode中他们显然没有出现,因为数百名用户遇到了崩溃,我们只能看到很少 - 这似乎与创业无关。
我们发布了集成了Crashlytics的更新版本,但这也没有任何帮助。我们也没有针对这个特定问题得到Crashlytics错误,这意味着问题可能发生在
之前我接下来应该关注哪些想法?我们真的不想恢复旧版本而失去数月的工作。
当所有内容都加载时,应用程序会使用大约100MB的内存,所以这不应该是我认为的问题。所有设备上的所有iOS版本都会发生这种情况。我们无法将错误仅隔离给特定用户。
答案 0 :(得分:5)
如果似乎没有任何其他分析途径,我会采用简单的伐木方式。
我之前在制作iOS应用中使用了以下技术。这是一项设置工作,但一旦开始,它对未来的许多其他问题非常有用。不只是崩溃,而是用户报告您在测试环境中无法复制的任何其他奇怪行为。
NSLog()
写入stderr,而不是stdout。这方面的许多变化都是可能的。包括仅在用户为其配置设置时启用日志记录的内容。有时,当用户报告特定问题时,您可能必须在特定代码区域添加大量日志记录,然后在问题解决后再次将其删除(如果您担心日志记录的性能/存储问题)。 / p>
对于我的(Objective-C)应用程序,包含我的代码以将启动状态写入默认值的位置如下(可能有更适合您的应用的更好的地方):
application:didFinishLaunchingWithOptions:
viewDidAppear
的末尾(不是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);
}
}
答案 1 :(得分:2)
由于我们与用户之间的沟通不畅,问题需要很长时间才能解决。应用程序实际上没有崩溃,只是没有启动(在某些用户眼中这是相同的)。
在我们发现之后,我们意识到其中一个事件没有触发(隐藏了扩展的闪屏的事件),这就是用户卡住的地方。我们使用的其中一个库没有正确处理错误情况,这使我们的工作变得更加困难。我很幸运,在测试时进入该状态,我可以从那里继续。
我更新了代码以处理该方案,现在问题已解决。
答案 2 :(得分:0)
我有这个问题,我的情况可能非常具体,但无论如何我都会分享我的经验。
这里的要点是应用程序只在生产中崩溃,因此它只会在生产中被解雇,这会破坏构建。在我们的案例中,罪魁祸首是React's dependencies中的一个缩小。
要带走的东西: