HomeDocumentationAPI Reference
Getting StartedAPI ReferenceDashboardHelp Center
Documentation

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 = .navigation
LCQSessionReplay.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

UIKitSwiftUI
TapTap
Double TapDouble Tap
Long PressLong Press
Force TouchForce Touch
SwipeSwipe
PinchPinch
ScrollScroll*

**SwiftUI scroll detection requires manual integration, please refer to the SwiftUI Integration docs.

SessionReplay.screenshotCapturingMode = .interactions
LCQSessionReplay.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.

ParameterDescription
intervalMsTime between captures in milliseconds
Default1000ms (1 screenshot per second)
Minimum500ms
// 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

ProfileCompressionUse Case
High50% quality (WebP)Detailed debugging, visual regression testing
Normal (Default)25% quality (WebP)Balanced quality and storage
Greyscale25% 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 size
LCQSessionReplay.screenshotQualityMode = LCQScreenshotQualityHigh;      // Best visual quality
LCQSessionReplay.screenshotQualityMode = LCQScreenshotQualityNormal;    // Balanced (default)
LCQSessionReplay.screenshotQualityMode = LCQScreenshotQualityGreyscale; // Smallest file size

Estimated Screenshots per Session

Based on the default 1MB session screenshot limit:

Quality ProfileApprox. 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:

SettingWhen Applied
Capturing ModeNext session
Screenshot QualityNext screenshot
Capture IntervalAfter current interval completes
// Change quality mid-session
SessionReplay.screenshotQualityMode = .high

// Switch capturing mode (applies next session)
SessionReplay.screenshotCapturingMode = .frequency

SwiftUI 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_privateView modifier are automatically masked
// SwiftUI - Mark a view as private
Text("Sensitive Data")
    .luciq_privateView()

// UIKit - Mark a view as private
sensitiveView.luciq_privateView = true

For more information on privacy controls, see Session Replay Privacy Options.


Best Practices

Recommended Configurations

Use CaseConfiguration
General debuggingNavigation mode + Normal quality
UI/UX analysisInteractions mode + Normal quality
Full video replayFrequency mode (1000ms) + Normal quality
Visual debuggingFrequency mode (500ms) + High quality
Storage-consciousNavigation mode + Greyscale quality

Code Examples

Video-like Replay (Balanced)

SessionReplay.screenshotCapturingMode = .frequency
SessionReplay.screenshotCaptureInterval = 1000
SessionReplay.screenshotQualityMode = .normal

Interaction-Focused Debugging

SessionReplay.screenshotCapturingMode = .interactions
SessionReplay.screenshotQualityMode = .normal

Maximum Visual Fidelity

SessionReplay.screenshotCapturingMode = .frequency
SessionReplay.screenshotCaptureInterval = 500
SessionReplay.screenshotQualityMode = .high

Storage-Optimized

SessionReplay.screenshotCapturingMode = .navigation
SessionReplay.screenshotQualityMode = .greyscale

API Reference

SessionReplay.screenshotCapturingMode

Sets when screenshots are captured.

SessionReplay.screenshotCapturingMode: ScreenshotCapturingMode
ValueDescription
.navigationCapture on-screen changes only (default)
.interactionsCapture navigation and user interactions
.frequencyCapture at fixed time intervals

SessionReplay.screenshotQualityMode

Sets the visual quality of captured screenshots.

SessionReplay.screenshotQualityMode: ScreenshotQualityMode
ValueDescription
.high50% WebP compression
.normal25% WebP compression (default)
.greyscaleGrayscale + 25% WebP compression

SessionReplay.screenshotCaptureInterval

Sets the capture interval for Frequency mode.

SessionReplay.screenshotCaptureInterval: Int
ParameterDescription
intervalMsInterval 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