Skip to content
useffect.sh
Book 30 min with a senior
Guide · iOS

iOS 27 SDK required from April 2027: what it means for React Native and Expo

From April 2027, every app uploaded to App Store Connect must be built with the iOS 27 SDK. For a React Native app this is not just an Xcode bump: built with that SDK, an app that has not adopted the UIScene life cycle does not launch.

By Jérémy Magrin ·

Short answer

Apple announced it on September 9, 2026: starting April 2027, iOS and iPadOS apps uploaded to App Store Connect must be built with the iOS 27 SDK or later, which means Xcode 27, and so macOS Tahoe 26.6. The exact day has not been published. For React Native and Expo, this SDK change has two effects. First, an app built with the iOS 27 SDK must adopt the UIScene life cycle, or it does not launch. React Native 0.88 is the first version to support it; no 0.87 or 0.86 patch has received it. Expo SDK 58 generates the setup by default, and SDK 57 offers it as an opt-in since expo 57.0.23. Second, the UIDesignRequiresCompatibility key, which turned off Liquid Glass, is ignored. A team should therefore plan the move to React Native 0.88 or Expo SDK 58, migrate its AppDelegate and review its UI before spring.

Every spring, Apple raises the minimum Xcode version required to ship. Usually that means a new CI image and a few build warnings. This year, the iOS 27 SDK forces an architectural change in how the app starts, and React Native has only supported it since 0.88. This guide goes back to the primary sources and lays out what a React Native or Expo team needs to do before April 2027.

The calendar

On September 9, 2026, when it opened submissions for iOS 27, Apple published the following rule (opens in a new window): "Starting April 2027, apps and games uploaded to App Store Connect need to meet the following minimum requirements", including "iOS and iPadOS apps must be built with the iOS 27 & iPadOS 27 SDK or later".

DateEventSource
April 28, 2026Requirement in force: Xcode 26 and the iOS 26 SDKUpcoming requirements (opens in a new window)
June 30, 2026Expo SDK 57 (React Native 0.86)Expo changelog (opens in a new window)
September 9, 2026iOS 27 submissions open; April 2027 requirement announcedApple Developer News (opens in a new window)
September 15, 2026expo 57.0.23: opt-in UIScene life cycle support on SDK 57expo.fyi (opens in a new window), npm
October 15, 2026React Native 0.88 on npm (SceneDelegate support, announced October 19) and Expo SDK 580.88 post (opens in a new window), Expo changelog (opens in a new window)
October 21, 2026Expo upgrade guide: the sdk-58 and latest EAS aliases move to Xcode 27.1Expo blog (opens in a new window)
November 1, 2026Google Play: extensions for targeting API 36 endPlay Console Help (opens in a new window)
April 2027 (day not published)App Store Connect uploads: iOS 27 SDK or later requiredApple Developer News (opens in a new window)

Three notes.

The day is not known. On the developer forums (opens in a new window), an Apple engineer replies that Apple is unable to "disclose, confirm, or comment on exact dates for future SDK requirements" before they are officially announced. As of October 27, 2026, the Upcoming requirements (opens in a new window) page does not list the April 2027 requirement yet.

The SDK implies Xcode 27. Apple talks about SDKs, not Xcode, but the iOS 27 SDK only ships with Xcode 27. Per the system requirements page (opens in a new window), Xcode 27, 27.1 and 27.2 RC require "macOS Tahoe 26.6 or later". Build Macs and CI runners are affected too.

The submission page (opens in a new window) adds "and target iOS 15 or later" for April 2027, while the requirements page says "must target iOS 13 or later" since September 9, 2026. The two thresholds apply at different dates, and the difference has no practical effect: Expo SDK 56 to 58 already require iOS 16.4 at minimum, per the versions table (opens in a new window).

What the iOS 27 SDK changes for a React Native app

The UIScene life cycle becomes mandatory

This is the blocker. The UIKit documentation (opens in a new window) is unambiguous: "Adopting the scene-based life cycle is required. Beginning in iOS 27, iPadOS 27, Mac Catalyst 27, tvOS 27, and visionOS 27, apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch."

Apple considers that an app must migrate if either condition holds: the UIApplicationSceneManifest key is missing from Info.plist or declares no configuration, or the app delegate does not implement application(_:configurationForConnecting:options:). Up to React Native 0.87, the template meets both conditions: AppDelegate creates the window in didFinishLaunchingWithOptions and Info.plist declares no scene.

The requirement is tied to the SDK, not to the user's iOS version. An Apple engineer says so on the forums (opens in a new window): "The requirement is enforced when building with the new 27.0 SDKs (all of them). If you continue to build with the older SDKs, the requirement is not enforced." That is why April 2027 is the real deadline: as long as you build with Xcode 26, nothing breaks; the day App Store Connect rejects Xcode 26, the migration becomes mandatory. In another thread (opens in a new window), an Apple engineer tells a developer whose apps still rely on AppDelegate: "My personal suggestion is recommending that you prioritize migrating your legacy codebases to the scene-based lifecycle."

The migration is more than adding a file. Under the scene-based life cycle, UIKit no longer calls some UIApplicationDelegate methods. The Expo migration guide (opens in a new window) lists them:

  • application(_:open:options:), which receives deep links;
  • application(_:continue:restorationHandler:), which receives universal links and Handoff;
  • applicationDidBecomeActive(_:), applicationWillResignActive(_:), applicationDidEnterBackground(_:) and applicationWillEnterForeground(_:);
  • application(_:performActionFor:completionHandler:), for quick actions.

Without event forwarding, any native code hooked into these methods, in your AppDelegate or in a library that intercepts it, stops receiving events (Expo forwards them, see below). The symptoms are quiet: a deep link that opens the app without navigating, a quick action that does nothing, an analytics SDK that no longer sees the app come back to the foreground.

Liquid Glass can no longer be turned off

Many apps added UIDesignRequiresCompatibility to their Info.plist in 2026 to keep the pre-Liquid Glass look. The key's documentation (opens in a new window) describes it as temporary and states: "The system ignores this key when you build for iOS 27 or later". Your app's native components, navigation bars, tab bars, alerts, will take on the Liquid Glass look with the first Xcode 27 build.

iPhone apps become resizable

The Expo SDK 58 changelog (opens in a new window) says iOS 27 "makes iPhone apps resizable", that requireFullScreen no longer opts out, and that ScreenOrientation.lockAsync "may have no effect while the app is resizable". The React Native 0.88 post (opens in a new window) confirms that under UIScene the window is resizable and that Dimensions.get() and useWindowDimensions() follow its size. An app that assumes a fixed screen or a locked portrait orientation needs retesting.

Tooling moves too

Xcode 27 replaces Simulator.app with Device Hub; Expo CLI has supported it since SDK 58. On the CocoaPods side, issue #12927 (opens in a new window), opened September 24, 2026 and still unanswered on October 27, reports that a project created from the Xcode 27.0 template has objectVersion = 110 and makes pod install fail. We did not verify whether Xcode 27 rewrites that value in an existing project. Our guide on the CocoaPods trunk going read-only covers this point.

Where React Native stands

React Native 0.88, published to npm on October 15, 2026 and announced on October 19, is the first version that supports the UIScene life cycle. The post is explicit: "Starting with the iOS 27 SDK, Apple requires the UIScene lifecycle: UIKit apps built with Xcode 27 will fail to launch." The support is additive: the AppDelegate path stays compatible, and RCTReactNativeFactory gains two entry points, startReactNativeWithModuleName:inWindow:connectionOptions: and its variant with initialProperties.

VersionStatusMinimum XcodeUIScene life cycle
0.88Latest stable26.0Supported
0.87Supported26.0No (0.87.1, August 26, 2026)
0.86Supported16.1No (0.86.3, August 24, 2026)
0.85 and olderUnsupported since 0.88 (inferred from the latest-3-minors policy)Varies by versionNo

The Xcode column comes from the releases working group's support table (opens in a new window); the UIScene column from the CHANGELOG (opens in a new window), where the "Add SceneDelegate lifecycle support" entry only appears under v0.88.0. The 0.88 post does not say whether a backport is planned. A minimum Xcode of 26.0 means the version builds with Xcode 26; it does not guarantee that an app without scenes launches when built with Xcode 27.

To migrate a bare React Native app, the post lists three steps:

  • move the React Native entry point from your AppDelegate to a SceneDelegate;
  • forward the scene's URL and user-activity callbacks to RCTLinkingManager;
  • add a UIApplicationSceneManifest key to Info.plist.

The community template is already updated: the SceneDelegate.swift (opens in a new window) and Info.plist (opens in a new window) files on the 0.88 branch are the reference, and the upgrade helper (opens in a new window) shows the full diff.

Two limits to know. Support in 0.88 is "limited to a single scene", so UIApplicationSupportsMultipleScenes must stay false. And at launch, React Native only forwards the first URL context or user activity the scene receives.

Per its post, 0.88 has "no user-facing breaking changes" compared with 0.87. An app on 0.86 or older, however, stacks several version upgrades, each with its own changes.

Where Expo stands

Expo got ahead of this, with a path per SDK version.

SDK 58 (October 15, 2026, React Native 0.88) is "built for iOS 27". npx expo prebuild generates SceneDelegate.swift and the UIApplicationSceneManifest entry, and the window is created by the scene delegate (PR #46733 (opens in a new window), #46734 (opens in a new window)). Expo forwards URL, user activity, Handoff, life cycle and quick action events to ExpoAppDelegate overrides and to ExpoAppDelegateSubscribers, which keeps existing config plugins working (#49925 (opens in a new window), #50032 (opens in a new window)).

SDK 57 keeps the old life cycle by default. Since expo@57.0.23, the ios.enableSceneSupport property of expo-build-properties (57.0.20 or newer) turns it on (Expo guide (opens in a new window)). The plugin only edits the template AppDelegate: if yours differs, or if Info.plist already declares a scene manifest, it refuses to overwrite and the migration is manual. Expo presents this option as a way to build with Xcode 27 "before upgrading to SDK 58".

SDK 56 and older: Expo's sources document no path to Xcode 27.

The Expo migration guide is clear about who needs to act:

  • nothing to do for a Continuous Native Generation (opens in a new window) project whose native code goes through config plugins or Expo modules: npx expo prebuild --clean is enough;
  • action required if the ios folder is maintained by hand, for a bare React Native app that uses Expo modules (npx install-expo-modules@latest does the migration), or if code overrides UIApplicationDelegate methods directly;
  • a library that expects UIKit to call applicationDidBecomeActive(_:) on the app delegate must move to the scene-side equivalent or to ExpoAppDelegateSubscriber.

On EAS Build, the image matters as much as the SDK. Per the infrastructure reference (opens in a new window):

AliasImageXcode
latest, sdk-58macos-tahoe-26.6-xcode-27.127.1 RC
no aliasmacos-tahoe-26.6-xcode-27.027.0
sdk-57macos-tahoe-26.5-xcode-26.626.6
sdk-56macos-tahoe-26.4-xcode-26.426.4
auto (default)selected per projectdepends on the SDK

Without an image pinned in eas.json, EAS uses the auto alias, which picks the image by SDK version. For SDK 57, Expo’s infrastructure reference implies an Xcode 26 image (the sdk-57 alias points to Xcode 26.6), to confirm in the "Spin up build environment" section of the build log. That build will no longer pass in April 2027. To stay on SDK 57 with Xcode 27, turn on enableSceneSupport and pin an Xcode 27 image in eas.json.

Two SDK 58 changes also affect the UI: on iOS 26 and later, the Expo Router Stack header is transparent with Liquid Glass by default and content goes under it (Router migration guide (opens in a new window)), and expo-glass-effect reports isLiquidGlassAvailable as true in apps built with the iOS 27 SDK.

Check your app

Five checks, to run at the project root. On an Expo project using Continuous Native Generation, generate the native folder first with npx expo prebuild --platform ios.

# 1. React Native and Expo versions
npm ls react-native expo

# 2. Is the scene manifest declared?
grep -c UIApplicationSceneManifest ios/*/Info.plist

# 3. Does the app turn off Liquid Glass?
grep -rn UIDesignRequiresCompatibility ios/*/Info.plist app.json app.config.* 2>/dev/null

# 4. AppDelegate callbacks that will no longer be called
grep -nE 'open url|openURL|continue userActivity|continueUserActivity|DidBecomeActive|WillResignActive|DidEnterBackground|WillEnterForeground|performActionFor' ios/*/AppDelegate.*

# 5. EAS image pinned by hand
grep -n '"image"' eas.json

A 0 at step 2 on an app that will be built with Xcode 27 means a launch failure. Each line from step 4 is a behavior to retest under UIScene. Then make a build with Xcode 27 and run it on an iOS 27 simulator: per the Expo guide, a black screen at launch points to a missing scene manifest or SceneDelegate, or a UISceneDelegateClassName that does not resolve.

The path to test by hand after the migration: opening from a deep link with the app closed and open, a universal link, tapping a push notification, a home-screen quick action, going to the background and back, rotation and resizing. Expo flags one specific case: if Linking.getInitialURL() returns null on cold start, update the SDK 58 expo package, fixed by PR #47628 (opens in a new window).

What about Google Play?

No comparable deadline in the short term. Per Google's page (opens in a new window), since August 31, 2026, "New apps and app updates must target Android 16 (API level 36) or higher", and existing apps must target Android 15 (API 35) to remain available to new users whose devices run an Android version higher than the app's target API. Teams that requested an extension have until November 1, 2026. Expo SDK 57 and 58 already target API 36. As of October 27, 2026, the page gives no requirement for 2027.

What we recommend

In order.

  1. For each app, list the React Native or Expo version, the EAS build image or CI Xcode version, and the macOS version of the runners.
  2. Move build Macs and runners to macOS Tahoe 26.6 or later, a prerequisite for installing Xcode 27.
  3. Plan the move to React Native 0.88 or Expo SDK 58. On SDK 57, enableSceneSupport is a bridge, not a destination.
  4. Migrate the AppDelegate to the UIScene life cycle, and list every native library that hooks into app delegate callbacks: push, attribution, deep links, analytics.
  5. Remove UIDesignRequiresCompatibility, do a visual review under Liquid Glass, and retest screens with a locked orientation.
  6. Ship an Xcode 27 build to production well before April. Our advice: February 2027 at the latest, to keep room if an urgent fix comes up in spring.
  7. On Android, check that every app targets API 36, especially if it was running on an extension.

The collective can run this audit if you would rather hand it off.

What we do not know yet

  • The exact day in April 2027. In 2026, the equivalent requirement took effect on April 28.
  • Whether React Native will backport SceneDelegate support to 0.87 or 0.86. Nothing is announced.
  • When React Native will support multiple scenes; 0.88 is limited to one.
  • How each third-party native SDK (push, attribution, payments) behaves under UIScene in a bare React Native app. No consolidated list exists.
  • Whether Xcode 27 moves existing projects to objectVersion = 110, and when CocoaPods will fix issue #12927.
  • Google Play's target API requirement for 2027.

This guide will be updated as these points get settled. The last revision date is at the top of the page.

Sources

Common questions

What is the exact date of the requirement?

Apple writes "Starting April 2027", with no day. Asked on the developer forums, an Apple engineer replied that Apple does not share exact dates for future SDK requirements before they are officially announced. The previous requirement, Xcode 26 and the iOS 26 SDK, took effect on April 28, 2026. Plan as if the requirement lands on April 1, 2027.

Will my published app disappear from the App Store in April 2027?

No. The requirement applies to builds uploaded to App Store Connect. An Apple engineer states that the UIScene requirement is tied to building with the iOS 27 SDK, and that apps built with an earlier SDK keep working as before. From April 2027, however, no update, including an urgent fix, can be uploaded without the iOS 27 SDK.

Can we stay on React Native 0.87 or older?

Not if you want to ship after April 2027. An app built with the iOS 27 SDK without the UIScene life cycle does not launch. React Native 0.88, released October 15, 2026, adds the SceneDelegate entry points. The latest 0.87.1 and 0.86.3 patches do not include them, and there is no official procedure for older versions. Moving to 0.88 is the documented path for a bare React Native app. One exception: on Expo SDK 57 (React Native 0.86), the ios.enableSceneSupport option lets you build with Xcode 27, see below.

Is my Expo app ready?

On SDK 58, npx expo prebuild generates SceneDelegate.swift and the scene manifest: a Continuous Native Generation project has nothing more to do. On SDK 57 you need expo 57.0.23 or newer, the ios.enableSceneSupport property of expo-build-properties 57.0.20 or newer, and an Xcode 27 EAS image, since the sdk-57 alias points to Xcode 26.6. For SDK 56 and older, Expo documents no path to Xcode 27.

What changes on screen?

The UIDesignRequiresCompatibility key, which kept the old look instead of Liquid Glass, is ignored by the system once the app is built for iOS 27. Separately, per Expo, iOS 27 makes iPhone apps resizable: requireFullScreen no longer applies, and an orientation lock may have no effect while the app is resizable.

What about Google Play?

Since August 31, 2026, new apps and app updates must target Android 16 (API 36). Granted extensions run until November 1, 2026. Expo SDK 57 and 58 already target API 36. The 2027 requirement is not yet published on Google's page.

Is your app ready for Xcode 27?

30 minutes with a senior engineer to scope your move to React Native 0.88 or Expo SDK 58 before April 2027. Free.