diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 548e75806d..0839860ae5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -136,8 +136,8 @@ cd sentry-react-native Comment out sentry dependency in `RNSentry.podspec`. ```diff -- s.dependency 'Sentry/HybridSDK', '7.31.0' -+ s.dependency 'Sentry/HybridSDK' +- s.dependency 'Sentry', '7.31.0' ++ s.dependency 'Sentry' ``` Add local pods to `sample/ios/Podfile`. @@ -147,7 +147,7 @@ target 'sample' do # ... react native config - pod 'Sentry/HybridSDK', :path => '../../../../sentry-cocoa' + pod 'Sentry', :path => '../../../../sentry-cocoa' # ... rest of the configuration end diff --git a/packages/core/RNSentry.podspec b/packages/core/RNSentry.podspec index 49452a65cc..15c5e01d36 100644 --- a/packages/core/RNSentry.podspec +++ b/packages/core/RNSentry.podspec @@ -46,7 +46,7 @@ Pod::Spec.new do |s| s.compiler_flags = other_cflags - s.dependency 'Sentry/HybridSDK', '>= 9.1.0' + s.dependency 'Sentry', '>= 9.1.0' if defined? install_modules_dependencies # Default React Native dependencies for 0.71 and above (new and legacy architecture) diff --git a/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift b/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift index 0d7ef3aa12..7b0355f269 100644 --- a/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift +++ b/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift @@ -67,7 +67,7 @@ final class RNSentryReplayOptions: XCTestCase { ] as NSDictionary).mutableCopy() as! NSMutableDictionary RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.sessionSampleRate, 0.75) } @@ -78,7 +78,7 @@ final class RNSentryReplayOptions: XCTestCase { ] as NSDictionary).mutableCopy() as! NSMutableDictionary RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.onErrorSampleRate, 0.75) } @@ -108,7 +108,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.maskAllImages, true) assertContainsClass(classArray: actualOptions.sessionReplay.maskedViewClasses, stringClass: "RCTImageView") @@ -123,7 +123,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.maskAllImages, false) XCTAssertEqual(actualOptions.sessionReplay.maskedViewClasses.count, 0) @@ -138,7 +138,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.maskAllText, true) assertContainsClass(classArray: actualOptions.sessionReplay.maskedViewClasses, stringClass: "RCTTextView") @@ -162,7 +162,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.maskAllText, false) XCTAssertEqual(actualOptions.sessionReplay.maskedViewClasses.count, 0) @@ -176,7 +176,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertTrue(actualOptions.sessionReplay.enableViewRendererV2) } @@ -190,7 +190,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertTrue(actualOptions.sessionReplay.enableViewRendererV2) } @@ -204,7 +204,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertFalse(actualOptions.sessionReplay.enableViewRendererV2) } @@ -217,7 +217,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering) } @@ -231,7 +231,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertTrue(actualOptions.sessionReplay.enableFastViewRendering) } @@ -245,7 +245,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering) } @@ -258,7 +258,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.medium) } @@ -272,7 +272,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.low) } @@ -286,7 +286,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.medium) } @@ -300,7 +300,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.high) } @@ -314,7 +314,7 @@ final class RNSentryReplayOptions: XCTestCase { RNSentryReplay.updateOptions(optionsDict) - let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any]) + let actualOptions = try! PrivateSentrySDKOnly.options(with: optionsDict as! [String: Any]) XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.medium) } diff --git a/packages/core/ios/RNSentry+fetchNativeStack.m b/packages/core/ios/RNSentry+fetchNativeStack.m index d10f82108c..8acdf73684 100644 --- a/packages/core/ios/RNSentry+fetchNativeStack.m +++ b/packages/core/ios/RNSentry+fetchNativeStack.m @@ -1,4 +1,5 @@ #import "RNSentry.h" +#import "RNSentry+formatters.h" #import "RNSentryBreadcrumb.h" #import "RNSentryId.h" #import diff --git a/packages/core/ios/RNSentry+formatters.h b/packages/core/ios/RNSentry+formatters.h new file mode 100644 index 0000000000..13a8348af0 --- /dev/null +++ b/packages/core/ios/RNSentry+formatters.h @@ -0,0 +1,34 @@ +#import + +// This file is a copy from https://github.com/getsentry/sentry-cocoa/blob/6c20265de0903b835a299e2e9da0f7af50af09f5/Sources/Sentry/include/HybridPublic/SentryFormatter.h + +// 2 for the 0x prefix, plus 16 for the hex value, plus 1 for the null terminator +#define SENTRY_HEX_ADDRESS_LENGTH 19 + +static inline NSString * +sentry_snprintfHexAddress(uint64_t value) +{ + char buffer[SENTRY_HEX_ADDRESS_LENGTH]; + snprintf(buffer, SENTRY_HEX_ADDRESS_LENGTH, "0x%016llx", value); + NSString *nsString = [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding]; + return nsString; +} + +static inline NSString * +sentry_formatHexAddress(NSNumber *value) +{ + /* + * We observed a 41% speedup by using snprintf vs +[NSString stringWithFormat:]. In a trial + * using a profile, we observed the +[NSString stringWithFormat:] using 282ms of CPU time, vs + * 164ms of CPU time for snprintf. There is also an assumed space improvement due to not needing + * to allocate as many instances of NSString, like for the format string literal, instead only + * using stack-bound C strings. + */ + return sentry_snprintfHexAddress([value unsignedLongLongValue]); +} + +static inline NSString * +sentry_formatHexAddressUInt64(uint64_t value) +{ + return sentry_snprintfHexAddress(value); +} diff --git a/packages/core/ios/SentrySDKWrapper.m b/packages/core/ios/SentrySDKWrapper.m index c11782d5ad..d724f74d04 100644 --- a/packages/core/ios/SentrySDKWrapper.m +++ b/packages/core/ios/SentrySDKWrapper.m @@ -35,8 +35,8 @@ + (SentryOptions *)createOptionsWithDictionary:(NSDictionary *)options error:(NSError *__autoreleasing *)errorPointer { NSString *dsn = [self getURLFromDSN:[options valueForKey:@"dsn"]]; - SentryOptions *sentryOptions = [SentryOptionsInternal initWithDict:options - didFailWithError:errorPointer]; + SentryOptions *sentryOptions = [PrivateSentrySDKOnly optionsWithDictionary:options + didFailWithError:errorPointer]; if (*errorPointer != nil) { return nil; } diff --git a/scripts/update-cocoa.sh b/scripts/update-cocoa.sh index 86b60dae90..7d2a5ce0ed 100755 --- a/scripts/update-cocoa.sh +++ b/scripts/update-cocoa.sh @@ -3,7 +3,7 @@ set -euo pipefail file="$(dirname "$0")/../packages/core/RNSentry.podspec" content=$(cat $file) -regex="('Sentry/HybridSDK', *)'([0-9\.]+)'" +regex="('Sentry', *)'([0-9\.]+)'" if ! [[ $content =~ $regex ]]; then echo "Failed to find the plugin version in $file" exit 1