Ios 在生产中反应自然破碎
我们使用React Native构建了一个应用程序,以改进UX和以前Cordova应用程序的功能 一切都很顺利。几个月的开发、QA、应用程序审查,然后我们发布到应用程序商店。它适用于我们尝试的所有设备,从iPhone4S到iPhone6S+,我们在iOS8.3(最早可以通过xCode下载的模拟器)到10.0上进行了测试 发布后,许多用户开始报告应用程序在启动屏幕消失之前崩溃。我们以前在应用程序审查、测试或其他任何地方都没有见过这种行为 我们调查了xCode中的“崩溃”,它们显然没有出现,因为数百名用户经历了崩溃,而我们只能看到很少的崩溃——这似乎与启动无关 我们发布了一个集成了Crashlytics的更新版本,但这也没有帮助。对于这个特定的问题,我们也没有收到Crashlytics错误,这意味着这个问题可能以前发生过 你知道我下一步该去哪里吗?我们真的不想回到旧版本,失去几个月的工作Ios 在生产中反应自然破碎,ios,xcode,react-native,Ios,Xcode,React Native,我们使用React Native构建了一个应用程序,以改进UX和以前Cordova应用程序的功能 一切都很顺利。几个月的开发、QA、应用程序审查,然后我们发布到应用程序商店。它适用于我们尝试的所有设备,从iPhone4S到iPhone6S+,我们在iOS8.3(最早可以通过xCode下载的模拟器)到10.0上进行了测试 发布后,许多用户开始报告应用程序在启动屏幕消失之前崩溃。我们以前在应用程序审查、测试或其他任何地方都没有见过这种行为 我们调查了xCode中的“崩溃”,它们显然没有出现,因为数百
当加载所有内容时,应用程序会使用大约100MB的内存,所以我认为这应该不是问题。它发生在所有设备的所有iOS版本上。我们无法将错误仅限于特定用户。当似乎没有任何其他分析途径时,我求助于简单的日志记录 我以前在iOS应用程序的生产中使用过以下技术。这是一项需要设置的工作,但一旦开始,它对于将来的许多其他问题都非常有用。不仅仅是崩溃,还有用户报告的任何其他奇怪行为,这些行为您无法在测试环境中复制
NSLog()
写入stderr,而不是stdout- 在应用程序代理的
应用程序中的早期“StartupStart”:didFinishLaunchingWithOptions:
- 视图末尾的“startupCompleted”控制器的
(而不是视图显示
!在发送这两个视图时,可能会出现很多错误)视图显示
-(无效)日志重定向{
//如果stderr不去XCode控制台(然后在生产中运行)
如果(!isatty(标准文件号)){
//轮换原木
int旋转计数=3;
NSMutableArray*logRotations=[NSMutableArray];
对于(int i=0;i<旋转计数;i++){
[logRotations addObject:[pathToLogsDir stringByAppendingPathComponent:[NSString stringWithFormat:@“appnameorbundleid.%d.log”,i]];
}
[[NSFileManager defaultManager]removeItemAtPath:[logRotations lastObject]错误:nil];
对于(int i=旋转计数-1;i>0;i--){
[[
- (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);
}
}