Feature Requests

With Expo, you can write iOS and Android experiences in JavaScript using React Native.
First-class expo-webview module
DESCRIPTION: react-native-webview is widely used, but maintenance feels stale. Critical issues like https://github.com/react-native-webview/react-native-webview/issues/3776 and https://github.com/react-native-webview/react-native-webview/issues/3825 have been open for a long time. Expo already ships @expo/dom-webview for DOM components ( https://www.npmjs.com/package/@expo/dom-webview ), but it does not have full feature parity with react-native-webview and is scoped to DOM components. Proposal: ship a first-class expo-webview at the same quality bar as expo-file-system, expo-location, and expo-notifications. Use case I had not used WebViews much until I needed to embed an existing e-commerce site in Expo and communicate over postMessage. Many teams cannot afford to rewrite their web storefront in React Native. WebViews are not only useful for privacy-policy screens — they are a practical way to ship existing web apps inside Expo while adding native capabilities (Apple Pay, etc.) via postMessage. I am not alone: others in the Expo community are running into the same class of problems. This Discord thread describes an Expo Router app that wraps an existing mobile-friendly website with tabbed WebViews — the first tab loads fine, but others often hang mid-load or fail to load images; on iOS, incognito={true} fixes loading but breaks shared login state across tabs: https://discord.com/channels/695411232856997968/1360649231576338542 If you are doing something similar — loading a WebView, communicating with postMessage, and exposing native features to a web app that will not be rewritten soon — please comment and upvote. Baseline expectations postMessage(string) — apps define their own message shape; I typically use { type: 'web/feature/action', payload: any } and receive { type: 'native/feature/actionSuccess|Failure' } Pull to refresh Back navigation Overall stability comparable to what native developers get from platform WebViews Suggested architecture see attachements On iOS, WWDC 2025 introduced a native SwiftUI WebView via WebKit for SwiftUI (iOS 26.0+), reducing the need for custom UIViewRepresentable wrappers around WKWebView. Prior art / references NativeScript WebView: https://github.com/NativeScript/NativeScript/tree/b699794db88bb92e1e2a739ea0ad4fe19df58625/packages/core/ui/web-view react-native-webview issues: https://github.com/react-native-webview/react-native-webview/issues Flutter webview_flutter: https://pub.dev/packages/webview_flutter Flutter flutter_inappwebview: https://pub.dev/packages/flutter_inappwebview KMP compose-webview discussion: https://slack-chats.kotlinlang.org/t/32852048/hi-everyone-wave-excited-to-share-compose-webview-a-feature- kmp-webview: https://github.com/HarlonWang/kmp-webview compose-webview: https://github.com/parkwoocheol/compose-webview compose-webview-multiplatform: https://github.com/KevinnZou/compose-webview-multiplatform Others https://expo.canny.io/feature-requests/p/react-native-webview-support https://expo.canny.io/feature-requests/p/update-react-native-webview https://expo.canny.io/feature-requests/p/reduce-os-memory-reclaim-for-webview-heavy-apps-fix-new-architecture-default-on https://expo.canny.io/feature-requests/p/expo-increase-react-native-webview-expected-version-range-for-expo-sdk33-to-be-7
0
Let +native-intent supply the initial path when the app launches without a URL (notification taps)
Use case: our app receives data-only FCM pushes ("X followed you", chat messages). The user taps one while the app is killed. The tap should open the target screen with a working back stack. There is no supported way to do this through the linking layer today. A notification tap launches the app with no URL. In bare React Navigation the documented fix is to customize linking.getInitialURL to await messaging().getInitialNotification() and return the target path, so the tap builds initial navigation state. Expo Router owns the linking prop and hardcodes getInitialURL; when there is no URL it substitutes the root URL. The comment next to that fallback in expo-router/build/link/linking.js says it directly: // The path will be nullish in bare apps when the app is launched from the home screen. // TODO(EvanBacon): define some policy around notifications. redirectSystemPath in +native-intent only rewrites a path that already exists, so it cannot fill this in. The workaround everyone lands on is dispatching imperatively (router.push inside the notification-open handler). On a cold start that dispatch can fire inside the window where nested navigators have not yet registered into the container. The action then resolves against a bare root and stacks a second copy of the entire app: no back button, dead swipe-back, user stranded. Deterministic for us in a release build. We now hold the route and poll getRootState() until the shell is registered, which works but should not be app code. Related upstream ask: react-navigation/react-navigation discussion #13264. Request: an officially supported +native-intent hook for the no-URL launch, for example an async getInitialPath() (or calling redirectSystemPath with a null path and accepting a returned one), so a notification tap can resolve its target and enter through initial state like any other deep link. Ideally it only delays first render when the launch actually came from a notification.
0
Load More
→