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

Đang mở Phù hợp với người mới
#6,996 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
76/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
ios, objective-c, react-native, typescript
Lĩnh vực
backend-api-design, mobile

Hướng nghiên cứu

Bắt đầu từ RNSentryStart.m và kiểm tra điều kiện bảo vệ khởi tạo replay được mô tả trong issue; sau đó đọc RNSentryReplay postInit để xác nhận nó đăng ký những gì. Bản sửa được báo cáo là gọi postInit bất cứ khi nào replay được hỗ trợ, kể cả khi cả hai tỷ lệ lấy mẫu đều bằng không. Hoàn thành khi replay thủ công vẫn giữ nguyên hành vi của Sentry.Unmask và Sentry.Mask trên iOS với các cài đặt đó.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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.

Ngôn ngữ chính
TypeScript
Star
1.8k
Fork
373
Merge trung bình
1 ngày 7 giờ
Pull request đã merge (30 ngày)
105

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của getsentry/sentry-react-native

Tất cả issue của getsentry/sentry-react-native

Issue tương tự

Thêm issue về TypeScript

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.