Как определить, когда Crashlytics НЕ создал отчет - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть два пути кода, которые необходимо выполнить при запуске приложения: 1. Когда Crashlytics обнаруживает отчет о последнем запуске 2. Когда это чистый запуск, т. Е. Отчет о сбое не обнаружен.

Crashlytics предоставляет (и рекомендует) использовать этот метод для обнаружения сбоев:

- (void) crashlyticsDidDetectReportForLastExecution:(CLSReport *)report

, но в документации конкретно говорится, что метод не вызывается синхронно во время инициализации.Поэтому, хотя я могу использовать это для обнаружения случая № 1, я не думаю, что можно использовать тот же метод для обнаружения случая № 2 без возможного введения условия гонки.

Насколько я могу судить,текущая структура не предоставляет какого-либо метода для проверки существования отчета, ни в Crashlytics.h, ни в CLSReport.h.Если бы это произошло, я мог бы проверить наличие отчета о сбое до инициализации фреймворка.

Предложения?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Решение, предложенное Майком (из ткани)

Майк - я привык предполагать, что нельзя делегировать методы делегатов и обратные вызовы синхронно или в одном и том же потоке. Вы, кажется, говорите, что я могу / должен сделать это предположение здесь, чтобы этот (psdeudocode) работал:

(в AppDelegate)

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

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

(В AppDelegate сделал FinishLaunching)

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 }
0 голосов
/ 13 сентября 2018

Майк из Fabric здесь, есть два метода, которые могут быть использованы, чтобы узнать о произошедшем сбое.

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);
    }];
}

Я думаю, что это решает вопрос, но дайте мне знать, если я что-то пропустил.

...