Video-like Session Replay for iOS
Enhance your Session Replay experience with video-like playback. Configure screenshot quality and capture frequency to see exactly what your users experienced during their sessions
Overview
Video-like Session Replay transforms your session recordings from simple screen-by-screen captures into smooth, video-like playback. This feature gives you complete visibility into user behavior by:
- Capturing more frequent screenshots → See every interaction, not just screen transitions
- Providing configurable quality profiles → Balance visual fidelity with storage efficiency
- Supporting multiple capture modes → Choose the right approach for your debugging needs
Minimum SDK Version: iOS SDK 19.2.0+
Quick Start
Add these APIs before initializing the SDK for the best experience:
Swift
import Luciq
// Configure video-like replay
SessionReplay.screenshotCapturingMode = .frequency
// 1 screenshot per second, value in ms
SessionReplay.screenshotCaptureInterval = 1000
SessionReplay.screenshotQualityMode = .normal
// Initialize SDK
Luciq.start(withToken: "YOUR_APP_TOKEN", invocationEvents: [.shake])Objective-C
#import <Luciq/Luciq.h>
// Configure video-like replay
LCQSessionReplay.screenshotCapturingMode = LCQCapturingModeFrequency;
// 1 screenshot per second, value in ms
LCQSessionReplay.screenshotCaptureInterval = 1000;
LCQSessionReplay.screenshotQualityMode = LCQScreenshotQualityNormal;
// Initialize SDK
[Luciq startWithToken:@"YOUR_APP_TOKEN" invocationEvents:LCQInvocationEventShake];Capturing Modes
Control when screenshots are captured using the screenshotCapturingMode API.
Navigation Mode (Default)
Captures screenshots only when users navigate between screens. This is the default behavior, providing the lowest overhead.
Best for: Apps where screen transitions are the primary user flow
SessionReplay.screenshotCapturingMode = .navigationLCQSessionReplay.screenshotCapturingMode = LCQCapturingModeNavigation;Interactions Mode
Captures screenshots on screen navigation and user interactions. Includes debouncing to prevent excessive captures.
Best for: Debugging user interaction issues, understanding how users interact with complex screens
Supported Interactions
| UIKit | SwiftUI |
|---|---|
| Tap | Tap |
| Double Tap | Double Tap |
| Long Press | Long Press |
| Force Touch | Force Touch |
| Swipe | Swipe |
| Pinch | Pinch |
| Scroll | Scroll* |
**SwiftUI scroll detection requires manual integration, please refer to the SwiftUI Integration docs.
SessionReplay.screenshotCapturingMode = .interactionsLCQSessionReplay.screenshotCapturingMode = LCQCapturingModeInteractions;Frequency Mode
Captures screenshots at a fixed time interval for true video-like playback. Also captures on screen navigation.
Best for: Full video-like replay experience, debugging visual issues, understanding complete user journeys
SessionReplay.screenshotCapturingMode = .frequency
SessionReplay.screenshotCaptureInterval = 1000 // Capture every 1000ms (1 FPS)LCQSessionReplay.screenshotCapturingMode = LCQCapturingModeFrequency;
LCQSessionReplay.screenshotCaptureInterval = 1000; // Capture every 1000ms (1 FPS)Screenshot Capture Interval
When using Frequency mode, configure how often screenshots are captured.
| Parameter | Description |
|---|---|
intervalMs | Time between captures in milliseconds |
| Default | 1000ms (1 screenshot per second) |
| Minimum | 500ms |
// Capture every 500ms (2 FPS)
SessionReplay.screenshotCaptureInterval = 500
// Capture every 2 seconds
SessionReplay.screenshotCaptureInterval = 2000// Capture every 500ms (2 FPS)
LCQSessionReplay.screenshotCaptureInterval = 500;
// Capture every 2 seconds
LCQSessionReplay.screenshotCaptureInterval = 2000;Note: Values below 500ms will automatically use 500ms - the default minimum. A warning will be logged to help you identify the issue.
Timer Reset Behavior
The capture timer resets when:
- A manual screenshot is captured via the SDK API
- Screen navigation occurs
This ensures you always capture important moments regardless of the timer state.
Screenshot Quality
Control the visual quality of captured screenshots. Higher quality provides better visuals but uses more storage.
Quality Profiles
| Profile | Compression | Use Case |
|---|---|---|
| High | 50% quality (WebP) | Detailed debugging, visual regression testing |
| Normal (Default) | 25% quality (WebP) | Balanced quality and storage |
| Greyscale | 25% quality + grayscale (WebP) | Maximum storage efficiency, text-heavy apps |
SessionReplay.screenshotQualityMode = .high // Best visual quality
SessionReplay.screenshotQualityMode = .normal // Balanced (default)
SessionReplay.screenshotQualityMode = .greyscale // Smallest file sizeLCQSessionReplay.screenshotQualityMode = LCQScreenshotQualityHigh; // Best visual quality
LCQSessionReplay.screenshotQualityMode = LCQScreenshotQualityNormal; // Balanced (default)
LCQSessionReplay.screenshotQualityMode = LCQScreenshotQualityGreyscale; // Smallest file sizeEstimated Screenshots per Session
Based on the default 1MB session screenshot limit:
| Quality Profile | Approx. Screenshots per Session |
|---|---|
| High | ~62 screenshots |
| Normal | ~104 screenshots |
| Greyscale | ~130 screenshots |
Tip: For video-like replay at 1 FPS with Normal quality, you can capture approximately 1-2 minutes of continuous session activity.
Configuration Timing
Recommended: Before SDK Initialization
For best results, configure Video-like Session Replay before calling Luciq.start():
// Recommended approach
SessionReplay.screenshotCapturingMode = .frequency
SessionReplay.screenshotCaptureInterval = 1000
SessionReplay.screenshotQualityMode = .normal
Luciq.start(withToken: "YOUR_APP_TOKEN", invocationEvents: [.shake])Runtime Configuration
You can also change settings during the session. Changes take effect as follows:
| Setting | When Applied |
|---|---|
| Capturing Mode | Next session |
| Screenshot Quality | Next screenshot |
| Capture Interval | After current interval completes |
// Change quality mid-session
SessionReplay.screenshotQualityMode = .high
// Switch capturing mode (applies next session)
SessionReplay.screenshotCapturingMode = .frequencySwiftUI Considerations
For SwiftUI apps, most interactions are captured automatically. However, scroll detection in SwiftUI requires manual gesture handling if you want scroll events to trigger captures in Interactions mode.
UIKit views embedded in SwiftUI work as expected with full interaction detection.
Please refer to our SwiftUI Integration docs for more details.
Privacy & Masking
Video-like Session Replay respects all existing privacy configurations:
- Auto-masking continues to work across all capturing modes
- Private views are masked in all captured screenshots
- Views marked with
luciq_privateViewmodifier are automatically masked
// SwiftUI - Mark a view as private
Text("Sensitive Data")
.luciq_privateView()
// UIKit - Mark a view as private
sensitiveView.luciq_privateView = trueFor more information on privacy controls, see Session Replay Privacy Options.
Best Practices
Recommended Configurations
| Use Case | Configuration |
|---|---|
| General debugging | Navigation mode + Normal quality |
| UI/UX analysis | Interactions mode + Normal quality |
| Full video replay | Frequency mode (1000ms) + Normal quality |
| Visual debugging | Frequency mode (500ms) + High quality |
| Storage-conscious | Navigation mode + Greyscale quality |
Code Examples
Video-like Replay (Balanced)
SessionReplay.screenshotCapturingMode = .frequency
SessionReplay.screenshotCaptureInterval = 1000
SessionReplay.screenshotQualityMode = .normalInteraction-Focused Debugging
SessionReplay.screenshotCapturingMode = .interactions
SessionReplay.screenshotQualityMode = .normalMaximum Visual Fidelity
SessionReplay.screenshotCapturingMode = .frequency
SessionReplay.screenshotCaptureInterval = 500
SessionReplay.screenshotQualityMode = .highStorage-Optimized
SessionReplay.screenshotCapturingMode = .navigation
SessionReplay.screenshotQualityMode = .greyscaleAPI Reference
SessionReplay.screenshotCapturingMode
Sets when screenshots are captured.
SessionReplay.screenshotCapturingMode: ScreenshotCapturingMode| Value | Description |
|---|---|
.navigation | Capture on-screen changes only (default) |
.interactions | Capture navigation and user interactions |
.frequency | Capture at fixed time intervals |
SessionReplay.screenshotQualityMode
Sets the visual quality of captured screenshots.
SessionReplay.screenshotQualityMode: ScreenshotQualityMode| Value | Description |
|---|---|
.high | 50% WebP compression |
.normal | 25% WebP compression (default) |
.greyscale | Grayscale + 25% WebP compression |
SessionReplay.screenshotCaptureInterval
Sets the capture interval for Frequency mode.
SessionReplay.screenshotCaptureInterval: Int| Parameter | Description |
|---|---|
intervalMs | Interval in milliseconds (min: 500, default: 1000) |
Migration Guide
If you're upgrading from a previous SDK version:
- No breaking changes → Default behavior remains Navigation mode with Normal quality
- Opt-in feature → Video-like replay must be explicitly configured
- Repro Steps unaffected → Bug and Crash report screenshots continue to use Navigation mode and Normal quality
Updated 12 days ago
