From aa8a8b1cc30b5c7f5364d9f5c56f69cc38090660 Mon Sep 17 00:00:00 2001 From: Christian Falch Date: Sun, 23 Nov 2025 17:40:45 +0100 Subject: [PATCH] [ios][precompile] Fixed symbol mapping to slices Previously the symbolication support when using the precompiled React.XCFramework copied the symbol bundles to the wrong folder in the framework, causing Xcode to not find the symbols. This commit fixes this by copying symbols to the correct slice folders instead of in the root of the framework folder. Reproduction: ``` npx @react-native-community/cli init Next --version next --skip-install cd Next yarn cd ios bundle install RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1 RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS=1 bundle exec pod install ``` Run Xcode and observe that you are not able to step into React Native source code. After this fix, you should be able to step into the source code of React Native. Note: Running `pod cache clean --all` and `rm -rf Pods` in the iOS folder followed by a clean rebuild in Xcode might be a good thing to ensure you're using the correct binaries when compiling. --- packages/react-native/scripts/cocoapods/rncore.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/react-native/scripts/cocoapods/rncore.rb b/packages/react-native/scripts/cocoapods/rncore.rb index a048834c20e4..597c4b4370d1 100644 --- a/packages/react-native/scripts/cocoapods/rncore.rb +++ b/packages/react-native/scripts/cocoapods/rncore.rb @@ -233,7 +233,16 @@ def self.process_dsyms(frameworkTarball, dSymsTarball) # Add the dSYMs folder to the framework folder rncore_log(" Adding dSYMs to framework tarball") - `(cd "$(dirname "#{dsyms_tmp_dir}")" && mkdir -p React.xcframework && cp -r "$(basename "#{dsyms_tmp_dir}")" React.xcframework/dSYMs && tar -rf "#{frameworkTarPath}" React.xcframework/dSYMs && rm -rf React.xcframework)` + + # Move symbol bundles into each of the slices in the xcframework + # Example: + # move dSYMs/ios-arm64/. into React.xcframework/ios-arm64/React.framework/dSYMs/. + Dir.glob(File.join(dsyms_tmp_dir, "*")).each do |dsym_path| + slice_name = File.basename(dsym_path) + slice_dsym_dest = File.join("React.xcframework", slice_name, "React.framework", "dSYMs") + rncore_log(" Adding dSYM slice #{slice_name} into tarball at #{slice_dsym_dest}") + `(cd "#{File.dirname(frameworkTarPath)}" && mkdir -p "#{slice_dsym_dest}" && cp -R "#{dsym_path}/." "#{slice_dsym_dest}" && tar -rf "#{frameworkTarPath}" "#{slice_dsym_dest}")` + end # Now gzip the framework tarball again - remember to use the .tar file and not the .gz file rncore_log(" Packing #{Pathname.new(frameworkTarPath).relative_path_from(Pathname.pwd).to_s}") @@ -246,6 +255,10 @@ def self.process_dsyms(frameworkTarball, dSymsTarball) # Remove backup of original tarballs FileUtils.rm_f("#{frameworkTarball}.orig") + # Remove temp dSYMs folder and the temp Framework folder + FileUtils.rm_rf(dsyms_tmp_dir) + FileUtils.rm_rf(File.join(artifacts_dir, "React.xcframework")) + rescue => e rncore_log("Failed to process dSYMs: #{e.message}", :error) # Restore the original tarballs