ci: normalize CocoaPods targets for Xcode 27 (MBL-2278) - #633
Merged
Conversation
Contributor
Sample app builds 📱Below you will find the list of the latest versions of the sample apps. It's recommended to always download the latest builds of the sample apps to accurately test the pull request.
|
Shahroz16
marked this pull request as ready for review
August 14, 2026 17:30
mrehan27
approved these changes
Aug 17, 2026
mahmoud-elmorabea
left a comment
Contributor
There was a problem hiding this comment.
validate_numeric_settings!(:567) raisesAuditErroron a present-but-non-numericIPHONEOS_DEPLOYMENT_TARGET($(inherited),$(MIN_IOS)), so an xcconfig-driven customer project breakspod installwith no opt-out — skip-with-warning, or anallow_non_numeric:escape?- Third byte-identical copy of the helper (ios#1208, flutter#389) with byte-identity as a manual invariant — can it live in mobile-ci-tools?
…ods-target-normalization
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
max(React Native floor, 15.0)IPHONEOS_DEPLOYMENT_TARGET[...]keysRoot cause
Xcode 27 validates every generated target configuration. React Native 0.83 currently requires iOS 15.1, but generated dependency and resource-bundle targets can still carry lower deployment metadata and fail before Customer.io source compilation. A qualified setting such as
IPHONEOS_DEPLOYMENT_TARGET[sdk=iphoneos*]can also override an unconditional value, so it must be resolved by the host rather than hidden by a synthesized target override.Compatibility policy
Customer.io still supports iOS versions below 15, so lower native podspec minimums remain intentional. Raising those public minimums first would drop older applications and would not control transitive pod metadata. This helper instead aligns generated build targets with the current React Native iOS floor, without changing published package runtime support.
Safety
The helper validates the whole selected configuration set before mutation, preserves higher numeric values, reports each
original -> finalchange, and fails closed for unresolved xcconfig or qualified-setting forms. The npm package owns this helper copy and its local behavior tests. It does not use a cross-repository source lock or require wrapper copies to remain byte-identical.Validation
Release and merge policy
This prerequisite should be squash merged only, under this
ci:PR title. Merge or rebase would expose historicalfix:commits to semantic-release and could trigger an unintended patch release. The squashed CI change will ship with the next coordinated React Native package release after lifecycle runtime validation.Boundaries
Expo remains the no-override control. This PR does not change React Native lifecycle routing or prove physical-device delivery, signed export, App Store submission, or every customer dependency graph. Hosted Xcode 27 after-proof remains separate.
Note
Medium Risk
Changes iOS build integration and post_install behavior for integrated app/extension targets; mistakes could raise customer deployment floors or fail pod install, but scope is build-time only with extensive tests and fail-closed validation.
Overview
Adds an opt-in CocoaPods Podfile helper so React Native apps can raise generated and integrated targets to a floor of
max(React Native min, iOS 15.0)(e.g. 15.1 on RN 0.83), addressing Xcode 27 rejecting pod targets whose deployment metadata is below the SDK build range.The helper (
ios/cocoapods_deployment_target.rb) validates settings before mutation, preserves higher numeric floors, resolves target → xcconfig → project precedence, and fails closed on non-numeric or qualifiedIPHONEOS_DEPLOYMENT_TARGET[...]keys. It ships in the npm package with a customer guide (docs/cocoapods-deployment-target-normalization.md) and a README pointer.The example Podfile wires
normalize!afterreact_native_post_install. iOS CI runs autolinking checks, the Minitest helper suite, and a recursive audit overPodsand the sample app project. Autolinking pins the primarycustomerio-reactnative.podspecwhen a rich-push podspec exists.Reviewed by Cursor Bugbot for commit 2b2a815. Bugbot is set up for automated code reviews on this repo. Configure here.