ios - iPhone/iPad 生态系统是不是有可靠的崩溃报告系统?

Posted

技术标签:

【中文标题】ios - iPhone/iPad 生态系统是不是有可靠的崩溃报告系统?【英文标题】:ios - is there a reliable crash-reporting system for the iPhone/iPad ecosystem?ios - iPhone/iPad 生态系统是否有可靠的崩溃报告系统? 【发布时间】:2012-08-12 23:12:18 【问题描述】:

我知道在 android 中,有一个非常可靠的内置系统可以通知我发生的崩溃。他们几乎立即将堆栈跟踪和其他一些信息写入 Google 文档。效果非常好。

我开始为 ios 研究同样的东西,但我没有发现任何类似的东西同样有效。我看了这篇文章:Xcode storyboard: Why does the iPad storyboard show iPhone sized views?

但我不确定是否仍然如此。谁能推荐我在用户设备上发生的崩溃报告中使用什么?

谢谢!

【问题讨论】:

这是用于测试还是公开发布? @glennsayers 这将用于应用程序的公开发布 我知道您正在寻找实时崩溃报告系统,但 Apple 会记录和汇总来自您的应用程序的崩溃报告,您可以随时在 iTunes Connect 中访问这些报告。 iTunes Connect 仅在用户同意在设置时向 Apple 发送匿名使用数据时或从 iOS5 开始在设置深处的某个位置时才会显示崩溃。到目前为止,大多数用户都不同意!而且一旦发生次数不详,也只有几次崩溃。您也只能每天刷新一次列表。大多数时候(几周或几个月)它几乎不会显示任何东西!不要依赖 iTunes 连接!这是导致崩溃的唯一方法是耗尽内存或启动/关闭等时间过长。 【参考方案1】:

我将 Flurry 与 uncaughtExceptionHandler 和 GTMStackTrace 一起使用

异常处理程序可能如下所示:

void uncaughtExceptionHandler(NSException *exception) 

    @try 
    
        NSString *fullBacktrace = GTMSBStackTraceFromException(exception);
        NSMutableString *backtrace = [NSMutableString stringWithUTF8String:""];
        NSArray *backtraceArray = [fullBacktrace componentsSeparatedByString:@"\n"];
        for (id entry in backtraceArray) 
        
            NSRange testRange = [entry rangeOfString:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]];
            if (testRange.length)
             
                [backtrace appendString:entry];    
            
        

        NSCharacterSet *whitespaces = [NSCharacterSet whitespaceCharacterSet];
        NSPredicate *noEmptyStrings = [NSPredicate predicateWithFormat:@"SELF != ''"];

        NSArray *parts = [backtrace componentsSeparatedByCharactersInSet:whitespaces];
        NSArray *filteredArray = [parts filteredArrayUsingPredicate:noEmptyStrings];
        NSString *strippedBacktrace = [filteredArray componentsJoinedByString:@" "];   
        [FlurryAnalytics logError:@"uncaughtExceptionHandler"
                          message:[NSString stringWithFormat:@"%@", strippedBacktrace ? strippedBacktrace : @"no matching backtrace"]
                        exception:exception];
    
    @catch (NSException *exception) 
    
        NSLog(@"whoa!  could not handle uncaught exception!");
        [FlurryAnalytics logError:@"uncaughtExceptionHandler"
                          message:@"no matching backtrace"
                        exception:exception];
    

Testflight 也有很好的崩溃日志。

【讨论】:

谢谢,您的意思是说您使用 flurry 不仅用于分析用户,还有助于错误报告? 是的。 Flurry 是某种(邪恶的?)强大的数据收集器。但它的服务很棒。 大声笑..你是什么意思?我将它用于我的 android 应用程序,但它一直没用。 ios上怎么用? 顺便说一句,我之前没有使用过 uncaughtExceptionHandler。它是否应该特别存在于某个地方并且只写一次?还是应该存在于每个控制器中? 只需添加 applicationDidFinishLaunching: 这一行 NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);和上面的方法到Appdelegate【参考方案2】:

您可以做的是创建一个新的未捕获异常处理程序,然后通过NSSetUncaughtExceptionHandler 注册它。这样,每次崩溃都可以在杀死之前被拦截,您可以将其记录/保存到某个地方以上传。

(我个人使用过这个链接中描述的方法:http://cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html

【讨论】:

谢谢 - 当我阅读 cocoawithlove 链接时,它说这仅用于测试。苹果不允许在生产应用程序中这样做吗?或者您是否能够将该代码保留在生产应用程序中? 当我们在 AppStore 上发布该应用程序时,Apple 没有说明任何内容,所以我想他们允许这样做。【参考方案3】:

设置未捕获异常处理程序只会为您提供一部分崩溃报告,而且您通过这种方式获得的报告的详细信息非常有限。你没有得到所有线程的堆栈跟踪,你没有得到真正发生崩溃的异常的堆栈跟踪,你没有得到发生崩溃的代码的行号。此外,您不会收到任何由信号处理程序引起的崩溃报告。

此外,一旦发生崩溃,您不应该运行任何 Objective-C 代码,因为它不是异步安全的。有关它的更多信息,请参阅这篇文章:Reliable Crash Reporting

如果发布了有关您可以做什么的更多详细信息作为以下问题的答案:Crash analytics and reporting for iOS 和 iOS crash log catch, debug info.. Catch and send via email to the Dev team

【讨论】:

以上是关于ios - iPhone/iPad 生态系统是不是有可靠的崩溃报告系统?的主要内容,如果未能解决你的问题,请参考以下文章

报告称:苹果iPhone/iPad升级到iOS11后,耗电比iOS10快两倍

iPhone 2月6号报价:年前最低 一天

iOS(iPhone)应用程序与ipad兼容。但是怎么样?

把iPhone8切开做成戒指,全球仅此一个,想买吗?

用于 iPhone/iPad 的 Qt?

搞事iPhone/iPad升级变卡 长沙男子怒告苹果索赔2万