Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@

## Unreleased

### Internal

- Migrate iOS code from the deprecated `PrivateSentrySDKOnly` SPI (and `SentrySwizzle.h` macro) to the new `SentrySDK.internal` Swift API exposed by sentry-cocoa 9.19.0, via a thin in-pod ObjCโ†”Swift bridge ([#6370](https://github.com/getsentry/sentry-react-native/issues/6370))

## 8.16.0

### Features

- Capture errors that hit Expo Router's per-route `ErrorBoundary` ([#6318](https://github.com/getsentry/sentry-react-native/pull/6318))
Expand Down
3 changes: 2 additions & 1 deletion packages/core/RNSentry.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ Pod::Spec.new do |s|

s.preserve_paths = '*.js'

s.source_files = 'ios/**/*.{h,m,mm}'
s.source_files = 'ios/**/*.{h,m,mm,swift}'
s.swift_versions = ['5.5']
s.public_header_files = 'ios/RNSentry.h', 'ios/RNSentrySDK.h', 'ios/RNSentryStart.h', 'ios/RNSentryVersion.h', 'ios/RNSentryBreadcrumb.h', 'ios/RNSentryReplay.h', 'ios/RNSentryReplayBreadcrumbConverter.h', 'ios/Replay/RNSentryReplayMask.h', 'ios/Replay/RNSentryReplayUnmask.h', 'ios/RNSentryTimeToDisplay.h'

s.compiler_flags = other_cflags
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ final class RNSentryReplayOptions: XCTestCase {
] as NSDictionary).mutableCopy() as! NSMutableDictionary
RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])
XCTAssertEqual(actualOptions.sessionReplay.sessionSampleRate, 0.75)
}

Expand All @@ -80,7 +80,7 @@ final class RNSentryReplayOptions: XCTestCase {
] as NSDictionary).mutableCopy() as! NSMutableDictionary
RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])
XCTAssertEqual(actualOptions.sessionReplay.onErrorSampleRate, 0.75)
}

Expand Down Expand Up @@ -110,7 +110,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertEqual(actualOptions.sessionReplay.maskAllImages, true)
assertContainsClass(classArray: actualOptions.sessionReplay.maskedViewClasses, stringClass: "RCTImageView")
Expand All @@ -125,7 +125,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertEqual(actualOptions.sessionReplay.maskAllImages, false)
XCTAssertEqual(actualOptions.sessionReplay.maskedViewClasses.count, 0)
Expand All @@ -140,7 +140,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertEqual(actualOptions.sessionReplay.maskAllText, true)
assertContainsClass(classArray: actualOptions.sessionReplay.maskedViewClasses, stringClass: "RCTTextView")
Expand All @@ -167,7 +167,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertEqual(actualOptions.sessionReplay.maskAllText, false)
XCTAssertEqual(actualOptions.sessionReplay.maskedViewClasses.count, 0)
Expand All @@ -181,7 +181,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertTrue(actualOptions.sessionReplay.enableViewRendererV2)
}
Expand All @@ -195,7 +195,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertTrue(actualOptions.sessionReplay.enableViewRendererV2)
}
Expand All @@ -209,7 +209,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertFalse(actualOptions.sessionReplay.enableViewRendererV2)
}
Expand All @@ -222,7 +222,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering)
}
Expand All @@ -236,7 +236,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertTrue(actualOptions.sessionReplay.enableFastViewRendering)
}
Expand All @@ -250,7 +250,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering)
}
Expand All @@ -263,7 +263,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.medium)
}
Expand All @@ -277,7 +277,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.low)
}
Expand All @@ -291,7 +291,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.medium)
}
Expand All @@ -305,7 +305,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.high)
}
Expand All @@ -319,7 +319,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.medium)
}
Expand All @@ -333,7 +333,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

let includedViewClasses = actualOptions.sessionReplay.includedViewClasses
XCTAssertEqual(includedViewClasses.count, 3)
Expand All @@ -351,7 +351,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

let excludedViewClasses = actualOptions.sessionReplay.excludedViewClasses
XCTAssertEqual(excludedViewClasses.count, 3)
Expand All @@ -372,7 +372,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any])
let actualOptions = try! SentrySDK.internal.options(fromDictionary: optionsDict as! [String: Any])

let includedViewClasses = actualOptions.sessionReplay.includedViewClasses
XCTAssertEqual(includedViewClasses.count, 2)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import Sentry
import XCTest

final class RNSentryStartFromFileTests: XCTestCase {
Expand All @@ -11,7 +12,7 @@ final class RNSentryStartFromFileTests: XCTestCase {

XCTAssertTrue(wasConfigurationCalled)

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options
XCTAssertNil(actualOptions.dsn)
XCTAssertNil(actualOptions.parsedDsn)
}
Expand All @@ -25,7 +26,7 @@ final class RNSentryStartFromFileTests: XCTestCase {

XCTAssertTrue(wasConfigurationCalled)

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options
XCTAssertNil(actualOptions.dsn)
XCTAssertNil(actualOptions.parsedDsn)
}
Expand All @@ -39,7 +40,7 @@ final class RNSentryStartFromFileTests: XCTestCase {

XCTAssertTrue(wasConfigurationCalled)

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options
XCTAssertNil(actualOptions.dsn)
XCTAssertNotNil(actualOptions.parsedDsn)
XCTAssertEqual(actualOptions.environment, "environment-from-invalid-file")
Expand All @@ -54,7 +55,7 @@ final class RNSentryStartFromFileTests: XCTestCase {

XCTAssertTrue(wasConfigurationCalled)

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options
XCTAssertNil(actualOptions.dsn)
XCTAssertNotNil(actualOptions.parsedDsn)
XCTAssertEqual(actualOptions.environment, "environment-from-valid-file")
Expand All @@ -76,7 +77,7 @@ final class RNSentryStartFromFileTests: XCTestCase {
options.environment = "new-environment"
}

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options
XCTAssertEqual(actualOptions.environment, "new-environment")
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import Sentry
import XCTest

final class RNSentryStartTests: XCTestCase {
Expand Down Expand Up @@ -29,7 +30,7 @@ final class RNSentryStartTests: XCTestCase {
"dsn": "https://abcd@efgh.ingest.sentry.io/123456"
])

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options
assertReactDefaults(actualOptions)
}

Expand Down Expand Up @@ -63,10 +64,10 @@ final class RNSentryStartTests: XCTestCase {
for startMethod in testCases {
try startMethod()

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options

XCTAssertTrue(PrivateSentrySDKOnly.appStartMeasurementHybridSDKMode)
XCTAssertTrue(PrivateSentrySDKOnly.framesTrackingMeasurementHybridSDKMode)
XCTAssertTrue(SentrySDK.internal.appStart.hybridSDKMode)
XCTAssertTrue(SentrySDK.internal.performance.framesTrackingHybridSDKMode)
}
}

Expand All @@ -89,10 +90,10 @@ final class RNSentryStartTests: XCTestCase {
for startMethod in testCases {
try startMethod()

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options

XCTAssertFalse(PrivateSentrySDKOnly.appStartMeasurementHybridSDKMode)
XCTAssertFalse(PrivateSentrySDKOnly.framesTrackingMeasurementHybridSDKMode)
XCTAssertFalse(SentrySDK.internal.appStart.hybridSDKMode)
XCTAssertFalse(SentrySDK.internal.performance.framesTrackingHybridSDKMode)
}
}

Expand All @@ -113,7 +114,7 @@ final class RNSentryStartTests: XCTestCase {
for startMethod in testCases {
try startMethod()

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options

let actualEvent = actualOptions.beforeSend!(createUnhandledJsExceptionEvent())

Expand All @@ -138,7 +139,7 @@ final class RNSentryStartTests: XCTestCase {
for startMethod in testCases {
try startMethod()

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options

let actualEvent = actualOptions.beforeSend!(createNativeEvent())

Expand All @@ -160,7 +161,7 @@ final class RNSentryStartTests: XCTestCase {
}
}

PrivateSentrySDKOnly.options.beforeSend!(genericEvent())
SentrySDK.internal.options.beforeSend!(genericEvent())

XCTAssertTrue(executed)
}
Expand Down Expand Up @@ -207,7 +208,7 @@ final class RNSentryStartTests: XCTestCase {
]
])

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options
XCTAssertTrue(actualOptions.attachScreenshot)
XCTAssertFalse(actualOptions.screenshot.maskAllText)
XCTAssertTrue(actualOptions.screenshot.maskAllImages)
Expand All @@ -219,7 +220,7 @@ final class RNSentryStartTests: XCTestCase {
"attachScreenshot": true
])

let actualOptions = PrivateSentrySDKOnly.options
let actualOptions = SentrySDK.internal.options
XCTAssertTrue(actualOptions.attachScreenshot)
XCTAssertTrue(actualOptions.screenshot.maskAllText)
XCTAssertTrue(actualOptions.screenshot.maskAllImages)
Expand Down Expand Up @@ -258,8 +259,8 @@ final class RNSentryStartTests: XCTestCase {
var actualEvent: Event?

// This is the closest to the sent event we can get using the actual Sentry start method
let originalBeforeSend = PrivateSentrySDKOnly.options.beforeSend
PrivateSentrySDKOnly.options.beforeSend = { event in
let originalBeforeSend = SentrySDK.internal.options.beforeSend
SentrySDK.internal.options.beforeSend = { event in
if let originalBeforeSend = originalBeforeSend {
let processedEvent = originalBeforeSend(event)
actualEvent = processedEvent
Expand Down
12 changes: 11 additions & 1 deletion packages/core/ios/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,15 @@ RCT_EXPORT_METHOD(nativeOperation:(NSString *)param
2. Edit `RNSentry.podspec` to remove version constraint
3. Add local pod to sample's Podfile:
```ruby
pod 'Sentry/HybridSDK', :path => '../../../../sentry-cocoa'
pod 'Sentry', :path => '../../../../sentry-cocoa'
```

## Internal API access (`SentrySDK.internal`)

RNSentry consumes sentry-cocoa's hybrid-SDK surface (`SentrySDK.internal.*`)
through a Swift bridge in `RNSentryInternal.swift`. The bridge imports Sentry
with `@_spi(Private)` because several sub-APIs (`performance.currentScreenFrames`,
`replay.configure`, `envelope.{store,capture,deserialize}`) are SPI-gated.
`.m`/`.mm` callers import the auto-generated `RNSentry-Swift.h` and route
through `[RNSentryInternal โ€ฆ]` instead of touching `PrivateSentrySDKOnly`
(deprecated since cocoa 9.19.0 and slated for removal in the next major).
1 change: 0 additions & 1 deletion packages/core/ios/RNSentry+fetchNativeStack.m
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#import "RNSentryBreadcrumb.h"
#import "RNSentryHexFormatter.h"
#import "RNSentryId.h"
#import <Sentry/PrivateSentrySDKOnly.h>
@import Sentry;

// This method was moved to a new category so we can use `@import Sentry` to use Sentry's Swift
Expand Down
Loading
Loading