Skip to content

Commit c423847

Browse files
antoniskrystofwoldrich
authored andcommitted
feat(replay): add enableExperimentalViewRenderer and enableFastViewRendering for iOS (#4660)
1 parent 6e5d53d commit c423847

File tree

5 files changed

+131
-1
lines changed

5 files changed

+131
-1
lines changed

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@
1212

1313
- Add thread information to spans ([#4579](https://github.com/getsentry/sentry-react-native/pull/4579))
1414
- Exposed `getDataFromUri` as a public API to retrieve data from a URI ([#4638](https://github.com/getsentry/sentry-react-native/pull/4638))
15+
- Add experimental flags `enableExperimentalViewRenderer` and `enableFastViewRendering` to enable up to 5x times more performance in Session Replay on iOS ([#4660](https://github.com/getsentry/sentry-react-native/pull/4660))
16+
17+
```js
18+
import * as Sentry from '@sentry/react-native';
19+
20+
Sentry.init({
21+
integrations: [
22+
Sentry.mobileReplayIntegration({
23+
enableExperimentalViewRenderer: true,
24+
enableFastViewRendering: true,
25+
}),
26+
],
27+
});
28+
```
1529

1630
### Fixes
1731

packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ final class RNSentryReplayOptions: XCTestCase {
4848
}
4949

5050
func assertAllDefaultReplayOptionsAreNotNil(replayOptions: [String: Any]) {
51-
XCTAssertEqual(replayOptions.count, 6)
51+
XCTAssertEqual(replayOptions.count, 8)
5252
XCTAssertNotNil(replayOptions["sessionSampleRate"])
5353
XCTAssertNotNil(replayOptions["errorSampleRate"])
5454
XCTAssertNotNil(replayOptions["maskAllImages"])
5555
XCTAssertNotNil(replayOptions["maskAllText"])
5656
XCTAssertNotNil(replayOptions["maskedViewClasses"])
5757
XCTAssertNotNil(replayOptions["sdkInfo"])
58+
XCTAssertNotNil(replayOptions["enableExperimentalViewRenderer"])
59+
XCTAssertNotNil(replayOptions["enableFastViewRendering"])
5860
}
5961

6062
func testSessionSampleRate() {
@@ -164,5 +166,87 @@ final class RNSentryReplayOptions: XCTestCase {
164166
XCTAssertEqual(actualOptions.sessionReplay.maskAllText, false)
165167
XCTAssertEqual(actualOptions.sessionReplay.maskedViewClasses.count, 0)
166168
}
169+
170+
func testEnableExperimentalViewRendererDefault() {
171+
let optionsDict = ([
172+
"dsn": "https://abc@def.ingest.sentry.io/1234567",
173+
"replaysOnErrorSampleRate": 0.75
174+
] as NSDictionary).mutableCopy() as! NSMutableDictionary
175+
176+
RNSentryReplay.updateOptions(optionsDict)
177+
178+
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
179+
180+
XCTAssertFalse(actualOptions.sessionReplay.enableExperimentalViewRenderer)
181+
}
182+
183+
func testEnableExperimentalViewRendererTrue() {
184+
let optionsDict = ([
185+
"dsn": "https://abc@def.ingest.sentry.io/1234567",
186+
"replaysOnErrorSampleRate": 0.75,
187+
"mobileReplayOptions": [ "enableExperimentalViewRenderer": true ]
188+
] as NSDictionary).mutableCopy() as! NSMutableDictionary
189+
190+
RNSentryReplay.updateOptions(optionsDict)
191+
192+
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
193+
194+
XCTAssertTrue(actualOptions.sessionReplay.enableExperimentalViewRenderer)
195+
}
196+
197+
func testEnableExperimentalViewRendererFalse() {
198+
let optionsDict = ([
199+
"dsn": "https://abc@def.ingest.sentry.io/1234567",
200+
"replaysOnErrorSampleRate": 0.75,
201+
"mobileReplayOptions": [ "enableExperimentalViewRenderer": false ]
202+
] as NSDictionary).mutableCopy() as! NSMutableDictionary
203+
204+
RNSentryReplay.updateOptions(optionsDict)
205+
206+
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
207+
208+
XCTAssertFalse(actualOptions.sessionReplay.enableExperimentalViewRenderer)
209+
}
210+
211+
func testEnableFastViewRenderingDefault() {
212+
let optionsDict = ([
213+
"dsn": "https://abc@def.ingest.sentry.io/1234567",
214+
"replaysOnErrorSampleRate": 0.75
215+
] as NSDictionary).mutableCopy() as! NSMutableDictionary
216+
217+
RNSentryReplay.updateOptions(optionsDict)
218+
219+
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
220+
221+
XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering)
222+
}
223+
224+
func testEnableFastViewRenderingTrue() {
225+
let optionsDict = ([
226+
"dsn": "https://abc@def.ingest.sentry.io/1234567",
227+
"replaysOnErrorSampleRate": 0.75,
228+
"mobileReplayOptions": [ "enableFastViewRendering": true ]
229+
] as NSDictionary).mutableCopy() as! NSMutableDictionary
230+
231+
RNSentryReplay.updateOptions(optionsDict)
232+
233+
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
234+
235+
XCTAssertTrue(actualOptions.sessionReplay.enableFastViewRendering)
236+
}
237+
238+
func testEnableFastViewRenderingFalse() {
239+
let optionsDict = ([
240+
"dsn": "https://abc@def.ingest.sentry.io/1234567",
241+
"replaysOnErrorSampleRate": 0.75,
242+
"mobileReplayOptions": [ "enableFastViewRendering": false ]
243+
] as NSDictionary).mutableCopy() as! NSMutableDictionary
244+
245+
RNSentryReplay.updateOptions(optionsDict)
246+
247+
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
248+
249+
XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering)
250+
}
167251

168252
}

packages/core/ios/RNSentryReplay.mm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ + (void)updateOptions:(NSMutableDictionary *)options
2727
@"errorSampleRate" : options[@"replaysOnErrorSampleRate"] ?: [NSNull null],
2828
@"maskAllImages" : replayOptions[@"maskAllImages"] ?: [NSNull null],
2929
@"maskAllText" : replayOptions[@"maskAllText"] ?: [NSNull null],
30+
@"enableExperimentalViewRenderer" : replayOptions[@"enableExperimentalViewRenderer"]
31+
?: [NSNull null],
32+
@"enableFastViewRendering" : replayOptions[@"enableFastViewRendering"] ?: [NSNull null],
3033
@"maskedViewClasses" : [RNSentryReplay getReplayRNRedactClasses:replayOptions],
3134
@"sdkInfo" :
3235
@ { @"name" : REACT_NATIVE_SDK_NAME, @"version" : REACT_NATIVE_SDK_PACKAGE_VERSION }

packages/core/src/js/replay/mobilereplay.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,39 @@ export interface MobileReplayOptions {
3131
* @default true
3232
*/
3333
maskAllVectors?: boolean;
34+
35+
/**
36+
* Enables the up to 5x faster experimental view renderer used by the Session Replay integration on iOS.
37+
*
38+
* Enabling this flag will reduce the amount of time it takes to render each frame of the session replay on the main thread, therefore reducing
39+
* interruptions and visual lag.
40+
*
41+
* - Experiment: This is an experimental feature and is therefore disabled by default.
42+
*
43+
* @default false
44+
*/
45+
enableExperimentalViewRenderer?: boolean;
46+
47+
/**
48+
* Enables up to 5x faster but incomplete view rendering used by the Session Replay integration on iOS.
49+
*
50+
* Enabling this flag will reduce the amount of time it takes to render each frame of the session replay on the main thread, therefore reducing
51+
* interruptions and visual lag.
52+
*
53+
* - Note: This flag can only be used together with `enableExperimentalViewRenderer` with up to 20% faster render times.
54+
* - Experiment: This is an experimental feature and is therefore disabled by default.
55+
*
56+
* @default false
57+
*/
58+
enableFastViewRendering?: boolean;
3459
}
3560

3661
const defaultOptions: Required<MobileReplayOptions> = {
3762
maskAllText: true,
3863
maskAllImages: true,
3964
maskAllVectors: true,
65+
enableExperimentalViewRenderer: false,
66+
enableFastViewRendering: false,
4067
};
4168

4269
type MobileReplayIntegration = Integration & {

samples/react-native/src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ Sentry.init({
9696
maskAllImages: true,
9797
maskAllVectors: true,
9898
maskAllText: true,
99+
enableExperimentalViewRenderer: true,
100+
enableFastViewRendering: true,
99101
}),
100102
Sentry.appStartIntegration({
101103
standalone: false,

0 commit comments

Comments
 (0)