React Native 0.88: SceneDelegate, iOS 27 and What to Upgrade

React Native 0.88 adds SceneDelegate support ahead of the iOS 27 SDK requirement and switches to web-style events. What changed, what to test and a sensible upgrade order.

Aditya BansalAditya BansalAuthor5 November 20264 min read 5 views
React Native 0.88: SceneDelegate, iOS 27 and What to Upgrade
In this article▾
  1. What is in 0.88
  2. The one to plan for: SceneDelegate
  3. Limitations to know before you start
  4. Event dispatching: low risk, test the edges
  5. Small wins: variable fonts and cleanups
  6. Support windows and when to upgrade
  7. A sensible upgrade order

React Native 0.88 landed on 19 October 2026 with a headline that sounds dull and is not: no user-facing breaking changes. The interesting part is underneath. It adds support for iOS's SceneDelegate lifecycle, which Apple will require once you build with the iOS 27 SDK, and it moves event dispatching to a web-style model by default. If you are on 0.85, you are now on an unsupported version. Here is what changed, what to test, and how I would plan the upgrade.

What is in 0.88

From the official release post:

  • Web-based event dispatching by default. Events now go through the W3C EventTarget model, with a real capture and bubble path.

  • Variable fonts through fontVariationSettings on Text and TextInput, on both platforms.

  • iOS SceneDelegate support, additive, so the AppDelegate path still works.

  • ArrayBuffer for Java TurboModules, so binary data no longer has to be encoded as strings or number arrays.

  • Swift Package Manager support, still experimental and opt-in. CocoaPods remains fully supported.

  • React 19.3.0 and Metro 0.87 under the hood. Expo users get 0.88 with Expo SDK 58.

The one to plan for: SceneDelegate

The release post is direct about why this matters: starting with the iOS 27 SDK, Apple requires the UIScene lifecycle, and UIKit apps built with Xcode 27 will fail to launch without it. You do not hit this until you move to the iOS 27 SDK. But you will move to it. Codeflamme's upgrade guide notes that Apple has required the iOS 26 SDK for App Store uploads since 28 April 2026 and expects the iOS 27 SDK to be required from April 2027. The timeline for our wider set of platform deadlines is in iOS 27 and Android 17: what mobile developers must do, and when.

React Native 0.88 gives RCTReactNativeFactory two new entry points that take a window and the scene's connection options:

  • startReactNativeWithModuleName:inWindow:connectionOptions:

  • startReactNativeWithModuleName:inWindow:initialProperties:connectionOptions:

The migration, per the release notes, is three steps:

  1. Move the React Native entry point from AppDelegate into a SceneDelegate.

  2. Forward the scene's URL and user-activity callbacks to RCTLinkingManager, so deep links keep working.

  3. Add a UIApplicationSceneManifest key to Info.plist.

The community template already has a SceneDelegate.swift and matching Info.plist for 0.88; copy from there or the Upgrade Helper rather than writing from scratch. The plist part looks like this, with multiple scenes turned off:

<key>UIApplicationSceneManifest</key>
<dict>
  <key>UIApplicationSupportsMultipleScenes</key>
  <false/>
  <key>UISceneConfigurations</key>
  <dict>
    <key>UIWindowSceneSessionRoleApplication</key>
    <array>
      <dict>
        <key>UISceneConfigurationName</key>
        <string>Default Configuration</string>
        <key>UISceneDelegateClassName</key>
        <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
      </dict>
    </array>
  </dict>
</dict>

Limitations to know before you start

  • Only a single scene is supported, so keep UIApplicationSupportsMultipleScenes false.

  • At launch, only the first URL context or user activity from the connection options is forwarded. If your app can be opened with several URLs at once, test that path.

  • The window is resizable. Dimensions.get() and useWindowDimensions() update with current values, so layouts that cached dimensions once at startup may need fixing.

Event dispatching: low risk, test the edges

The switch to web-style events keeps prop names, synthetic event objects and execution order the same. Error boundaries still catch errors synchronously, and the touch responder system is unchanged. The release post says what might break is code that reaches into React Native's event internals, because the plugin registry it may depend on is no longer the main path. There is no public opt-out; the legacy path is behind an internal flag and expected to be removed.

In practice: if you use a gesture library or anything that patches event plugins, check for an updated version before upgrading, and run your gesture-heavy screens on real devices.

Small wins: variable fonts and cleanups

If your design uses a variable font, you can now set axes directly:

<Text style={{ fontVariationSettings: { wght: 700, slnt: -10 } }}>Object form</Text>
<Text style={{ fontVariationSettings: "'wght' 700, 'slnt' -10" }}>String form</Text>

A few deprecations to clear while you are in there:

// Deprecated in 0.88
import 'react-native/Libraries/Core/InitializeCore';

// Use instead
import 'react-native/setup-env';
  • experimental_backgroundSize, experimental_backgroundPosition and experimental_backgroundRepeat are now stable without the prefix. The old names still work as aliases.

  • InputAccessoryView on iOS is deprecated; the release post suggests KeyboardStickyView from react-native-keyboard-controller as a cross-platform replacement.

  • On Android, the default User-Agent now includes your app name and version. If your backend keys anything off the old value, update it.

Support windows and when to upgrade

React Native supports the latest release plus the previous two minors. The support policy describes what each status means: the active version gets frequent patches, end-of-cycle versions get fixes only for important regressions, and unsupported versions should expect no new releases. With 0.88 out, 0.85 is unsupported and 0.86 is now the oldest supported line.

Codeflamme suggests upgrading every other release to stay inside the window with roughly one planned upgrade a quarter. It also reports 0.89 is scheduled for 7 December, with SwiftPM becoming the default there (CocoaPods remaining as an opt-out). My suggestion:

  • On 0.85 or older: plan the move to 0.88 now. You are outside support.

  • On 0.86 or 0.87: upgrade to 0.88 this quarter and do the SceneDelegate migration as a separate, testable change, not bundled with the version bump.

  • Any version: add a CI job that builds against release candidates published under the npm next tag, so 0.89's SwiftPM switch does not surprise you in December.

A sensible upgrade order

  1. Bump to 0.88 with the Upgrade Helper. No app code changes should be needed coming from 0.87.

  2. Update gesture, navigation and keyboard libraries to versions that mention 0.88.

  3. Fix deprecation warnings.

  4. Ship that. Then, in a separate release, adopt SceneDelegate and test deep links, universal links and rotation.

Splitting the two keeps any regression easy to trace. On the Android side, keep an eye on your target API too; our target API 36 checklist covers the current Play requirement. Versions and dates are as of late October 2026.

Keep reading

More from Aditya Bansal

More from Aditya Bansal

More in Mobile App Development

Have a story of your own?

Publisha is free to start. Write with AI that keeps your voice, and publish in a click.