Skip to content

Commit a531de3

Browse files
committed
Cherry pick cocoa version bump fixes from #5036
1 parent 9be0807 commit a531de3

File tree

12 files changed

+123
-146
lines changed

12 files changed

+123
-146
lines changed

.github/workflows/sample-application.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ jobs:
4343
build-type: ['dev', 'production']
4444
include:
4545
- platform: ios
46+
xcode-version: '16.2'
4647
runs-on: macos-14
4748
- platform: macos
4849
runs-on: macos-15
@@ -84,6 +85,9 @@ jobs:
8485
- name: Gradle cache
8586
uses: gradle/gradle-build-action@v3
8687

88+
- run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode-version }}.app/Contents/Developer
89+
if: ${{ matrix.platform == 'ios' }}
90+
8791
- name: Setup Global Xcode Tools
8892
if: ${{ matrix.platform == 'ios' }}
8993
run: which xcbeautify || brew install xcbeautify

packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift

Lines changed: 1 addition & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,7 @@ final class RNSentryReplayOptions: XCTestCase {
6767
] as NSDictionary).mutableCopy() as! NSMutableDictionary
6868
RNSentryReplay.updateOptions(optionsDict)
6969

70-
#if CROSS_PLATFORM_TEST
7170
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
72-
#else
73-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
74-
#endif
7571
XCTAssertEqual(actualOptions.sessionReplay.sessionSampleRate, 0.75)
7672
}
7773

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

85-
#if CROSS_PLATFORM_TEST
8681
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
87-
#else
88-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
89-
#endif
9082
XCTAssertEqual(actualOptions.sessionReplay.onErrorSampleRate, 0.75)
9183
}
9284

@@ -116,11 +108,7 @@ final class RNSentryReplayOptions: XCTestCase {
116108

117109
RNSentryReplay.updateOptions(optionsDict)
118110

119-
#if CROSS_PLATFORM_TEST
120111
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
121-
#else
122-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
123-
#endif
124112

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

136124
RNSentryReplay.updateOptions(optionsDict)
137125

138-
#if CROSS_PLATFORM_TEST
139126
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
140-
#else
141-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
142-
#endif
143127

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

155139
RNSentryReplay.updateOptions(optionsDict)
156140

157-
#if CROSS_PLATFORM_TEST
158141
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
159-
#else
160-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
161-
#endif
162142

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

183163
RNSentryReplay.updateOptions(optionsDict)
184164

185-
#if CROSS_PLATFORM_TEST
186165
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
187-
#else
188-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
189-
#endif
190166

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

201177
RNSentryReplay.updateOptions(optionsDict)
202178

203-
#if CROSS_PLATFORM_TEST
204179
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
205-
#else
206-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
207-
#endif
208180

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

219191
RNSentryReplay.updateOptions(optionsDict)
220192

221-
#if CROSS_PLATFORM_TEST
222193
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
223-
#else
224-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
225-
#endif
226194

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

237205
RNSentryReplay.updateOptions(optionsDict)
238206

239-
#if CROSS_PLATFORM_TEST
240207
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
241-
#else
242-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
243-
#endif
244208

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

254218
RNSentryReplay.updateOptions(optionsDict)
255219

256-
#if CROSS_PLATFORM_TEST
257220
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
258-
#else
259-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
260-
#endif
261221

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

272232
RNSentryReplay.updateOptions(optionsDict)
273233

274-
#if CROSS_PLATFORM_TEST
275234
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
276-
#else
277-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
278-
#endif
279235

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

290246
RNSentryReplay.updateOptions(optionsDict)
291247

292-
#if CROSS_PLATFORM_TEST
293248
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
294-
#else
295-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
296-
#endif
297249

298250
XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering)
299251
}
300-
252+
301253
func testReplayQualityDefault() {
302254
let optionsDict = ([
303255
"dsn": "https://[email protected]/1234567",
@@ -306,11 +258,7 @@ final class RNSentryReplayOptions: XCTestCase {
306258

307259
RNSentryReplay.updateOptions(optionsDict)
308260

309-
#if CROSS_PLATFORM_TEST
310261
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
311-
#else
312-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
313-
#endif
314262

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

325273
RNSentryReplay.updateOptions(optionsDict)
326274

327-
#if CROSS_PLATFORM_TEST
328275
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
329-
#else
330-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
331-
#endif
332276

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

343287
RNSentryReplay.updateOptions(optionsDict)
344288

345-
#if CROSS_PLATFORM_TEST
346289
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
347-
#else
348-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
349-
#endif
350290

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

361301
RNSentryReplay.updateOptions(optionsDict)
362302

363-
#if CROSS_PLATFORM_TEST
364303
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
365-
#else
366-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
367-
#endif
368304

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

379315
RNSentryReplay.updateOptions(optionsDict)
380316

381-
#if CROSS_PLATFORM_TEST
382317
let actualOptions = try! SentryOptionsInternal.initWithDict(optionsDict as! [String: Any])
383-
#else
384-
let actualOptions = try! Options(dict: optionsDict as! [String: Any])
385-
#endif
386318

387319
XCTAssertEqual(actualOptions.sessionReplay.quality, SentryReplayOptions.SentryReplayQuality.medium)
388320
}

packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryTests.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@
33

44
@class SentryOptions;
55

6-
#if CROSS_PLATFORM_TEST
76
@interface
87
SentrySDKInternal (PrivateTests)
9-
#else
10-
@interface
11-
SentrySDK (PrivateTests)
12-
#endif
8+
139
+ (nullable SentryOptions *)options;
1410
@end

packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryTests.m

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -465,13 +465,8 @@ - (void)prepareNativeFrameMocksWithLocalSymbolication:(BOOL)debug
465465
SentryOptions *sentryOptions = [[SentryOptions alloc] init];
466466
sentryOptions.debug = debug; // no local symbolication
467467

468-
#if CROSS_PLATFORM_TEST
469468
id sentrySDKMock = OCMClassMock([SentrySDKInternal class]);
470469
OCMStub([(Class)sentrySDKMock options]).andReturn(sentryOptions);
471-
#else
472-
id sentrySDKMock = OCMClassMock([SentrySDK class]);
473-
OCMStub([(Class)sentrySDKMock options]).andReturn(sentryOptions);
474-
#endif
475470

476471
id sentryDependencyContainerMock = OCMClassMock([SentryDependencyContainer class]);
477472
OCMStub(ClassMethod([sentryDependencyContainerMock sharedInstance]))

packages/core/ios/RNSentry+fetchNativeStack.m

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,8 @@
2222
- (NSDictionary *)fetchNativeStackFramesBy:(NSArray<NSNumber *> *)instructionsAddr
2323
symbolicate:(SymbolicateCallbackType)symbolicate
2424
{
25-
#if CROSS_PLATFORM_TEST
2625
BOOL shouldSymbolicateLocally = [SentrySDKInternal.options debug];
27-
#else
28-
BOOL shouldSymbolicateLocally = [SentrySDK.options debug];
29-
#endif
26+
3027
NSString *appPackageName = [[NSBundle mainBundle] executablePath];
3128

3229
NSMutableSet<NSString *> *_Nonnull imagesAddrToRetrieveDebugMetaImages =

packages/core/ios/RNSentry.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,7 @@ typedef int (*SymbolicateCallbackType)(const void *, Dl_info *);
1515
@class SentryOptions;
1616
@class SentryEvent;
1717

18-
#if CROSS_PLATFORM_TEST
1918
@interface SentrySDKInternal : NSObject
20-
#else
21-
@interface
22-
SentrySDK (Private)
23-
#endif
2419
@property (nonatomic, nullable, readonly, class) SentryOptions *options;
2520
@end
2621

packages/core/ios/RNSentry.mm

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,9 @@
2828
#import <Sentry/SentryException.h>
2929
#import <Sentry/SentryFormatter.h>
3030
#import <Sentry/SentryOptions.h>
31-
#import <Sentry/SentryUser.h>
32-
33-
#if __has_include(<Sentry/SentryOptions+HybridSDKs.h>)
34-
# define USE_SENTRY_OPTIONS 1
35-
# import <Sentry/SentryOptions+HybridSDKs.h>
36-
#else
37-
# define USE_SENTRY_OPTIONS 0
38-
# import <Sentry/SentryOptionsInternal.h>
39-
#endif
31+
#import <Sentry/SentryOptionsInternal.h>
4032
#import <Sentry/SentryScreenFrames.h>
33+
#import <Sentry/SentryUser.h>
4134

4235
// This guard prevents importing Hermes in JSC apps
4336
#if SENTRY_PROFILING_ENABLED
@@ -169,13 +162,8 @@ - (SentryOptions *_Nullable)createOptionsWithDictionary:(NSDictionary *_Nonnull)
169162
[RNSentryReplay updateOptions:mutableOptions];
170163
#endif
171164

172-
#if USE_SENTRY_OPTIONS
173-
SentryOptions *sentryOptions = [[SentryOptions alloc] initWithDict:mutableOptions
174-
didFailWithError:errorPointer];
175-
#else
176165
SentryOptions *sentryOptions = [SentryOptionsInternal initWithDict:mutableOptions
177166
didFailWithError:errorPointer];
178-
#endif
179167
if (*errorPointer != nil) {
180168
return nil;
181169
}
@@ -364,6 +352,58 @@ - (void)stopObserving
364352
return [self fetchNativeStackFramesBy:instructionsAddr symbolicate:dladdr];
365353
}
366354

355+
RCT_EXPORT_METHOD(fetchNativeLogAttributes
356+
: (RCTPromiseResolveBlock)resolve rejecter
357+
: (RCTPromiseRejectBlock)reject)
358+
{
359+
__block NSMutableDictionary<NSString *, id> *result = [NSMutableDictionary new];
360+
361+
[SentrySDKWrapper configureScope:^(SentryScope *_Nonnull scope) {
362+
// Serialize to get contexts dictionary
363+
NSDictionary *serializedScope = [scope serialize];
364+
NSDictionary *allContexts = serializedScope[@"context"]; // It's singular here, annoyingly
365+
366+
NSMutableDictionary *contexts = [NSMutableDictionary new];
367+
368+
NSDictionary *device = allContexts[@"device"];
369+
if ([device isKindOfClass:[NSDictionary class]]) {
370+
contexts[@"device"] = device;
371+
}
372+
373+
NSDictionary *os = allContexts[@"os"];
374+
if ([os isKindOfClass:[NSDictionary class]]) {
375+
contexts[@"os"] = os;
376+
}
377+
378+
NSString *releaseName = SentrySDKInternal.options.releaseName;
379+
if (releaseName) {
380+
contexts[@"release"] = releaseName;
381+
}
382+
// Merge extra context
383+
NSDictionary *extraContext = [PrivateSentrySDKOnly getExtraContext];
384+
385+
if (extraContext) {
386+
NSDictionary *extraDevice = extraContext[@"device"];
387+
if ([extraDevice isKindOfClass:[NSDictionary class]]) {
388+
NSMutableDictionary *mergedDevice =
389+
[contexts[@"device"] mutableCopy] ?: [NSMutableDictionary new];
390+
[mergedDevice addEntriesFromDictionary:extraDevice];
391+
contexts[@"device"] = mergedDevice;
392+
}
393+
394+
NSDictionary *extraOS = extraContext[@"os"];
395+
if ([extraOS isKindOfClass:[NSDictionary class]]) {
396+
NSMutableDictionary *mergedOS =
397+
[contexts[@"os"] mutableCopy] ?: [NSMutableDictionary new];
398+
[mergedOS addEntriesFromDictionary:extraOS];
399+
contexts[@"os"] = mergedOS;
400+
}
401+
}
402+
result[@"contexts"] = contexts;
403+
}];
404+
resolve(result);
405+
}
406+
367407
RCT_EXPORT_METHOD(fetchNativeDeviceContexts
368408
: (RCTPromiseResolveBlock)resolve rejecter
369409
: (RCTPromiseRejectBlock)reject)

performance-tests/metrics-ios.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ startupTimeTest:
1111

1212
binarySizeTest:
1313
diffMin: 600 KiB
14-
diffMax: 1300 KiB
14+
diffMax: 1400 KiB
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#import <Foundation/Foundation.h>
2+
3+
@interface SentryNativeInitializer : NSObject
4+
5+
+ (void)initializeSentry;
6+
7+
@end

0 commit comments

Comments
 (0)