Expo SDK 58
Build Expo SDK 58 apps on Ubriot: toolchain requirements, OTA runtime versions and fixes for common upgrade failures.
Expo SDK 58 moves to React Native 0.88 and the iOS 27 SDK. Ubriot builds Expo SDK 58 apps for iOS and Android, with Xcode 26.4+ and Node 22.13+ chosen per build. Ubriot reads each project's SDK before a build starts, and older SDKs keep their current toolchain.
What Ubriot does today
- Detection of Expo SDK 58 and bare React Native 0.88 projects, and selection of Xcode and Node.js per build on workers that have them.
- A check before queueing:
ubriot ship,ubriot builds createand the dashboard warn when no build worker has the Xcode or Node.js the project needs. The CLI check requires ubriot 1.4.0 or later. - The detected SDK, React Native, Xcode and Node.js versions on every build in the dashboard.
- Plain-language diagnosis of the common SDK 58 failures listed below.
ubriot-updates-rn0.4.0, which builds and type-checks against React Native 0.88, for bare apps.
On its way to npm
On its way to npm
Toolchain requirements
| Tool | Needed | Notes |
|---|---|---|
| Xcode | 26.4 or newer | Xcode 27 recommended. SDK 58 targets the iOS 27 SDK, and Xcode 27 needs macOS 26.6 or later. |
| Node.js | 22.13 or newer | Or 24.3 and newer on the 24 line, or an even release from 26. Odd releases such as 23 and 25 are not supported. |
| React Native | 0.88 | Bare apps on React Native 0.88 or newer get the same toolchain as SDK 58. |
| Android | compileSdk 37, targetSdk 36 | Minimum Android 7. R8 minification is on for release builds by default. |
| iOS | 16.4 or newer | Apps launch through the UIScene life cycle (SceneDelegate.swift). |
Older SDKs keep building with the worker's default Xcode and Node.js. When a self-hosted worker is missing a tool, the build stops before installing dependencies and names what to install. Ubriot never changes the machine's default Xcode or Node.js.
When no worker has what the project needs, the CLI asks before queueing:
ubriot ship iosDetected Expo SDK 58 (React Native 0.88.0).
Warning: Expo SDK 58 needs Xcode 26.4 or newer (Xcode 27 recommended), and no build worker has it.
Queue the build anyway? [y/N]OTA updates after the upgrade
Upgrading to SDK 58 changes native code, so JavaScript built for SDK 58 must never reach a binary built with an older SDK. Give the SDK 58 build a new runtimeVersion before you ship it:
runtimeVersionset by hand, or theappVersionpolicy: bump it (or the app version) in the same change as the SDK upgrade.- The
sdkVersionpolicy changes on its own. Thefingerprintpolicy also changes, and SDK 58 switches fingerprints to the balanced preset, so expect a new value. - Bare apps on ubriot-updates-rn: bump the runtime version you pass when publishing.
Ship the new binary first, then publish SDK 58 updates to the new runtime. Devices still on the old binary keep receiving updates published to the old runtime. Before publishing, ubriot update shows how many devices the runtime reaches. Run it with Node.js 22.13 or newer, since it runs expo export locally.
ubriot update --app my-app --channel production --runtime-version 2.0.0Common failures and fixes
R8 missing classes
Symptom: Missing classes detected while running R8, or Execution failed for task ':app:minifyReleaseWithR8'.
Copy the rules from android/app/build/outputs/mapping/release/missing_rules.txt into extraProguardRules in expo-build-properties, or set android.enableMinifyInReleaseBuilds to false there while the library is fixed.
AppDelegate and SceneDelegate
Symptom: Compile errors in AppDelegate.swift, such as cannot find 'window' in scope, or a missing SceneDelegate.
If your ios folder is generated, delete it so the build runs expo prebuild again. If you edit AppDelegate.swift by hand or in a config plugin, follow Expo's scene life cycle guide and move window setup and URL handling to the scene delegate.
Xcode 27 required
Symptom: Expo SDK 58 needs Xcode 26.4 or newer, or SDK "iphoneos27.0" cannot be located.
The build stopped before installing anything because the worker has no suitable Xcode. Self-hosted workers: install Xcode 27 next to your current Xcode. Builds of older SDKs keep their Xcode.
Node.js too old
Symptom: Expo SDK 58 needs Node.js 22.13 or newer, or The engine "node" is incompatible with this module.
Self-hosted workers: run nvm install 22. For ubriot update, upgrade the Node.js in your own terminal or CI.
Deep react-native imports
Symptom: Unable to resolve module react-native/Libraries/..., or type errors on react-native/Libraries imports.
Import from react-native instead, or update the library that uses the deep path. To defer only the type migration, add "customConditions": ["react-native", "react-native-legacy-deep-imports"] to tsconfig.json. That opt-out is due to be removed after React Native 0.89.
Custom NODE_ENV
Symptom: A staging build loads production values, or a custom NODE_ENV value is replaced.
Expo CLI now sets NODE_ENV to production for every release build. Use a separate variable such as APP_ENV or EXPO_PUBLIC_APP_ENV for variants, or move the values into .env.production.
Ubriot recognises these in the build output and shows the fix on the failed build.