This is documentation for the next SDK version. For up-to-date documentation, see the latest version (SDK 54).
Expo Brownfield
Toolkit and APIs for integrating Expo into existing native applications.
expo-brownfield is a toolkit for adding React Native views to existing native Android and iOS applications. It provides:
- Built-in APIs for bi-directional communication and navigation between native and React Native apps
- Config plugin for automatic setup of brownfield targets in your Expo project
- CLI for building and publishing artifacts to Maven repositories (Android) and XCFrameworks (iOS)
Installation
-Â npx expo install expo-brownfieldIf you are installing this in an existing React Native app, make sure to install expo in your project.
Usage
Communication API
The Communication API enables bi-directional, message-based communication between the native (host) app and React Native.
Sending messages from React Native to native
import * as Brownfield from 'expo-brownfield'; Brownfield.sendMessage({ type: 'MyMessage', data: { language: 'TypeScript', expo: true, platforms: ['android', 'ios'], }, });
Receiving messages from native in React Native
import * as Brownfield, { type MessageEvent } from 'expo-brownfield'; import { useEffect } from 'react'; function MyComponent() { useEffect(() => { const handleMessage = (event: MessageEvent) => { console.log('Received message:', event); }; Brownfield.addMessageListener(handleMessage); return () => { Brownfield.removeMessageListener(handleMessage); }; }, []); // ... }
Sending messages from native to React Native
import expo.modules.brownfield.BrownfieldMessaging BrownfieldMessaging.sendMessage(mapOf( "type" to "MyAndroidMessage", "timestamp" to System.currentTimeMillis(), "data" to mapOf( "platform" to "android" ) ))
import ExpoBrownfield BrownfieldMessaging.sendMessage([ "type": "MyIOSMessage", "timestamp": Date().timeIntervalSince1970, "data": [ "platform": "ios" ] ])
Receiving messages from React Native in native
import expo.modules.brownfield.BrownfieldMessaging val listenerId = BrownfieldMessaging.addListener { event -> println("Message from React Native: $event") } // Later, to remove the listener: BrownfieldMessaging.removeListener(listenerId)
import ExpoBrownfield let listenerId = BrownfieldMessaging.addListener { message in print("Message from React Native: \(message)") } // Later, to remove the listener: BrownfieldMessaging.removeListener(id: listenerId)
CLI
The expo-brownfield library includes a CLI for building and publishing to Maven repositories (Android) and XCFrameworks (iOS).
-Â npx expo-brownfield [command] [options]Commands
build:android
Builds and publishes the brownfield library and its dependencies to Maven repositories.
-Â npx expo-brownfield build:android [options]| Option | Description |
|---|---|
-d, --debug | Build in debug mode |
-r, --release | Build in release mode |
-a, --all | Build in both debug and release mode (default) |
-l, --library | Specify brownfield library name |
--repo, --repository | Specify Maven repositories to publish to |
-t, --task | Specify Gradle publish tasks to run |
--verbose | Include all logs from subprocesses |
build:ios
Builds the brownfield XCFramework and copies the Hermes XCFramework to the artifacts directory.
-Â npx expo-brownfield build:ios [options]| Option | Description |
|---|---|
-d, --debug | Build in debug mode |
-r, --release | Build in release mode (default) |
-a, --artifacts | Path to the artifacts directory (default: ./artifacts) |
-s, --scheme | Xcode scheme to build |
-x, --xcworkspace | Xcode workspace path |
--verbose | Include all logs from subprocesses |
tasks:android
Lists all available publish tasks and Maven repositories.
-Â npx expo-brownfield tasks:androidAPI
import * as Brownfield from 'expo-brownfield';
Methods
Gets the number of registered message listeners.
numberThe number of active message listeners.
| Parameter | Type | Description |
|---|---|---|
| animated(optional) | boolean | Whether to animate the transition (iOS only). Defaults to Default: false |
Navigates back to the native part of the app, dismissing the React Native view.
void| Parameter | Type | Description |
|---|---|---|
| message | Record<string, any> | A dictionary containing the message payload to send to native. |
Sends a message to the native side of the app. The message can be received by setting up a listener in the native code.
void| Parameter | Type | Description |
|---|---|---|
| enabled | boolean | Whether to enable native back button handling. |
Enables or disables the native back button behavior. When enabled, pressing the back button will navigate back to the native part of the app instead of performing the default React Navigation back action.
voidEvent Subscriptions
| Parameter | Type | Description |
|---|---|---|
| listener | Listener<MessageEvent> | A callback function that receives message events from native. |
Adds a listener for messages sent from the native side of the app.
EventSubscriptionA subscription object that can be used to remove the listener.
Example
const subscription = addMessageListener((event) => { console.log('Received message from native:', event); }); // Later, to remove the listener: subscription.remove();
| Parameter | Type | Description |
|---|---|---|
| listener | Listener<MessageEvent> | The listener function to remove. |
Removes a specific message listener.
voidInterfaces
A subscription object that allows to conveniently remove an event listener from the emitter.