## Introduction To catch and send crashes that occur while the app is starting up, the app has to get adjusted a little bit to make this work. The challenges in this scenario are: - Sending crash reports needs to be asynchronous, otherwise it would block the main thread or bad network conditions could make it even worse - If the startup takes too long or the main thread is blocking too long, the watchdog process will kill the app - The app might crash again before the crash report could have been send ## HowTo 1. Setup the SDK 2. Check if the app crashed in the last session by checking `[BITCrashManager didCrashInLastSession]` 3. Check if `[BITCrashManager timeintervalCrashInLastSessionOccured]` is below a treshhold that you define. E.g. say your app usually requires 2 seconds for startup, and giving sending a crash report some time, you mighe choose `5` seconds as the treshhold 4. If the crash happened in that timeframe, delay your app initialization and show an intermediate screen 5. Implement the `BITCrashManagerDelegate` protocol methods `- (void)crashManagerWillCancelSendingCrashReport:(BITCrashManager *)crashManager`, `- (void)crashManager:(BITCrashManager *)crashManager didFailWithError:(NSError *)error;` and `- (void)crashManagerDidFinishSendingCrashReport:(BITCrashManager *)crashManager;` and continue app initialization ## Example @interface BITAppDelegate () {} @end @implementation BITAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self.window makeKeyAndVisible]; [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"<>" delegate:nil]; // optionally enable logging to get more information about states. [BITHockeyManager sharedHockeyManager].debugLogEnabled = YES; [[BITHockeyManager sharedHockeyManager] startManager]; if ([self didCrashInLastSessionOnStartup]) { // show intermediate UI } else { [self setupApplication]; } return YES; } - (BOOL)didCrashInLastSessionOnStartup { return ([[BITHockeyManager sharedHockeyManager].crashManager didCrashInLastSession] && [[BITHockeyManager sharedHockeyManager].crashManager timeintervalCrashInLastSessionOccured] < 5); } - (void)setupApplication { // setup your app specific code } #pragma mark - BITCrashManagerDelegate - (void)crashManagerWillCancelSendingCrashReport:(BITCrashManager *)crashManager { if ([self didCrashInLastSessionOnStartup]) { [self setupApplication]; } } - (void)crashManager:(BITCrashManager *)crashManager didFailWithError:(NSError *)error { if ([self didCrashInLastSessionOnStartup]) { [self setupApplication]; } } - (void)crashManagerDidFinishSendingCrashReport:(BITCrashManager *)crashManager { if ([self didCrashInLastSessionOnStartup]) { [self setupApplication]; } } @end