Skip to content

fix: Avoid NSNull RCTConvert warning when clearing scope context - #6651

Open
antonis wants to merge 3 commits into
mainfrom
antonis/fix/rn-750-nsnull-context-warning
Open

fix: Avoid NSNull RCTConvert warning when clearing scope context#6651
antonis wants to merge 3 commits into
mainfrom
antonis/fix/rn-750-nsnull-context-warning

Conversation

@antonis

@antonis antonis commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

📢 Type of change

  • Bugfix
  • New feature
  • Enhancement
  • Refactoring

📜 Description

On the New Architecture, clearing a scope context forwarded null through the native setContext(key, null) method. RN's TurboModule interop (ObjCTurboModule::invokeObjCMethod) runs RCTConvert on each argument by its declared ObjC type before the native method runs, so the (nullable) NSDictionary parameter logged this on every init/reload:

JSON value '<null>' of type NSNull cannot be converted to NSDictionary

This PR adds a dedicated native removeContext(key) method and routes context clears through it, so null never crosses the bridge:

  • JS (wrapper.ts): NATIVE.setContext(key, null) now calls RNSentry.removeContext(key), with a typeof … === 'function' guard that falls back to the legacy setContext(key, null) path when the native binary predates the method (JS-updated-without-rebuild).
  • iOS (RNSentry.mm): removeContext[scope removeContextForKey:key] — the same call the existing setContext(nil) path already made.
  • Android (RNSentryModuleImpl + new/old arch modules): removeContextscope.removeContexts(key) — likewise identical to the existing setContext(null) path.
  • Scope-sync guard (turboModuleContext.ts): removeContext added to RNSENTRY_SKIP so the tracker never wraps it — required to preserve the existing no-recursion invariant (the internal turbo_module context clear goes through this method).
  • setTag hardening: non-string values are coerced to a string (JSON.stringify(value) ?? 'undefined'), avoiding the analogous … cannot be converted to NSString warning when a tag value is undefined. Mirrors setExtra.

The native removeContext is behavior-identical to the existing setContext(null) native paths — it's a new entry point, not new native behavior. No public API change (internal NativeRNSentry Spec only; not in the API report).

💡 Motivation and Context

A bare Sentry.init({ dsn }) on iOS with the New Architecture logged the warning above on every init and reload. Even though the parameter is nullable, RN's interop layer warns during argument conversion.

Fixes #6645

💚 How did you test it?

  • Empirical before/after on the iOS sim (iPhone 16 Pro, New Arch, Hermes) with a bare Sentry.init({ dsn }): warnings pre-fix → post-fix.
  • iOS + Android compile verified (Android: both newarch and oldarch source sets).
  • Added unit tests: setContext(key, null) calls removeContext; stale-binary fallback to setContext(key, null); setTag string/undefined/number coercion. 130 tests pass; lint clean.

📝 Checklist

  • I added tests to verify changes.
  • No new PII added or SDK only sends newly added PII if sendDefaultPII is enabled.
  • I updated the docs if needed.
  • I updated the wizard if needed.
  • All tests passing.
  • Public API changes reviewed by another Mobile SDK team member or implemented according to the develop docs spec.
  • No breaking changes.

🔮 Next steps

  • Replace the #XXXX CHANGELOG placeholder with this PR number.

🤖 Generated with Claude Code

On the New Architecture, clearing a scope context forwarded `null` through
`setContext(key, null)`. RN's TurboModule interop runs `RCTConvert` on each
argument by its declared ObjC type before the native method runs, so the
nullable `NSDictionary` parameter logged `JSON value '<null>' of type NSNull
cannot be converted to NSDictionary` on every init/reload.

Add a dedicated native `removeContext` method (iOS + Android, old and new
arch) and route context clears through it so `null` never crosses the bridge.
Falls back to the legacy `setContext(key, null)` path when the native binary
predates the method. Also coerce non-string `setTag` values to a string to
avoid the analogous NSString warning.

Fixes #6645

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@linear-code

linear-code Bot commented Sep 1, 2026

Copy link
Copy Markdown

RN-750

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

None (no version bump detected)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


  • fix: Avoid NSNull RCTConvert warning when clearing scope context by antonis in #6651
  • chore(deps): update Maestro to v2.10.0 by github-actions in #6641
  • chore(deps): update JavaScript SDK to v10.73.0 by github-actions in #6642
  • test(ios): Speed up sentry-xcode-scripts tests by antonis in #6633
  • fix: Update recommended vscode extensions by antonis in #6640
  • chore(deps): bump actions/setup-java from 5.7.0 to 6.0.0 by dependabot in #6636
  • chore(deps): bump the codeql-action group with 3 updates by dependabot in #6635
  • chore(deps): update JavaScript SDK to v10.72.0 by github-actions in #6634
  • chore(e2e): Bump E2E tests to React Native 0.87.0 by antonis in #6616
  • chore(deps): update CLI to v3.7.0 by github-actions in #6632
  • feat(tracing): Copy app start vitals onto standalone children by buenaflor in #6631
  • chore(deps): update Cocoa SDK to v9.26.1 by github-actions in #6623
  • fix(ios): Force-load the Sentry static archive to keep ObjC category methods by antonis in #6615
  • feat(core): Forward feature flag evaluations to the native SDKs by antonis in #6613
  • chore(deps): update Android SDK to v8.54.0 by github-actions in #6624
  • chore(deps): update Sentry Android Gradle Plugin to v6.20.0 by github-actions in #6627

🤖 This preview updates automatically when you update the PR.

@antonis antonis added the ready-to-merge Triggers the full CI test suite label Sep 1, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit be8efcf. Configure here.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@sentry

sentry Bot commented Sep 1, 2026

Copy link
Copy Markdown

📲 Install Builds

Android

🔗 App Name App ID Version Configuration
Sentry RN io.sentry.reactnative.sample 8.24.0 (104) Release

⚙️ sentry-react-native Build Distribution Settings

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

iOS (legacy) Performance metrics 🚀

  Plain With Sentry Diff
Startup time 3825.78 ms 1219.52 ms -2606.26 ms
Size 5.08 MiB 6.80 MiB 1.72 MiB

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
ecf47a2+dirty 3835.20 ms 1222.43 ms -2612.77 ms
3817909+dirty 1183.90 ms 1187.50 ms 3.60 ms
5ee78d6+dirty 3847.52 ms 1224.27 ms -2623.25 ms
890d145+dirty 1223.59 ms 1231.37 ms 7.78 ms
e763471+dirty 3841.16 ms 1218.06 ms -2623.09 ms
3d31fcf+dirty 3838.09 ms 1223.46 ms -2614.63 ms
9210ae6+dirty 3815.93 ms 1214.14 ms -2601.79 ms
26843eb+dirty 3861.60 ms 1238.77 ms -2622.82 ms
7a89652+dirty 3861.46 ms 1229.61 ms -2631.85 ms
9ad4522+dirty 3850.40 ms 1222.40 ms -2628.00 ms

App size

Revision Plain With Sentry Diff
ecf47a2+dirty 4.98 MiB 6.46 MiB 1.49 MiB
3817909+dirty 3.38 MiB 4.73 MiB 1.35 MiB
5ee78d6+dirty 5.15 MiB 6.69 MiB 1.53 MiB
890d145+dirty 3.38 MiB 4.77 MiB 1.38 MiB
e763471+dirty 4.98 MiB 6.51 MiB 1.53 MiB
3d31fcf+dirty 4.98 MiB 6.56 MiB 1.58 MiB
9210ae6+dirty 5.15 MiB 6.68 MiB 1.53 MiB
26843eb+dirty 4.98 MiB 6.53 MiB 1.55 MiB
7a89652+dirty 5.15 MiB 6.70 MiB 1.55 MiB
9ad4522+dirty 4.98 MiB 6.56 MiB 1.58 MiB

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

iOS (new) Performance metrics 🚀

  Plain With Sentry Diff
Startup time 3846.89 ms 1214.04 ms -2632.85 ms
Size 5.08 MiB 6.80 MiB 1.72 MiB

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
3b6e9f9+dirty 3822.77 ms 1208.00 ms -2614.77 ms
5a23c47+dirty 3843.54 ms 1226.05 ms -2617.50 ms
100ce80+dirty 3843.57 ms 1226.46 ms -2617.12 ms
0bd8916+dirty 3816.17 ms 1215.05 ms -2601.12 ms
a0d8cf8+dirty 3826.15 ms 1213.12 ms -2613.03 ms
0a9e622+dirty 3825.35 ms 1219.04 ms -2606.31 ms
21a1e70+dirty 3826.22 ms 1217.74 ms -2608.47 ms
9ad4522+dirty 3862.28 ms 1226.27 ms -2636.01 ms
88735e9+dirty 3837.80 ms 1216.39 ms -2621.41 ms
d0e3b3e+dirty 3846.64 ms 1226.27 ms -2620.38 ms

App size

Revision Plain With Sentry Diff
3b6e9f9+dirty 5.15 MiB 6.68 MiB 1.53 MiB
5a23c47+dirty 4.98 MiB 6.46 MiB 1.49 MiB
100ce80+dirty 5.15 MiB 6.67 MiB 1.51 MiB
0bd8916+dirty 5.15 MiB 6.69 MiB 1.53 MiB
a0d8cf8+dirty 5.15 MiB 6.67 MiB 1.51 MiB
0a9e622+dirty 4.98 MiB 6.51 MiB 1.53 MiB
21a1e70+dirty 4.98 MiB 6.46 MiB 1.49 MiB
9ad4522+dirty 4.98 MiB 6.56 MiB 1.58 MiB
88735e9+dirty 4.98 MiB 6.46 MiB 1.49 MiB
d0e3b3e+dirty 4.98 MiB 6.51 MiB 1.53 MiB

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Android (new) Performance metrics 🚀

  Plain With Sentry Diff
Startup time 444.27 ms 477.46 ms 33.19 ms
Size 49.74 MiB 55.66 MiB 5.91 MiB

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
15d4514+dirty 413.63 ms 449.62 ms 35.99 ms
26843eb+dirty 442.02 ms 506.29 ms 64.27 ms
ca9d079+dirty 460.67 ms 512.54 ms 51.87 ms
f9c1ed4+dirty 520.57 ms 594.84 ms 74.27 ms
a0d8cf8+dirty 533.71 ms 564.25 ms 30.54 ms
20fbd51+dirty 594.38 ms 655.35 ms 60.97 ms
0b0f006+dirty 446.31 ms 458.31 ms 12.00 ms
1d3572b+dirty 444.48 ms 478.42 ms 33.94 ms
4953e94+dirty 398.80 ms 431.81 ms 33.01 ms
4e0b819+dirty 599.31 ms 654.31 ms 55.00 ms

App size

Revision Plain With Sentry Diff
15d4514+dirty 48.30 MiB 53.60 MiB 5.30 MiB
26843eb+dirty 49.74 MiB 55.26 MiB 5.52 MiB
ca9d079+dirty 48.30 MiB 53.58 MiB 5.28 MiB
f9c1ed4+dirty 49.74 MiB 54.86 MiB 5.12 MiB
a0d8cf8+dirty 48.30 MiB 53.49 MiB 5.19 MiB
20fbd51+dirty 49.74 MiB 54.81 MiB 5.07 MiB
0b0f006+dirty 49.74 MiB 55.66 MiB 5.91 MiB
1d3572b+dirty 49.74 MiB 55.38 MiB 5.63 MiB
4953e94+dirty 43.94 MiB 48.94 MiB 5.00 MiB
4e0b819+dirty 49.74 MiB 54.81 MiB 5.07 MiB

@antonis
antonis marked this pull request as ready for review September 1, 2026 14:59
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Android (legacy) Performance metrics 🚀

  Plain With Sentry Diff
Startup time 438.90 ms 461.21 ms 22.31 ms
Size 49.74 MiB 55.66 MiB 5.91 MiB

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
0b5120f+dirty 503.22 ms 538.60 ms 35.38 ms
ad66da3+dirty 468.46 ms 533.56 ms 65.10 ms
8448c07+dirty 422.88 ms 471.22 ms 48.34 ms
9474ead+dirty 411.45 ms 446.80 ms 35.35 ms
890d145+dirty 504.54 ms 491.55 ms -12.99 ms
68ae91b+dirty 416.44 ms 477.56 ms 61.12 ms
3ce5254+dirty 410.57 ms 448.48 ms 37.91 ms
acd838e+dirty 422.63 ms 462.39 ms 39.76 ms
7d8c8bd+dirty 417.45 ms 462.10 ms 44.65 ms
a636fa4+dirty 486.70 ms 508.53 ms 21.83 ms

App size

Revision Plain With Sentry Diff
0b5120f+dirty 48.30 MiB 53.58 MiB 5.28 MiB
ad66da3+dirty 48.30 MiB 53.49 MiB 5.19 MiB
8448c07+dirty 49.74 MiB 55.37 MiB 5.63 MiB
9474ead+dirty 48.30 MiB 53.61 MiB 5.30 MiB
890d145+dirty 43.75 MiB 48.14 MiB 4.39 MiB
68ae91b+dirty 49.74 MiB 54.79 MiB 5.05 MiB
3ce5254+dirty 43.75 MiB 48.12 MiB 4.37 MiB
acd838e+dirty 48.30 MiB 53.60 MiB 5.30 MiB
7d8c8bd+dirty 48.30 MiB 53.54 MiB 5.23 MiB
a636fa4+dirty 49.74 MiB 55.36 MiB 5.62 MiB

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-merge Triggers the full CI test suite

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[iOS] JSON value '<null>' of type NSNull cannot be converted to NSDictionary

1 participant