Skip to content
Closed
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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
- Bump Bundler Plugins from v4.0.2 to v4.1.0 ([#5062](https://github.com/getsentry/sentry-react-native/pull/5062))
- [changelog](https://github.com/getsentry/sentry-javascript-bundler-plugins/blob/main/CHANGELOG.md#410)
- [diff](https://github.com/getsentry/sentry-javascript-bundler-plugins/compare/4.0.2...4.1.0)
- Bump Cocoa SDK from v8.53.2 to v8.54.0 ([#5036](https://github.com/getsentry/sentry-react-native/pull/5036))
- [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8540)
- [diff](https://github.com/getsentry/sentry-cocoa/compare/8.53.2...8.54.0)

## 6.19.0

Expand Down
2 changes: 1 addition & 1 deletion packages/core/RNSentry.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ Pod::Spec.new do |s|

s.compiler_flags = other_cflags

s.dependency 'Sentry/HybridSDK', '8.53.2'
s.dependency 'Sentry/HybridSDK', '8.54.1-alpha.2'

if defined? install_modules_dependencies
# Default React Native dependencies for 0.71 and above (new and legacy architecture)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,7 @@ final class RNSentryReplayOptions: XCTestCase {
] as NSDictionary).mutableCopy() as! NSMutableDictionary
RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif
XCTAssertEqual(actualOptions.sessionReplay.sessionSampleRate, 0.75)
}

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

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif
XCTAssertEqual(actualOptions.sessionReplay.onErrorSampleRate, 0.75)
}

Expand Down Expand Up @@ -116,11 +108,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

XCTAssertTrue(actualOptions.sessionReplay.enableFastViewRendering)
}
Expand All @@ -289,15 +245,11 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering)
}

func testReplayQualityDefault() {
let optionsDict = ([
"dsn": "https://[email protected]/1234567",
Expand All @@ -306,11 +258,7 @@ final class RNSentryReplayOptions: XCTestCase {

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

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

RNSentryReplay.updateOptions(optionsDict)

#if CROSS_PLATFORM_TEST
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
#else
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
#endif

XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.medium)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,8 @@

@class SentryOptions;

#if CROSS_PLATFORM_TEST
@interface
SentrySDKInternal (PrivateTests)
#else
@interface
SentrySDK (PrivateTests)
#endif

+ (nullable SentryOptions *)options;
@end
Original file line number Diff line number Diff line change
Expand Up @@ -465,13 +465,8 @@ - (void)prepareNativeFrameMocksWithLocalSymbolication:(BOOL)debug
SentryOptions *sentryOptions = [[SentryOptions alloc] init];
sentryOptions.debug = debug; // no local symbolication

#if CROSS_PLATFORM_TEST
id sentrySDKMock = OCMClassMock([SentrySDKInternal class]);
OCMStub([(Class)sentrySDKMock options]).andReturn(sentryOptions);
#else
id sentrySDKMock = OCMClassMock([SentrySDK class]);
OCMStub([(Class)sentrySDKMock options]).andReturn(sentryOptions);
#endif

id sentryDependencyContainerMock = OCMClassMock([SentryDependencyContainer class]);
OCMStub(ClassMethod([sentryDependencyContainerMock sharedInstance]))
Expand Down
5 changes: 0 additions & 5 deletions packages/core/ios/RNSentry.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,7 @@ typedef int (*SymbolicateCallbackType)(const void *, Dl_info *);
@class SentryOptions;
@class SentryEvent;

#if CROSS_PLATFORM_TEST
@interface SentrySDKInternal : NSObject
#else
@interface
SentrySDK (Private)
#endif
@property (nonatomic, nullable, readonly, class) SentryOptions *options;
@end

Expand Down
19 changes: 2 additions & 17 deletions packages/core/ios/RNSentry.mm
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,9 @@
#import <Sentry/SentryException.h>
#import <Sentry/SentryFormatter.h>
#import <Sentry/SentryOptions.h>
#import <Sentry/SentryUser.h>
#if __has_include(<Sentry/SentryOptions+HybridSDKs.h>)
# define USE_SENTRY_OPTIONS 1
# import <Sentry/SentryOptions+HybridSDKs.h>
#else
# define USE_SENTRY_OPTIONS 0
# import <Sentry/SentryOptionsInternal.h>
#endif
#import <Sentry/SentryOptionsInternal.h>
#import <Sentry/SentryScreenFrames.h>
#import <Sentry/SentryUser.h>

// This guard prevents importing Hermes in JSC apps
#if SENTRY_PROFILING_ENABLED
Expand Down Expand Up @@ -169,13 +163,8 @@ - (SentryOptions *_Nullable)createOptionsWithDictionary:(NSDictionary *_Nonnull)
[RNSentryReplay updateOptions:mutableOptions];
#endif

#if USE_SENTRY_OPTIONS
SentryOptions *sentryOptions = [[SentryOptions alloc] initWithDict:mutableOptions
didFailWithError:errorPointer];
#else
SentryOptions *sentryOptions = [SentryOptionsInternal initWithDict:mutableOptions
didFailWithError:errorPointer];
#endif
if (*errorPointer != nil) {
return nil;
}
Expand Down Expand Up @@ -361,11 +350,7 @@ - (void)stopObserving
- (NSDictionary *)fetchNativeStackFramesBy:(NSArray<NSNumber *> *)instructionsAddr
symbolicate:(SymbolicateCallbackType)symbolicate
{
#if CROSS_PLATFORM_TEST
BOOL shouldSymbolicateLocally = [SentrySDKInternal.options debug];
#else
BOOL shouldSymbolicateLocally = [SentrySDK.options debug];
#endif
NSString *appPackageName = [[NSBundle mainBundle] executablePath];

NSMutableSet<NSString *> *_Nonnull imagesAddrToRetrieveDebugMetaImages =
Expand Down
7 changes: 7 additions & 0 deletions samples/react-native/ios/SentryNativeInitialiser.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#import <Foundation/Foundation.h>

@interface SentryNativeInitialiser : NSObject

+ (void)initializeSentry;

@end
38 changes: 38 additions & 0 deletions samples/react-native/ios/SentryNativeInitialiser.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#import "SentryNativeInitialiser.h"
@import Sentry;

@implementation SentryNativeInitialiser

+ (void)initializeSentry
{
[SentrySDK startWithConfigureOptions:^(SentryOptions *options) {
// Only options set here will apply to the iOS SDK
// Options from JS are not passed to the iOS SDK when initialized manually
options.dsn = @"https://[email protected]/5428561";
options.debug = YES; // Enabled debug when first installing is always helpful

options.beforeSend = ^SentryEvent *(SentryEvent *event)
{
// We don't want to send an event after startup that came from a Unhandled JS Exception
// of react native Because we sent it already before the app crashed.
if (nil != event.exceptions.firstObject.type &&
[event.exceptions.firstObject.type rangeOfString:@"Unhandled JS Exception"].location
!= NSNotFound) {
NSLog(@"Unhandled JS Exception");
return nil;
}

return event;
};

// Enable the App start and Frames tracking measurements
// If this is disabled the app start and frames tracking
// won't be passed from native to JS transactions
PrivateSentrySDKOnly.appStartMeasurementHybridSDKMode = true;
#if TARGET_OS_IPHONE || TARGET_OS_MACCATALYST
PrivateSentrySDKOnly.framesTrackingMeasurementHybridSDKMode = true;
#endif
}];
}

@end
Loading
Loading