react / react/react-native

iOS: updateOSDeploymentTarget skips resource-bundle targets, so Xcode 27 fails the build with "deployment target ... supported range is 15.0"

未关闭 适合新手
#58,555 4 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

Needs: Author Feedback Needs: Repro
主要语言
C++
星标
127k
派生
25.3k
平均合并
1 天 23 小时
30 天内合并 PR
4

描述

Description

Xcode 27 (27A266a, iOS 27.0 SDK) turns "deployment target below the supported range" from a warning into a hard build error, and the supported range now starts at iOS 15.0. A React Native app fails to build because several CocoaPods resource-bundle targets still carry the deployment target declared in their podspec s.platform (9.0 / 12.4 / 13.4 / 14.0).

react_native_post_install already lifts pod targets to min_ios_version_supported via ReactNativePodsUtils.updateOSDeploymentTarget, but that method only iterates target_installation_result.native_target:

https://github.com/react/react-native/blob/a17fbb48e065a0ba0328538f997ae08b228be6af/packages/react-native/scripts/cocoapods/utils.rb#L435-L445

Each pod's resource_bundle_targets (PrivacyInfo bundles, asset bundles) are never visited, so they keep the podspec value and Xcode 27 rejects them. The library targets of the very same pods build fine because they were floored to 15.1; only their resource bundles fail. The method is identical on main, 0.87.1 and 0.83.10.

Fixing this per-package is not viable: the newest releases of react-native-device-info (15.0.2), react-native-image-picker (8.2.1), react-native-svg (15.15.5) and RiveRuntime (6.23.1) still declare platform minimums below 15, and a resource bundle's deployment target is assigned by CocoaPods, not by anything the app controls. Since React Native already owns the deployment-target floor for library targets, the floor should cover resource-bundle targets too.

Proposed fix

turn_off_resource_bundle_react_core in the same file already iterates resource_bundle_targets (https://github.com/react/react-native/blob/a17fbb48e065a0ba0328538f997ae08b228be6af/packages/react-native/scripts/cocoapods/utils.rb#L141), so this is the same traversal RN uses elsewhere:

def self.updateOSDeploymentTarget(installer)
    min_version = Helpers::Constants.min_ios_version_supported
    installer.target_installation_results.pod_target_installation_results
        .each do |pod_name, target_installation_result|
            targets = [target_installation_result.native_target] + target_installation_result.resource_bundle_targets
            targets.each do |target|
                target.build_configurations.each do |config|
                    old_iphone_deploy_target = config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] ?
                        config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] :
                        min_version
                    config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] = [min_version.to_f, old_iphone_deploy_target.to_f].max.to_s
                end
            end
        end
end

Happy to open a PR with this change if maintainers prefer.

Workaround

In the app Podfile post_install, after react_native_post_install:

installer.pods_project.targets.each do |target|
  target.build_configurations.each do |config|
    if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < min_ios_version_supported.to_f
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = min_ios_version_supported
    end
  end
end

With this in place all 260 IPHONEOS_DEPLOYMENT_TARGET entries in Pods.xcodeproj read 15.1 and the build succeeds on Xcode 27.

Steps to reproduce
  1. npx @react-native-community/cli init Repro --version 0.83.1 (also reproduces with 0.87.1).
  2. Add any dependency whose podspec declares an old platform and ships a PrivacyInfo.xcprivacy resource bundle, e.g. react-native-device-info@15.0.2 (s.platforms = { :ios => "9.0" }).
  3. cd ios && RCT_NEW_ARCH_ENABLED=1 pod install.
  4. grep "IPHONEOS_DEPLOYMENT_TARGET = " Pods/Pods.xcodeproj/project.pbxproj | sort | uniq -c shows the library target at 15.1 and RNDeviceInfo-RNDeviceInfoPrivacyInfo at 9.0.
  5. Build with Xcode 27 for any iOS 27 destination (simulator or device). The build fails at the project validation step before compiling anything.
React Native Version

0.83.1 (bug present on main, 0.87.1 and 0.83.10)

Affected Platforms

Build - MacOS, Runtime - iOS

Output of npx @react-native-community/cli info
System:
  OS: macOS 27.0
  CPU: Apple Silicon
Binaries:
  Node: 22.x
  pnpm: 10.28.1
  CocoaPods: 1.17.0
IDEs:
  Xcode:
    version: 27.0/27A266a
    path: /usr/bin/xcodebuild
Languages:
  Ruby:
    version: 4.0.6
    path: /opt/homebrew/bin/ruby
iOS:
  hermesEnabled: true
  newArchEnabled: true
Stacktrace or Logs
Pods.xcodeproj: error: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 9.0, but the range of supported deployment target versions is 15.0 to 27.0.x. (in target 'RNDeviceInfo-RNDeviceInfoPrivacyInfo' from project 'Pods')
Pods.xcodeproj: error: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 9.0, but the range of supported deployment target versions is 15.0 to 27.0.x. (in target 'react-native-image-picker-RNImagePickerPrivacyInfo' from project 'Pods')
Pods.xcodeproj: error: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 9.0, but the range of supported deployment target versions is 15.0 to 27.0.x. (in target 'react-native-view-shot-RNViewShotPrivacyInfo' from project 'Pods')
Pods.xcodeproj: error: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 12.4, but the range of supported deployment target versions is 15.0 to 27.0.x. (in target 'RNPermissions-RNPermissionsPrivacyInfo' from project 'Pods')
Pods.xcodeproj: error: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 12.4, but the range of supported deployment target versions is 15.0 to 27.0.x. (in target 'RNSVG-RNSVGFilters' from project 'Pods')
Pods.xcodeproj: error: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 13.4, but the range of supported deployment target versions is 15.0 to 27.0.x. (in target 'RNCAsyncStorage-RNCAsyncStorage_resources' from project 'Pods')
Pods.xcodeproj: error: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 14.0, but the range of supported deployment target versions is 15.0 to 27.0.x. (in target 'RiveRuntime-runtime_ios_privacy' from project 'Pods')
MANDATORY Reproducer

The defect is in packages/react-native/scripts/cocoapods/utils.rb itself (permalink above); the steps above reproduce it on a fresh cli init app with one dependency added and no other changes. I can push a repro repository if the steps are not sufficient.

Screenshots and Videos

No response

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 packages/react-native/scripts/cocoapods/utils.rb 中的 ReactNativePodsUtils.updateOSDeploymentTarget 开始,将其遍历过程与 turn_off_resource_bundle_react_core 进行比较。使用列出的 CLI 应用和依赖项复现,然后检查 Pods/Pods.xcodeproj/project.pbxproj;当 resource-bundle deployment target 满足 min_ios_version_supported 且 Xcode 27 验证成功时即完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
ios, react-native, ruby
领域
build-system, mobile
Issue 类型
缺陷
难度
2/5
预计耗时
1-3 小时
活跃度
活跃
描述清晰度
描述清楚
新手友好度
88/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。