fix(mobile): Xcode 26 SDK for iOS upload + hermesc path for Android#14396
Merged
Conversation
Two real failures surfaced in run 26319345276 after the displayer fix in #14394 made fastlane log altool errors again: ### iOS RC + Prod — Apple now requires iOS 26 SDK altool 409 Validation failed: This app was built with the iOS 18.5 SDK. All iOS and iPadOS apps must be built with the iOS 26 SDK or later, included in Xcode 26 or later, in order to be uploaded to App Store Connect or submitted for distribution. (ID: 287c542e-…) The `macos-15` runners default to Xcode 16.4 (iOS 18.5 SDK). Switch both iOS upload jobs to `macos-26` (Tahoe, GA), which has Xcode 26 as the only supported major. ### Android RC + Prod — hermesc location anchored at the wrong root Couldn't determine Hermesc location. Please set `react.hermesCommand` to the path of the hermesc binary file. node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc The previous PR restored `react.root` to its default (`../..` = `packages/mobile`) to fix the Hermes JS bundle's entryFile lookup. The same plugin uses `root` to detect the prebuilt hermesc binary (PathUtils.kt#detectOSAwareHermesCommand) and only checks `root/node_modules/react-native/sdks/hermesc/...`. Since RN is hoisted to the monorepo node_modules, that lookup fails. Set `react.hermesCommand` explicitly to the hoisted prebuilt path: $rootDir/../../../node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc The `%OS-BIN%` placeholder is substituted at runtime by the plugin to `linux64-bin` / `osx-bin` / `win64-bin` as appropriate. Verified those bin directories exist in node_modules/react-native/sdks/hermesc/ in this branch. ### Housekeeping - `Gemfile.lock` dependency line aligned to `= 2.234.0` to match the Gemfile pin from #14394 (the squash-merge left the lock at the pre-pin `>= 2.228.0` constraint). - Bump versions to re-fire the build matrix: `1.5.182 -> 1.5.183`, iOS `1.1.195 -> 1.1.196`, Android `1.1.531 -> 1.1.532`. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
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
Two real failures surfaced in run 26319345276 after the displayer fix in #14394 made fastlane log altool errors again.
1. iOS RC + Prod — Apple now requires iOS 26 SDK
altool now returns:
```
ERROR: Validation failed (409) SDK version issue. This app was built with the iOS 18.5 SDK.
All iOS and iPadOS apps must be built with the iOS 26 SDK or later, included in Xcode 26 or
later, in order to be uploaded to App Store Connect or submitted for distribution.
(ID: 287c542e-3971-4158-b3c3-71eb1fcd6eb3)
```
The `macos-15` runners ship Xcode 16.4 (iOS 18.5 SDK) by default — that's why gym archived fine but altool rejected the upload. Switch both iOS jobs to `macos-26` (Tahoe, GA), which has Xcode 26 as the only supported major.
2. Android RC + Prod — hermesc binary lookup also anchored at the wrong root
```
Couldn't determine Hermesc location. Please set `react.hermesCommand` to the path of the
hermesc binary file. node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc
```
#14394 restored `react.root` to its default (`../.. = packages/mobile`) to unblock the Hermes JS bundle's `entryFile` lookup. But the same gradle plugin uses `root` for hermesc detection too (`PathUtils.kt#detectOSAwareHermesCommand` → only checks `root/node_modules/react-native/sdks/hermesc/...`), and RN is hoisted to the monorepo `node_modules` so that path doesn't exist.
Set `react.hermesCommand` explicitly to the hoisted prebuilt:
```groovy
hermesCommand = "$rootDir/../../../node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc"
```
The `%OS-BIN%` placeholder is substituted by the plugin at runtime (linux64-bin / osx-bin / win64-bin). Verified all three subdirs exist in `node_modules/react-native/sdks/hermesc/` after `npm ci`.
Housekeeping
Test plan
🤖 Generated with Claude Code