如何检测Crashlytics何时未创建报告

时间:2018-09-13 00:33:49

标签: ios crashlytics

我有两个在应用启动时需要执行的代码路径: 1.当Crashlytics检测到上一次运行的报告时 2.干净启动时,即未检测到崩溃报告。

Crashlytics提供(并建议)使用此方法来检测崩溃:

- (void) crashlyticsDidDetectReportForLastExecution:(CLSReport *)report

,但是文档特别指出,初始化期间不会同步调用该方法。因此,尽管我可以使用它来检测案例1,但我认为在不引入竞争条件的情况下不可能使用相同的方法来检测案例2。

据我所知,当前框架没有在Crashlytics.h或CLSReport.h中公开任何检查报告是否存在的方法。如果是这样,我可以在框架初始化之前检查崩溃报告的存在。

建议?

2 个答案:

答案 0 :(得分:2)

迈克(来自Fabric)提出的解决方案

迈克(Mike)-我习惯于假设不能假定委托方法和回调是同步发生的,或者在同一线程上发生。您似乎是在说我可以/应该在这里做这个假设,这样(psdeudocode)才能起作用:

(在AppDelegate中)

- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL))completionHandler {

     self.HadCrash = YES;
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        completionHandler(YES);
    }];
}

(在AppDelegate didFinishLaunching中)

crashlytics.delegate = self;
[crashlytics init];   // presumably if the delegate method IS going to be called, it will be called here.
if (!HadCrash) 
{ // do "no crash" stuff here }

答案 1 :(得分:1)

来自Fabric的Mike,有两种方法可以用来了解发生的崩溃。

1)- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report;

此方法具有以下限制:

  • 初始化期间不会同步调用
  • 它不能阻止您提交报告
  • 报告对象本身是不可变的

最重要的好处是报告崩溃的能力不会受到任何影响。

2)- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler;

  • 当应用程序的最后执行在崩溃中结束时,将同步调用此函数。
  • 然后您可以执行任何要执行的操作,但是除非传入completionHandler来调用YES,否则将不会发送报告。如果传入NO,则通话将结束,但不会发送报告。

这是文档中的示例实现:

- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL))completionHandler {
    // Use this opportunity to take synchronous action on a crash. See Crashlytics.h for
    // details and implications.

    // Maybe consult NSUserDefaults or show a UI prompt.

    // But, make ABSOLUTELY SURE you invoke completionHandler, as the SDK
    // will not submit the report until you do. You can do this from any
    // thread, but that's optional. If you want, you can just call the
    // completionHandler and return.
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        completionHandler(YES);
    }];
}

我认为这解决了这个问题,但是让我知道是否错过了一些事情。