【问题标题】:Send a log to Crashlytics without an app crash向 Crashlytics 发送日志,不会导致应用崩溃
【发布时间】:2014-09-17 00:22:51
【问题描述】:

如何让 Crashlytics 在我的应用程序不崩溃的情况下接收日志? 我有以下代码:

if(!context.managedObjectContext save:&error) {
    CLS_LOG(@"%@",error.description)
}

发生错误时,我希望 Crashlytics 服务器接收错误,但应用程序应继续运行。

我现在不需要日志。我很乐意在下次重新启动时获得日志。我只是不想在我的应用中触发崩溃来接收日志。

这可能吗?

【问题讨论】:

  • 你没有。这不是它的本意。试试flurry,它们允许您发送“检查点”消息。
  • 这意味着我需要同时使用 flurry 和 Crashlytics。我确实认为我有一个有效的用例。有时错误很严重,但不保证崩溃,因此最好使用 crashlytics 获取错误。但你当然有道理
  • 我两个都用。有点痛苦,但最好使用工具。最起码,我是这么想的。而不是“破解”它们。

标签: ios crashlytics


【解决方案1】:

借助 crashlytics 的新更新,您现在可以使用:

[[FIRCrashlytics crashlytics] recordError:error];

在 Swift 中:

Crashlytics.crashlytics().record(error: error)

您可以查看文档here

【讨论】:

  • 这应该是答案。
  • 像崩溃一样,这些记录的错误只会在下一次应用启动时发送,如果用户从不强制退出应用,这是不幸的。
  • 您在哪里可以在 Fabric 控制台中观看这些活动?
  • 嗨 @SaeedNamati,这是 Objective-c,它指的是 iOS 中的 Crashlytics 框架
【解决方案2】:

有点老问题,但现在你可以使用Answers,它是Fabric 套装的一部分(Crashlytics 也是Fabric 的一部分):

Fabric 可以在这里找到。以及更多文档here

【讨论】:

  • 这个答案已经过时了。蒂亚戈阿尔梅达的答案是要走的路。
  • @Lupi 不是:docs.fabric.io/ios/answers/answers-events.html#custom-event。这是一个有效的解决方案。
  • Answers 与市场营销和大数据相关,绝对不用于错误跟踪。
  • @Lupi:由于堆栈展开不是可选的,因此 recordError 会产生成本。此外,正如其他人所指出的,recordError 仅在下一次应用启动时发送。在诸如近乎实时地计算某些错误发生次数的情况下,Answers 可能是一个可行且首选的解决方案,正如 Fabric 的文档在性能注意事项下概述的那样:docs.fabric.io/apple/crashlytics/…
【解决方案3】:

我尝试了以下几行,它就像魅力一样。在 try-catch 块中,在您的 catch 块中使用以下行

@try {
// line of code here
}
@catch (NSException *exception) {
NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler();
handler(exception);
}

正如http://support.crashlytics.com/knowledgebase/articles/222764-can-i-use-a-custom-exception-handler所解释的那样

[更新]

现在在 Fabric 的 crashlytics 中,我们可以使用简单的函数 [Crashlytics recordCustomExceptionName:reason:frameArray:] 来发送已处理的异常

@try {
// line of code here
}
@catch (NSException *exception) {
    NSArray *stack = [exception callStackReturnAddresses];
    [[Crashlytics sharedInstance] recordCustomExceptionName: exception.name
                                                 reason: exception.reason
                                             frameArray: stack];
}

如解释 https://twittercommunity.com/t/crashlytics-ios-how-to-send-non-fatal-exceptions-without-app-crash/34592/32

【讨论】:

  • Swift 不支持异常或 NSExceptions 的 try/catch。你可以在 Objective-C 中编写一个类,它接受一个 NSString 参数作为异常名称并从 swift 调用它?
  • 你可以从swift调用NSSetUncaughtExceptionHandler
【解决方案4】:

对我来说,.recordError() 方法没有帮助,因为它不记录用户信息。或者我只是没有找到在哪里观看它。使用 recordCustomExceptionName 适合我。有一个实现这两种方式的例子:

func logMessage(_ message: String) {
    let userInfo = ["message" : message]
    let error = NSError(domain: "AppErrorDomain", code: 1, userInfo: userInfo)
    Crashlytics.sharedInstance().recordCustomExceptionName("API Error", reason: message, frameArray: [])
    Crashlytics.sharedInstance().recordError(error, withAdditionalUserInfo: userInfo)
}

【讨论】:

    【解决方案5】:

    Swift 5、Crashlytics SDK 4.0.0-beta.6:

    let exceptionModel = ExceptionModel(name: "exception title", reason: "details")
    Crashlytics.crashlytics().record(exceptionModel: exceptionModel)
    

    ...与 NSError 类似,您想在 Crashlytics 仪表板中看到任何内容。

    let error = NSError(domain: "error title", code: 0, userInfo: ["message":"some details"])
    Crashlytics.crashlytics().record(error: error)
    

    【讨论】:

      【解决方案6】:

      Crashlytics 是一种崩溃跟踪服务,如果您需要跟踪自定义消息,请选择其他分析服务。

      【讨论】:

        【解决方案7】:

        参考 Crashlytics 文档。

        try {
          myMethodThatThrows();
        } catch (Exception e) {
          Crashlytics.logException(e);
          // handle your exception here!
        }
        

        https://docs.fabric.io/android/crashlytics/caught-exceptions.html?caught%20exceptions#caught-exceptions

        【讨论】:

        • 您在 android 文档中的方法在 ios 上不存在
        【解决方案8】:

        据我所知,如果您没有正确保护您的代码,您的应用程序无论如何都会崩溃。 Crashlylytics,在他们设计的 Web 应用程序中以“可读”模式将这些崩溃显示给您。如果没有崩溃,crashlytics 将采取任何措施。您可以在代码中获取异常:

        @try{
        ....
        }
        @catch(NSException ex){...}
        

        在关键部分,但如果您担心应用程序会崩溃或发现可能导致应用程序出现不良行为并出现故障的潜在错误,则应始终这样做。您始终可以在您的异常中强制发送或跟踪此错误。

        希望对你有帮助

        【讨论】:

        • 这甚至不能远程解决 OP 的问题。
        • 也许如果您阅读它发布的时间以及 Crashlytics 和不同平台的演变方式,那将是有意义的。我认为最好先查看对某人投反对票的日期。谢谢
        • 不,它不会。 OP 询问如何从 Crashlytics 获取非致命错误的报告,这在当时不是一个选项。您的答案是如何防止应用程序首先崩溃。完全不相关。
        【解决方案9】:

        诀窍是使用以下内容:

        http://support.crashlytics.com/knowledgebase/articles/202805-logging-caught-exceptions

        就用这个吧:

        Crashlytics.logException(new Exception("my custom log for crashLytics !!!"));
        

        我使用这个,我在大约 5 分钟内得到了非致命的崩溃!

        【讨论】:

        • 这个功能好像只有安卓。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-17
        • 2018-01-29
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多