Crash Reporting User Consent for iOS

This page explains the usage of user consent for iOS crash reports and the needed APIs to implement it.

Suppose you want your users' confirmation before sending a crash report to Instabug. In that case, the Instabug SDK exposes a callback awaiting each user's confirmation before sending any crash/error data to Instabug.

This callback function instructs Instabug to await user confirmation before sending crash reports. It is designed to enhance end-user privacy and control by allowing them to approve or decline the submission of crash reports, ensuring a more transparent and user-centric experience.

This callback applies to fatal errors (crashes) and out-of-memory (OOM) reports, force restarts, and excludes app hangs and non-fatal errors.

If no response is received within a 2-minute window, the callback triggers a timeout mechanism, preventing the automatic crash report sending.

Example Usage

 CrashReporting.onWillSendCrashReportHandler = { crashType, completionHandler in

            let crashTypeAsString: String

            switch (crashType) {

            case .crash:

                    crashTypeAsString = "Fatal Crash"

            case .forceRestart:

                    crashTypeAsString = "User termination Crash"

            case .OOM:

                    crashTypeAsString = "OOM Crash"

            @unknown default:

                fatalError()

            }

            let message = "Are You Sure Want to send Crash! for crash type: \(crashTypeAsString)"

            let alert = UIAlertController(title: "Crash Consent", message: message, preferredStyle: .alert)

            let yesButton = UIAlertAction(title: "Yes", style: .default, handler: { _ in

                completionHandler?(.accept);

            })

            alert.addAction(yesButton)

            let noButton = UIAlertAction(title: "No", style: .default, handler: { _ in

                completionHandler?(.reject);

            })

            alert.addAction(noButton)

            let rootViewController = UIApplication.shared.keyWindow?.rootViewController

            rootViewController?.present(alert, animated: true)

        }
IBGCrashReporting.onWillSendCrashReportHandler = ^(IBGCrashType crashType, IBGCrashReportConsentReplyHandler completionHandler) {

        NSString *crashTypeAsString;

        switch (crashType) {

            case IBGCrashTypeCrash:

                crashTypeAsString = @"Fatal Crash";

                break;

            case IBGCrashTypeForceRestart:

                crashTypeAsString = @"User termination Crash";

                break;

            case IBGCrashTypeOOM:

                crashTypeAsString = @"OOM Crash";

                break;

        }

        NSString *message = [NSString stringWithFormat:@"Are You Sure Want to send Crash! for crash type: %@", crashTypeAsString];

        UIAlertController * alert = [UIAlertController

                                     alertControllerWithTitle:@"Crash Consent"

                                     message:message

                                     preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction* yesButton = [UIAlertAction

                                    actionWithTitle:@"Yes"

                                    style:UIAlertActionStyleDefault

                                    handler:^(UIAlertAction * action) {

            completionHandler(IBGCrashReportConsentAccept);

        }];

        [alert addAction:yesButton];

        UIAlertAction* noButton = [UIAlertAction

                                   actionWithTitle:@"No"

                                   style:UIAlertActionStyleDefault

                                   handler:^(UIAlertAction * action) {

            completionHandler(IBGCrashReportConsentReject);

        }];

        [alert addAction:noButton];

        UIViewController *rootViewController = [UIApplication.sharedApplication.keyWindow rootViewController];

        [rootViewController presentViewController:alert animated:YES completion:nil];

    };

📘

Minimum SDK Version

The minumum SDK version required to support user consent is v12.7.0


🚧

Concessions in Consent Logic

Please note that the onWillSendCrashReportHandler is not executed for persistent launch crashes.

Why does this happen?

Our SDK handles persistent launch crashes, which are critical, app-breaking issues, by briefly pausing the app's main thread. This guarantees that the crash report can be successfully sent before the app has a chance to crash again.

Because the consent callback requires showing a UI prompt on the main thread, it is intentionally skipped in this specific scenario. This approach prioritizes the successful capture of the crash report. This ensures you get visibility into critical issues that would otherwise be missed.

Please note that, normal, non-persistent launch crashes that occur during a stable session will continue to trigger the consent callback as expected.