HomeDocumentationAPI Reference
Getting StartedAPI ReferenceBug ReportingCrash ReportingAPMHelp Center
Documentation

Repro Steps for iOS

Learn more about the steps your user has taken until the bug or crash was reported on your iOS apps.

Repro Steps show you all of the interactions a user makes with your app up until a bug or crash is reported, grouped by the app view. For each view that a user visits, all of the steps that they commit are captured and displayed as logs next to the relevant screenshot. Repro steps can be found below the bug details.

Logged Data

Captured Events

UI Interactions

For the following gestures, only the gesture is logged and displayed:

  • Swipe
  • Scroll
  • Pinch
  • Tap
  • Force Touch
  • Double-Tap
  • Enabling/Disabling a switch
  • Changing the value of a slider
  • Editing a text field.

Lifecycle Events

Whenever one of the following lifecycle events occurs, it will be captured and shown on the timeline:

  • Application is moved to the background
  • Application is moved to the foreground
  • Application becomes active
  • Application becomes inactive
  • Memory warning

Extra Details

Depending on the event, you'll find further details displayed as part of the log statement.

  • Tap, double tap, and force touch: The SDK always tries to first capture the text rendered inside the UI that the user is interacting with, then we fall back to capturing the icon only with the buttons and navigation items, then, we fall back to the accessibility labels.
  • Switch: Both the accessibility label as well as whether the user enabled or disabled the switch are logged.
  • Slider: Both the accessibility label as well as the value that the user moves the slider to it are captured.
  • Text fields: First, the SDK tries to capture the placeholder, then we fall back to the accessibility label.

Examples

Here are some examples of how the steps look like:

  • Tapped on the button "Send"
  • Double tapped on UI that contains "Instructions"
  • Started editing “Password“
  • Enabled the switch “Push Notifications“
  • Moved the slider “Text Size“ to 10%
  • App went to the background
  • App became active
  • Memory warning

User Privacy

Disclaimer

A disclaimer will be shown at the bottom of the report. It helps your users view all the screenshots taken for the Repro Steps before sending a report and can delete them as well.

Private Views

On your side, you can easily mark any view that might contain sensitive information, like payment details, as private. Any private view will automatically appear with a black overlay covering it in any screenshot or screen recording. To make a view private, you can use the following property.

view.luciq_privateView = true
view.luciq_privateView = YES;

Auto Masking

📘

Good to know

  • This feature requires a minimum iOS SDK version of 11.12.0.
  • Auto Masking is supported only in screenshots (Repro Steps), not screen recordings.

🚧

SwiftUI

Currently, Auto Masking is not yet supported on SwiftUI.

This feature automatically masks sensitive data when screenshots are captured, while protecting the user's privacy by default. This affects both Bug and Crash Reporting.

Example of Masked Text Inputs, Labels, and Media

Example of Masked Text Inputs, Labels, and Media

Luciq.setAutoMaskScreenshots([.textInputs])
//Default Value: .maskNothing
[Luciq setAutoMaskScreenshots: LCQAutoMaskScreenshotOptionTextInputs];
//Default Value: LCQAutoMaskScreenshotOptionMaskNothing

Here are all possible parameters.

//No Masking Applied
.maskNothing
//Masks Text Input
.textInputs
//Masks text labels, including buttons and titles
.labels
//Masks images and video
.media
//No Masking Applied
LCQAutoMaskScreenshotOptionMaskNothing
//Masks Text Input
LCQAutoMaskScreenshotOptionTextInputs
//Masks text labels, including buttons and titles
LCQAutoMaskScreenshotOptionLabels
//Masks images and video
LCQAutoMaskScreenshotOptionMedia
Preview of different masking levels

Preview of different masking levels

Examples

APIMeaning
Swift: Luciq.setAutoMaskScreenshots([.textInputs])

ObjC: [Luciq setAutoMaskScreenshots: LCQAutoMaskScreenshotOptionTextInputs];
Mask Text Inputs only.
Swift: Luciq.setAutoMaskScreenshots([.textInputs, .labels])

ObjC: [Luciq setAutoMaskScreenshots: LCQAutoMaskScreenshotOptionTextInputs | LCQAutoMaskScreenshotOptionLabels];
Mask Text Inputs and Labels.
Swift: Luciq.setAutoMaskScreenshots([.maskNothing])

ObjC: [Luciq setAutoMaskScreenshots: LCQAutoMaskScreenshotOptionMaskNothing];
Disable auto masking.

📘

The Private Views API takes precedence over Auto Masking.

Disabling and Enabling

Repro Steps is by default enabled with screenshots for both bug reporting and session replay and enabled without screenshots for crash reporting.

Luciq.setReproStepsFor(.all, with: .enable)
[Luciq setReproStepsFor:LCQIssueTypeAll withMode:LCQUserStepsModeEnable];

You can change the value of the Issue Type.

//Bug Reporting and Crash Reporting
.all
//Bug Reporting Only
.bug
//Crash Reporting Only
.crash
//Session Replay Only
.sessionReplay
//Bug Reporting and Crash Reporting
LCQIssueTypeAll
//Bug Reporting Only
LCQIssueTypeBug
//Crash Reporting Only
LCQIssueTypeCrash
//Session Replay Only
LCQIssueTypeSessionReplay

You can change the value of the User Steps Mode.

//Enable with Screenshots
.enable
//Enable with NO Screenshots
.enabledWithNoScreenshots
//Disable
.disable
//Enable with Screenshots
LCQUserStepsModeEnable
//Enable with NO Screenshots
LCQUserStepsModeEnabledWithNoScreenshots
//Disable
LCQUserStepsModeDisable

Examples

APIMeaning
Swift: Luciq.setReproStepsFor(.all, with: .enable)

ObjC:[Luciq setReproStepsFor:LCQIssueTypeAll withMode:LCQUserStepsModeEnable];
Enable with Screenshots for both Bug Reporting and Crash Reporting.
Swift: Luciq.setReproStepsFor(.crash, with: .enabledWithNoScreenshots)

ObjC: [Luciq setReproStepsFor:LCQIssueTypeCrash withMode:LCQUserStepsModeEnabledWithNoScreenshots];
Enable with No Screenshots for Crash Reporting.
Swift: Luciq.setReproStepsFor(.bug, with: .enable)

ObjC: [Luciq setReproStepsFor:LCQIssueTypeBug withMode:LCQUserStepsModeEnable];
Enable with Screenshots for Bug Reporting.
Swift: Luciq.setReproStepsFor(.all, with: .disable)

ObjC: [Luciq setReproStepsFor:LCQIssueTypeAll withMode:LCQUserStepsModeDisable];
Completely disable for both Bug Reporting and Crash Reporting.

To be able to capture Repro Steps, we need to do method swizzling. We take an approach to swizzling that is absolutely safe and does not impact your app negatively in any way. For more details, you can check here. This swizzling can be disabled if you would prefer to log the user interactions manually.

📘

Screenshots are by default disabled for Crash Reporting.

For Crash Reporting, screenshots are by default disabled; however, if you are looking to enable screenshots in Crash Reporting, make sure to use the Auto Masking API. This API will automatically help you mask sensitive data in screenshots to protect the end-users' privacy.