@@ -45,115 +45,41 @@ Pod::Spec.new do |s|
4545 # is pulled in here; on Android it is compiled by the dedicated CMake target
4646 # in `android/CMakeLists.txt`. The files are guarded with
4747 # `RCT_NEW_ARCH_ENABLED` so they compile to empty TUs on Old Arch.
48- #
49- # We include `.swift` (for `RNSentrySwiftLinkStub.swift`) only on RN >=
50- # 0.75. Adding a Swift file makes CocoaPods treat RNSentry as a Swift
51- # pod, which then requires modular headers from its ObjC dependencies
52- # (React-Core, React-hermes) — RN < 0.75 doesn't emit those, so
53- # `pod install` fails with:
54- # "The Swift pod `RNSentry` depends upon `React-hermes`, which does
55- # not define modules."
56- # The stub is only needed when linking Sentry.xcframework's Swift
57- # symbols into a dynamic framework anyway (RN 0.86+ `use_frameworks!
58- # :dynamic`), so gating on RN 0.75 is safe.
59- supports_swift_stub = rn_version [ :major ] >= 1 || ( rn_version [ :major ] == 0 && rn_version [ :minor ] >= 75 )
60- if supports_swift_stub
61- s . source_files = 'ios/**/*.{h,m,mm,swift}' , 'cpp/**/*.{h,cpp}'
62- s . swift_versions = [ '5.5' ]
63- else
64- s . source_files = 'ios/**/*.{h,m,mm}' , 'cpp/**/*.{h,cpp}'
65- end
48+ s . source_files = 'ios/**/*.{h,m,mm}' , 'cpp/**/*.{h,cpp}'
6649 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'
6750
6851 s . compiler_flags = other_cflags
6952
70- pod_target_xcconfig = {
53+ s . pod_target_xcconfig = {
7154 'DEFINES_MODULE' => 'YES'
7255 }
7356
7457 sentry_cocoa_version = '9.19.1'
7558
76- # Consume sentry-cocoa as a prebuilt `Sentry.xcframework` by default.
59+ # Opt-in to consuming sentry-cocoa via Swift Package Manager.
60+ # When `SENTRY_USE_SPM=1` is set, RNSentry pulls `Sentry` from the
61+ # sentry-cocoa SPM package as a binary xcframework instead of from
62+ # the Sentry CocoaPods source build. Defaults to CocoaPods consumption
63+ # for backward compatibility with the full RN version range we support.
7764 #
78- # The xcframework is downloaded from sentry-cocoa's GitHub Release,
79- # SHA256-verified, and cached under `~/Library/Caches/sentry-react-native/
80- # xcframeworks/<version>/` (override with `SENTRY_XCFRAMEWORK_CACHE_DIR`).
81- # Slice paths are then wired into the pod and app target via
82- # `FRAMEWORK_SEARCH_PATHS` below. Consuming the xcframework this way
83- # avoids compiling sentry-cocoa from source (fast install) and
84- # sidesteps the Xcode 16/26 archive bug that affects the same
85- # xcframework when consumed through Xcode's SPM integration
86- # (`Signatures/*.signature` collision during archive).
87- #
88- # Set `SENTRY_USE_XCFRAMEWORK=0` to fall back to the source-built
89- # `Sentry` CocoaPod (e.g. for offline builds behind a restrictive proxy).
90- #
91- # `SENTRY_USE_SPM` was the name in earlier drafts of this PR; honor it as a
92- # deprecated alias so CI or local envs still exporting `SENTRY_USE_SPM=0`
93- # don't silently take the new xcframework path.
94- env_use_xcframework = ENV [ 'SENTRY_USE_XCFRAMEWORK' ]
95- if env_use_xcframework . nil? && !ENV [ 'SENTRY_USE_SPM' ] . nil?
96- Pod ::UI . warn '[Sentry] SENTRY_USE_SPM is deprecated; use SENTRY_USE_XCFRAMEWORK instead.' if defined? ( Pod ::UI )
97- env_use_xcframework = ENV [ 'SENTRY_USE_SPM' ]
98- end
99- use_xcframework = case env_use_xcframework
100- when '0' then false
101- else true
102- end
103-
104- if use_xcframework
105- sentry_xcframework_dir = ensure_sentry_xcframework ( sentry_cocoa_version , 'Sentry' )
106-
107- # We deliberately do NOT set `s.vendored_frameworks` even though the
108- # xcframework is downloaded and referenced below. CocoaPods doesn't
109- # stage vendored xcframeworks for `path:` (development) pods anyway
110- # — it did nothing for us functionally — and pointing it at a path
111- # inside `node_modules/@sentry/react-native/ios/Vendor/` used to be
112- # actively harmful, because that path only existed when the SDK was
113- # cached into the package directory (broken under pnpm's isolated
114- # store / Yarn PnP where node_modules is read-only). Framework
115- # linking still happens: `@import Sentry;` in RNSentry.mm + user
116- # code triggers clang's `-fmodules-autolink`, which emits the
117- # `-framework Sentry` linker directive automatically once the
118- # module is discovered via `FRAMEWORK_SEARCH_PATHS` below.
119-
120- # Xcode's `-F <dir>` doesn't descend into `.xcframework` bundles — it
121- # looks for `Sentry.framework` directly at the given path. Point a
122- # separate framework search path at each slice, gated by the matching
123- # SDK selector so `#import <Sentry/…>` resolves against exactly one
124- # slice per build. An unconditional search-path list would let Xcode's
125- # Swift module precompiler stumble into a slice for a different arch
126- # and fail with "unsupported Swift architecture".
127- #
128- # We hardcode the slice → SDK map in `SENTRY_XCFRAMEWORK_SLICES_BY_SDK`
129- # (see `sentry_utils.rb`) rather than scanning the extracted bundle —
130- # sentry-cocoa's `Sentry.xcframework` layout is stable across releases.
131- # Add a slice there if a future release ships one.
132- #
133- # Point the search paths at the pod-install-time absolute path to the
134- # xcframework. `${PODS_TARGET_SRCROOT}` is only defined in per-pod
135- # xcconfigs, not in aggregate/user-target xcconfigs, and a
136- # `${PODS_ROOT}`-relative fallback works for one Podfile layout but
137- # breaks for another (e.g. the RN sample apps put node_modules at a
138- # different depth from RNSentryCocoaTester). Using the absolute path
139- # avoids the layout-detection dance — the path is regenerated on
140- # every `pod install`, so it's not something anyone commits.
141- xcframework_search_paths = SENTRY_XCFRAMEWORK_SLICES_BY_SDK . each_with_object ( { } ) do |( sdk , slice_ids ) , acc |
142- paths = slice_ids . map { |slice | %("#{ File . join ( sentry_xcframework_dir , slice ) } ") }
143- acc [ "FRAMEWORK_SEARCH_PATHS[sdk=#{ sdk } *]" ] = ( [ '$(inherited)' ] + paths ) . join ( ' ' )
65+ # Requires React Native >= 0.75 because the SPM helper
66+ # (`react-native/scripts/cocoapods/spm.rb`) is loaded transitively from
67+ # the Podfile via `react_native_pods.rb`.
68+ if ENV [ 'SENTRY_USE_SPM' ] == '1'
69+ unless defined? ( SPM ) && SPM . respond_to? ( :dependency )
70+ raise 'SENTRY_USE_SPM=1 is set but the SPM helper is not loaded. ' \
71+ 'This requires React Native >= 0.75 and a Podfile that imports ' \
72+ 'react_native_pods.rb.'
14473 end
145-
146- pod_target_xcconfig . merge! ( xcframework_search_paths )
147- s . user_target_xcconfig = xcframework_search_paths
74+ SPM . dependency ( s ,
75+ url : 'https://github.com/getsentry/sentry-cocoa' ,
76+ requirement : { kind : 'exactVersion' , version : sentry_cocoa_version } ,
77+ products : [ 'Sentry' ]
78+ )
14879 else
14980 s . dependency 'Sentry' , sentry_cocoa_version
15081 end
15182
152- # Assign before `install_modules_dependencies` so it can merge its
153- # RN-specific settings on top. Assigning after would clobber those and
154- # break header resolution across the pod.
155- s . pod_target_xcconfig = pod_target_xcconfig
156-
15783 if defined? install_modules_dependencies
15884 # Default React Native dependencies for 0.71 and above (new and legacy architecture)
15985 install_modules_dependencies ( s )
@@ -162,13 +88,10 @@ Pod::Spec.new do |s|
16288
16389 if is_new_arch_enabled then
16490 # New Architecture on React Native 0.70 and older
165- pod_target_xcconfig . merge! ( {
91+ s . pod_target_xcconfig . merge! ( {
16692 "HEADER_SEARCH_PATHS" => "\" $(PODS_ROOT)/boost\" " ,
16793 "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
16894 } )
169- # `install_modules_dependencies` is not defined on RN < 0.71 so re-assigning
170- # here is safe — nothing else has written to `s.pod_target_xcconfig` yet.
171- s . pod_target_xcconfig = pod_target_xcconfig
17295
17396 s . dependency "React-RCTFabric" # Required for Fabric Components (like RCTViewComponentView)
17497 s . dependency "React-Codegen"
0 commit comments