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

Ios 如何检测Crashlytics何时未创建报告,ios,crashlytics,Ios,Crashlytics,我有两个需要在应用程序启动时执行的代码路径: 1.当Crashlytics检测到上次运行的报告时 2.当它是一个干净的发射,即,没有碰撞报告被检测到 Crashlytics提供(并建议)此方法用于检测碰撞: - (void) crashlyticsDidDetectReportForLastExecution:(CLSReport *)report 但是文档特别指出,在初始化过程中不会同步调用该方法。因此,虽然我可以用它来检测案例1,但我认为不可能在不引入竞争条件的情况下使用相同的方法来检测案

我有两个需要在应用程序启动时执行的代码路径: 1.当Crashlytics检测到上次运行的报告时 2.当它是一个干净的发射,即,没有碰撞报告被检测到

Crashlytics提供(并建议)此方法用于检测碰撞:

- (void) crashlyticsDidDetectReportForLastExecution:(CLSReport *)report
但是文档特别指出,在初始化过程中不会同步调用该方法。因此,虽然我可以用它来检测案例1,但我认为不可能在不引入竞争条件的情况下使用相同的方法来检测案例2

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


建议

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

1)
-(void)crashlyticsdetecatetreportforlastExecution:(CLSReport*)报告

此方法具有以下限制:

  • 在初始化期间不同步调用它
  • 它不允许您阻止报告提交
  • 报表对象本身是不可变的
最重要的好处是报告碰撞的能力不会受到任何影响

2)
-(void)crashlyticsdetecatetreportforlastExecution:(CLSReport*)报告完成处理程序:(void(^)(BOOL submit))完成处理程序

  • 当应用程序的最后一次执行在崩溃中结束时,将同步调用此函数
  • 然后,您可以执行任何想要执行的操作,但除非传入
    YES
    调用
    completionHandler
    ,否则不会发送报告。如果传入
    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);
    }];
}
我认为这解决了问题,但如果我遗漏了什么,请告诉我。

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

Mike——我习惯于假设委托方法和回调不能同步发生,或者在同一个线程上发生。你似乎在说我可以/应该在这里做出这样的假设,这样(psdeudocode)就可以工作了:

(在AppDelegate中)

(在AppDelegate didFinishLaunching中)


迈克,你回答的问题和刚才问的不同。我特别想确定应用程序启动时崩溃报告何时不存在,而不是何时存在。是的,因此您需要包装崩溃检查,如果没有调用CrashlyticsDidDetectReportForLastExecution,则没有崩溃,但是您仍然可以在init的其余部分之前对其采取操作?您建议我如何检测委托方法是否未被调用?设置委托,执行框架初始化,然后。。。。?我可以设置一个计时器,但这可能会导致我在OPCorrect中提到的竞争条件,因为crashlyticsDidDetectReportForLastExecution是同步的,它将提供非常有限的阻塞调用。我的理解是,开发竞争条件的时间非常短。我只是对多线程问题有点偏执,忘记了如何编写更简单的代码:)
- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL))completionHandler {

     self.HadCrash = YES;
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        completionHandler(YES);
    }];
}
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 }