This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
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
If 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)
Configuration in app config
The expo-brownfield package provides a config plugin that can be used to configure the brownfield integration when using Continuous Native Generation (CNG). This plugin allows you to customize how your Expo project is packaged and integrated into your existing native app.
Example app.json with config plugin
Configurable properties
CLI
The expo-brownfield library includes a CLI for building and publishing to Maven repositories (Android) and XCFrameworks (iOS).
Commands
build:android
Builds and publishes the brownfield library and its dependencies to Maven repositories.
build:ios
Builds the brownfield XCFramework and copies the Hermes XCFramework to the artifacts directory.
tasks:android
Lists all available publish tasks and Maven repositories.
API
import * as Brownfield from 'expo-brownfield';
No API data file found, sorry!