iOS: `Sentry.Unmask` / `Sentry.Mask` ignored when replay is started manually with both sample rates at 0

未关闭 适合新手
#6,996 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
76/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
ios, objective-c, react-native, typescript

调研方向

从RNSentryStart.m开始,检查 issue 中描述的 replay 初始化保护条件;然后阅读RNSentryReplay postInit,确认它注册了什么。报告中的修复方案是:只要支持 replay,就调用postInit,即使两个采样率都为零也是如此。在这些设置下,iOS 上的手动 replay 保持Sentry.Unmask和Sentry.Mask的行为,即为完成。

由索引模型根据 Issue 内容生成。

描述

React-Native
What React Native libraries do you use?

Expo (SDK 57, CNG / expo prebuild), Expo Router, React Native 0.86 (New Architecture), Hermes.

Are you using sentry.io or on-premise?

sentry.io (SaaS, EU region)

@sentry/react-native SDK Version

8.33.0 (sentry-cocoa 9.32.0). The same condition is still present in 8.34.0 and on main.

How does your development environment look like?
@sentry/react-native  8.33.0
sentry-cocoa          9.32.0 (prebuilt xcframework)
react-native          0.86.3, New Architecture enabled
expo                  57
iOS                   TestFlight build, iPhone
Sentry.init()
Sentry.init({
  dsn: '...',
  sendDefaultPii: false,
  // Replay is only recorded on one screen, started and stopped manually
  // (Sentry.getReplay().start() / stop(), available since 8.27).
  replaysSessionSampleRate: 0,
  replaysOnErrorSampleRate: 0,
  integrations: [
    Sentry.mobileReplayIntegration({
      maskAllText: true,
      maskAllImages: true,
      maskAllVectors: true,
    }),
  ],
});

// Later, on the screen we want to record (with user consent):
Sentry.getReplay()?.start();
Steps to Reproduce
  1. Initialize the SDK with replaysSessionSampleRate: 0 and replaysOnErrorSampleRate: 0, and mobileReplayIntegration({ maskAllText: true }).
  2. Wrap a static label in <Sentry.Unmask><Text>Continue</Text></Sentry.Unmask>.
  3. Start the replay manually with Sentry.getReplay().start() and navigate the screen.
  4. Open the replay in Sentry.
Expected Result

The Text wrapped in Sentry.Unmask is visible in the replay, as it is on Android and as it is on iOS when a sample rate is positive. Sentry.Mask masks its subtree.

Actual Result

On iOS, the whole replay is masked: Sentry.Unmask has no effect (and Sentry.Mask is not registered either). Android is fine.

Cause

RNSentryStart.m only registers the replay container classes when a sample rate is positive:

[SentrySDK startWithOptions:options];

#if SENTRY_TARGET_REPLAY_SUPPORTED
    if (options.sessionReplay.sessionSampleRate > 0
        || options.sessionReplay.onErrorSampleRate > 0) {
        [RNSentryReplay postInit];
    }
#endif

+[RNSentryReplay postInit] is what calls setReplayRedactContainerClass: (RNSentryReplayMask), setReplayIgnoreContainerClass: (RNSentryReplayUnmask) and configures the RN breadcrumb converter. Since 8.27, a replay can be started manually with both rates at 0, and sentry-cocoa 9.32.0 always installs SentrySessionReplayIntegration on iOS, whatever the rates. The replay therefore records, but without the container classes: Unmask is ignored, Mask is not applied as a container, and replay breadcrumbs go through the default converter instead of RNSentryReplayBreadcrumbConverter.

Raising a rate is not a workaround for us: it would record (or buffer) replays outside the screen the user consented to, without the on-screen recording indicator we show (App Store Review Guideline 2.5.14).

Suggested fix

Call postInit whenever the replay is supported, regardless of the sample rates:

#if SENTRY_TARGET_REPLAY_SUPPORTED
    [RNSentryReplay postInit];
#endif

postInit does not start any recording: it only registers the two container classes and the breadcrumb converter on the installed integration (SentryInternalReplayApi calls are no-ops if the integration is missing). We apply exactly this change at prebuild time as a local workaround.

主要语言
TypeScript
星标
1.8k
派生
373
平均合并
1 天 7 小时
30 天内合并 PR
105

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

getsentry/sentry-react-native 的其他 Issue

查看 getsentry/sentry-react-native 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。