Skip to content

Update Expo SDK 56 dependencies and fix Xcode 27 scene lifecycle plugin#658

Open
wyne wants to merge 6 commits into
mainfrom
claude/expo-version-check-jfa66p
Open

Update Expo SDK 56 dependencies and fix Xcode 27 scene lifecycle plugin#658
wyne wants to merge 6 commits into
mainfrom
claude/expo-version-check-jfa66p

Conversation

@wyne

@wyne wyne commented Jun 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • Update Expo SDK 56 dependencies to the latest recommended patch versions (expo install --check)
  • Add and iterate on the expo-ios-scene-lifecycle-plugin workaround for Xcode 27 beta, replacing the npm package with a local fixed copy that handles indented #endif and code injected between UIWindow and startReactNative

Test plan

  • Local EAS iOS build succeeds on Xcode 27
  • App launches without scene lifecycle crash

🤖 Generated with Claude Code

claude added 4 commits June 14, 2026 06:40
Expo SDK 56 prebuild templates crash on iOS 27 / Xcode 27 beta because
Apple now requires the UIKit scene-based lifecycle. This temporary plugin
patches Info.plist and AppDelegate.swift during prebuild until Expo adds
native support.

Ref: expo/expo#46664

https://claude.ai/code/session_01WYWCN8jNbVMaUXFTp3GREU
The plugin regex assumed #endif was unindented, but Expo SDK 56's generated
AppDelegate.swift indents it with 4 spaces, causing the pattern match to fail.
Changed \n#endif to \n[ \t]*#endif to allow leading whitespace.

https://claude.ai/code/session_01WYWCN8jNbVMaUXFTp3GREU
The EAS local build runs npm install without scripts, so patch-package
never applies. Moving the plugin inline to plugins/withIosSceneLifecycle.js
ensures the regex fix (allowing indented #endif) is always in effect.

https://claude.ai/code/session_01WYWCN8jNbVMaUXFTp3GREU
…nd startReactNative

The previous approach matched the UIWindow creation and factory.startReactNative
as a single adjacent block, but other plugins (Firebase, TouchVisualizer) inject
code between them in this project's AppDelegate.swift.

Now each line is targeted and wrapped independently with if #unavailable(iOS 13.0),
preserving all injected code while correctly gating the scene-incompatible calls.

https://claude.ai/code/session_01WYWCN8jNbVMaUXFTp3GREU
@github-actions

Copy link
Copy Markdown
Contributor

Coverage after merging claude/expo-version-check-jfa66p into main will be

60.88%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
redux
   GamesSlice.ts54.09%27.50%56.52%64.58%101, 109, 131–133, 148, 167, 178, 185, 187, 190–192, 242, 256, 269, 278–279, 279, 279, 285, 285, 285–286, 288, 29, 290–291, 294, 294, 294, 294, 294–295, 298–299, 301, 303, 303, 303, 303, 303–304, 306, 306, 306, 308–309, 312, 312, 312, 314, 52, 63, 80, 85–86, 86, 86, 98–99, 99, 99
   PlayersSlice.ts89.90%100%87.50%85.11%103, 105, 33, 50–51, 68–69
   SettingsSlice.ts46.81%25%42.11%54.17%101, 104, 54, 57, 63, 66, 72, 75, 84, 84, 84, 90, 93, 98
   backup.ts0%0%0%0%11, 27–29, 31, 45–49, 51, 51, 51–52, 57, 60, 64–66, 71, 71, 71, 73–75, 78–79, 81–82, 85, 85, 85, 85, 85–87, 90–93, 95, 97
   hooks.ts100%100%100%100%
   selectors.ts100%100%100%100%
   store.ts0%0%0%0%10, 12, 12, 12–13, 13, 13–15, 18, 21–23, 23, 23, 23, 23–24, 28, 54, 61, 68, 75, 93
   testStore.ts0%100%0%0%11–15, 20–23, 25, 42–44, 5
src
   Analytics.ts100%100%100%100%
   ColorPalette.ts100%100%100%100%
   Logger.ts91.23%87.50%81.82%94.74%14–15, 22
   Navigation.tsx75.68%72.73%62.50%83.33%45, 49, 70, 73, 79–80
   constants.ts100%100%100%100%
   theme.ts93.75%85.71%100%100%79
src/components
   EditGame.tsx81.40%70%71.43%88.46%25, 39, 64, 64, 64–65
   FloatingActionButton.tsx68.97%100%50%73.68%38, 41–42, 55–56
   GameListItem.tsx66.10%47.83%100%73.33%103, 20, 23–24, 24, 24–26, 26, 26–28, 28, 28–30, 30, 30–31, 73
   GameListItemPlayerName.tsx100%100%100%100%
   MenuOpenContext.tsx87.50%100%66.67%100%
   PlayerListItem.tsx0%0%0%0%123, 123, 134, 24, 32–34, 34, 34–38, 40, 40, 40, 40, 40–41, 41, 41–42, 42, 42, 44–45, 56, 63–64, 66, 72–73, 76, 79, 82–83, 90, 93, 93, 96, 96, 96–97, 99
   ScoreLogTable.tsx92.59%82.35%100%96.15%50, 52, 54, 54
   SplashOverlay.tsx0%0%0%0%22–24, 24, 24, 26–28, 30, 32–33, 35, 37, 40, 40, 40, 43, 49, 53, 58, 74
src/components/AppInfo
   RotatingIcon.tsx0%0%0%0%18–19, 21–24, 26, 28–30, 37–38, 40, 40, 40–41, 44, 44, 44–48, 51, 53–54, 59
   SeedData.ts0%100%0%0%17, 47, 49–50, 52, 54–56, 58–60, 62, 68, 71, 82–85
src/components/BigButtons
   BigButton.tsx0%0%0%0%18, 18–20, 22–23, 23, 25, 25–26, 26, 48
src/components/Boards
   ListBoard.tsx86.81%72.73%84.21%98.57%123, 180, 206–207, 220, 223, 262, 29, 33, 59–61, 84, 84, 88, 92
   PlayerTile.tsx0%0%0%0%29, 39, 39, 39, 39, 39–40, 40, 40, 40, 40, 42–46, 46, 46–47, 47, 47, 47, 47–48, 48, 48–50, 50, 50, 52–54, 54, 54, 56, 59, 59, 63–64, 67–68, 70, 80, 80, 97
   TileBoard.tsx96.39%90.32%100%100%18, 78, 92
src/components/Buttons
   AppSettingsButton.tsx100%100%100%100%
   BackButton.tsx0%100%0%0%16–18, 20–21
   GameOptionsButton.tsx53.40%45%75%54.90%100, 118, 118, 118, 118, 118, 118, 118, 120–122, 124–126, 128–130, 132–135, 137–139, 141–143, 150, 156–157, 168, 170, 170, 176, 176, 176, 176, 38, 44, 46, 56, 63, 71, 92, 96
   HeaderButton.tsx100%100%100%100%
src/components/ColorPalettes
   ColorSelector.tsx100%100%100%100%
   PalettePreview.tsx0%0%0%0%10–12, 14, 19, 19, 25
   PaletteSelector.tsx0%0%0%0%13, 15–18, 20, 22, 22, 22, 24–25, 31, 37, 40, 45, 56
src/components/Headers
   RoundHeaderTitle.tsx0%0%0%0%12–14, 16, 18, 18, 18, 20–21, 21, 21–22, 22, 22, 24–25, 27–28, 28, 28, 28, 28, 30–31, 31, 34–35, 44–45, 45, 45, 47–49, 57, 59, 62, 62, 62, 62, 64, 64, 70, 70, 70, 70, 73, 73, 73, 73, 73, 75, 75,

claude added 2 commits June 16, 2026 03:05
Xcode 27 beta requires all pod targets to have IPHONEOS_DEPLOYMENT_TARGET >= 15.0,
but many third-party pods (AsyncStorage, RNSVG, Firebase/Google libs) still ship
with older minimums (9.0 - 13.4). Injects a post_install Ruby hook into the Podfile
to raise any sub-15.0 target at pod install time.

https://claude.ai/code/session_01WYWCN8jNbVMaUXFTp3GREU
Swift 6.2 (bundled with Xcode 27 beta) no longer accepts `weak let` since
weak references are implicitly mutable. expo-modules-jsi@56.0.7 uses this
pattern in 15 Swift files, causing the ExpoModulesJSI xcframework build to
fail silently with exit code 1.

Adds a Podfile post_install hook to rewrite `weak let` →
`nonisolated(unsafe) weak var` across all ExpoModulesJSI Swift sources
after pod install but before xcodebuild runs the xcframework build script.

Ref: expo/expo#46242

https://claude.ai/code/session_01WYWCN8jNbVMaUXFTp3GREU
@wyne wyne force-pushed the claude/expo-version-check-jfa66p branch from c6ebf84 to ffde889 Compare June 16, 2026 03:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants