Ubriot Docs

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 create and 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-rn 0.4.0, which builds and type-checks against React Native 0.88, for bare apps.

On its way to npm

This needs ubriot 1.4.0, which is on its way to npm. The current npm release is 1.2.0.

On its way to npm

This needs ubriot-updates-rn 0.4.0, which is on its way to npm. The current npm release is 0.2.0.

Toolchain requirements

ToolNeededNotes
Xcode26.4 or newerXcode 27 recommended. SDK 58 targets the iOS 27 SDK, and Xcode 27 needs macOS 26.6 or later.
Node.js22.13 or newerOr 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 Native0.88Bare apps on React Native 0.88 or newer get the same toolchain as SDK 58.
AndroidcompileSdk 37, targetSdk 36Minimum Android 7. R8 minification is on for release builds by default.
iOS16.4 or newerApps 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 ios
Detected 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:

  • runtimeVersion set by hand, or the appVersion policy: bump it (or the app version) in the same change as the SDK upgrade.
  • The sdkVersion policy changes on its own. The fingerprint policy 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.0

Common 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.

On this page