Skip to content

chore(example): upgrade to Expo SDK 57 for Xcode 27 and iOS 27 - #68

Merged
janicduplessis merged 2 commits into
mainfrom
@janic/example-ios27
Oct 15, 2026
Merged

janicduplessis merged 2 commits into
mainfrom
@janic/example-ios27

Conversation

@janicduplessis

@janicduplessis janicduplessis commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

The example app (Expo SDK 55) doesn't work with Xcode 27. The build fails, and once you get past that, the app exits at launch on iOS 27 simulators with UIScene life cycle is required for apps built with this SDK. This PR moves the example to Expo SDK 57 / React Native 0.86.3 and opts in to the scene lifecycle. Only example/package.json, example/app.json and yarn.lock change. ios/ and android/ are still generated by prebuild.

CI still builds the example with Xcode 26. I haven't run it on that toolchain, so watch the build-ios and build-android jobs.

  • SDK 57 is the current stable release. SDK 58, where the scene lifecycle is the default, is still in beta. On SDK 57, expo-router no longer pulls in expo-image, so the SDWebImage pod with its 9.0 deployment target is gone. The app target is now at iOS 16.4, which ExpoRouter.podspec also requires, so the iOS 16-only API in expo-router compiles. The @react-native/* and CLI devDependencies now match RN 0.86.3.
  • Scene lifecycle: set expo-build-properties ios.enableSceneSupport (Expo's SDK 57 instructions). With it, prebuild adds a UIApplicationSceneManifest that uses EXExpoAppSceneDelegate. Remove this setting when moving to SDK 58, where the scene lifecycle is already on.
  • react-native-builder-bob ^0.43.2: SDK 57's Metro calls the Babel config without a filename, so bob 0.40's getConfig threw Configuration contains string/RegExp pattern, but no filename was passed to Babel. callstack/react-native-builder-bob@ca7bdc0 fixes it.
  • uniwind ^1.6.3: with 1.6.1, every bundle failed with Unexpectedly escaped traversal from @expo/metro-file-map in this monorepo layout. This is Metro Unexpectedly escaped traversal invariant in nativeResolver during Expo eager bundle聽uni-stack/uniwind#505, fixed by fix: use node resolver to prevent escaped traversal errors聽uni-stack/uniwind#506. The lockfile now resolves to 1.12.2.

The root package.json stays on react-native 0.83.0 for Jest/tsc. react-native-monorepo-config still points the example's Metro at its own 0.86.3 copy.

Test Plan

Ran from example/, using a Debug simulator build from expo prebuild --clean:

  • iOS 27.1 simulator (Xcode 27.0, 27A266a): build and launch with no redbox and no error logs. I opened every demo and issue reproducer through ease-example://<route> warm deep links, which also exercises URL forwarding through the scene delegate.
    • The Loop demos animate: Spin, Pulse, Banner marquee.
    • Comparison runs Reanimated next to ease.
    • Benchmark reports frame times from the local frame-metrics module.
  • iOS 18.6 simulator (iPhone 16): launches. I spot-checked the same screens. The Loop demos animate and safe areas look right.
  • Android (API 30 emulator): builds and launches. The home screen and Comparison loops render and animate.
  • Web (expo start --web): the home screen and /banner render.

- Bump the example to Expo SDK 57 / React Native 0.86.3 and align the
  React Native tooling devDependencies and gradle-plugin resolution.
- Opt in to the UIKit scene lifecycle with expo-build-properties
  ios.enableSceneSupport, which iOS 27 requires at launch.
- Bump react-native-builder-bob to 0.43.2 so its babel-config handles
  Expo calling the Babel config without a filename.
- Bump uniwind to 1.6.3+ to fix the Metro "Unexpectedly escaped
  traversal" invariant when the server root is the monorepo root.
@vercel

vercel Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
react-native-ease Ignored Ignored Preview Oct 15, 2026 1:22pm UTC

Request Review

@janicduplessis
janicduplessis marked this pull request as ready for review October 15, 2026 15:07
@janicduplessis
janicduplessis merged commit 607e076 into main Oct 15, 2026
8 checks passed
@janicduplessis
janicduplessis deleted the @janic/example-ios27 branch October 15, 2026 15:07
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.

1 participant