Skip to content
Merged
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
4 changes: 4 additions & 0 deletions .github/workflows/sample-application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ jobs:
build-type: ['dev', 'production']
include:
- platform: ios
xcode-version: '16.2'
runs-on: macos-14
- platform: macos
runs-on: macos-15
Expand Down Expand Up @@ -84,6 +85,9 @@ jobs:
- name: Gradle cache
uses: gradle/gradle-build-action@v3

- run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode-version }}.app/Contents/Developer
if: ${{ matrix.platform == 'ios' }}

- name: Setup Global Xcode Tools
if: ${{ matrix.platform == 'ios' }}
run: which xcbeautify || brew install xcbeautify
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
- Bump JavaScript SDK from v10.8.0 to v10.10.0 ([#5142](https://github.com/getsentry/sentry-react-native/pull/5142), [#5145](https://github.com/getsentry/sentry-react-native/pull/5145))
- [changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md#10100)
- [diff](https://github.com/getsentry/sentry-javascript/compare/10.8.0...10.10.0)
- Bump Cocoa SDK from v8.53.2 to v8.55.1 ([#5036](https://github.com/getsentry/sentry-react-native/pull/5036))
- [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8551)
- [diff](https://github.com/getsentry/sentry-cocoa/compare/8.53.2...8.55.1)

## 7.0.1

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.55.1'

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.enableExperimentalViewRenderer)
}
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://abc@def.ingest.sentry.io/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: 1 addition & 4 deletions packages/core/ios/RNSentry+fetchNativeStack.m
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,8 @@
- (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
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
20 changes: 2 additions & 18 deletions packages/core/ios/RNSentry.mm
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,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 @@ -247,13 +240,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 @@ -467,11 +455,7 @@ - (void)stopObserving
contexts[@"os"] = os;
}

#if CROSS_PLATFORM_TEST
NSString *releaseName = SentrySDKInternal.options.releaseName;
#else
NSString *releaseName = [SentrySDK options].releaseName;
#endif
if (releaseName) {
contexts[@"release"] = releaseName;
}
Expand Down
2 changes: 1 addition & 1 deletion performance-tests/metrics-ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ startupTimeTest:

binarySizeTest:
diffMin: 600 KiB
diffMax: 1300 KiB
diffMax: 1400 KiB
7 changes: 7 additions & 0 deletions samples/react-native/ios/SentryNativeInitializer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#import <Foundation/Foundation.h>

@interface SentryNativeInitializer : NSObject

+ (void)initializeSentry;

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

@implementation SentryNativeInitializer

+ (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://1df17bd4e543fdb31351dee1768bb679@o447951.ingest.sentry.io/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