gpt4 book ai didi

ios - React Native 在生产中崩溃

转载 作者:技术小花猫 更新时间:2023-10-29 11:04:36 26 4
gpt4 key购买 nike

我们使用 React Native 构建了一个应用程序,以改进我们之前的 Cordova 应用程序的 UX 和功能。

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

发布后,许多用户开始报告应用程序在启动画面消失之前崩溃。我们之前在应用审查、测试或其他任何地方都没有看到过的行为。

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

我们发布了一个集成了 Crashlytics 的更新版本,但这也无济于事。我们也没有收到针对此特定问题的 Crashlytics 错误,这意味着该问题可能发生在之前

有什么想法我接下来应该看哪里?我们真的不想恢复到旧版本而失去几个月的工作。

该应用程序在加载所有内容时使用大约 100MB 的内存,因此我认为这应该不是问题。它发生在所有设备的所有版本的 iOS 上。我们不能将错误隔离到特定用户。

最佳答案

当似乎没有任何其他分析途径时,我求助于日志记录。

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

  • 应用程序应该做的第一件事是通过读取一些应该在上次启动开始和结束时写入默认值的值来检查上次启动是否成功(详细信息在下一步中)。如果之前的启动不成功,让用户选择以某种“安全模式”运行(这意味着你的应用程序在启动时尝试做什么,但对我来说这意味着不加载任何数据,或者做除了显示没有任何数据相关项目的 UI 之外的任何东西;对于某些应用程序,它甚至可以加载完全不同的 UI,其中仅包括诊断工具或数据删除/重置工具)。
  • 在确定上一次启动正常(或者这是有史以来第一次启动)之后,应用程序应该做的下一件事是尽快将某种“startupBegan”状态写入默认值,然后再写入某种“startupCompleted”状态仅当它完全完成启动时(“完全完成启动”的意思是依赖于应用程序,但你真的想确定 UI 在这一点上是完全响应的,并且正在显示它需要的一切;这可以有时确定起来有点棘手,因为有些东西直到启动画面消失后才会运行,等等;如果你找不到任何其他方式,我想你可以用计时器触发它,但这会很丑陋 -最好找到某种方法来确定启动何时真正完全完成)。这些值可用于确定启动是否开始但未完成,并且是第 1 步(以上)用于确定上次启动是否成功的值。
  • 在应用程序中包含大量日志记录,并将日志写入文件。我认为您可以使用 3rd 方工具来执行此操作,但是我编写了自己的方法(如下所示),如果在生产环境中运行且未连接到 XCode,它只会将 stderr 重定向到文件。请注意 NSLog()写入标准错误,而不是标准输出。
  • 让应用程序能够将日志文件通过电子邮件发送到您的支持电子邮件地址 - 这必须在应用程序的“安全模式”(以及正常模式)中可用。在正常模式下,我将其设置得相当模糊,以免在一切正常时用户不会注意到太多(例如,“设置”或“关于” View 底部的按钮)。当用户提交了我真正需要日志的支持请求时,我会告诉他们如何找到按钮。
  • 每次启动时都要轮换日志,防止它们占用太多空间,但一定要保持几次轮换,否则你只会从“安全模式”启动中获取日志,这是无用的。

  • 这方面的许多变化是可能的。包括诸如仅在用户为其配置了设置的情况下才启用日志记录之类的内容。有时,当用户报告特定问题时,您可能必须围绕特定代码区域添加大量日志记录,然后在问题解决后再次删除它(如果您担心日志记录的性能/存储问题)。

    对于我的(Objective-C)应用程序,包含我的代码以将启动状态写入默认值的位置如下(可能有更好的位置更适合您的应用程序):
  • “startupBegan”早在应用程序委托(delegate)的 application:didFinishLaunchingWithOptions:
  • View Controller 末尾的“startupCompleted”viewDidAppear (不是 viewWillAppear!在这两个发送之间有很多东西可能会出错)

  • 附注。我旧的日志重定向和轮换方法是这样的(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);
    }
    }

    关于ios - React Native 在生产中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40727923/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com