Readme · Guides · Reference · Contributing
Warning
The Optimization React Native SDK is in beta. Breaking changes can be published at any time.
This is a reference implementation for the Optimization React Native SDK and is part of the Contentful Optimization SDK Suite.
Use this implementation when you need an end-to-end React Native example for Android and iOS app targets. It demonstrates SDK initialization, optimized entry rendering, interaction tracking, navigation/screen tracking, offline behavior, preview-panel scenarios, and Detox E2E coverage.
The app defines one locale in env.config.ts, passes it to the React Native SDK as top-level
locale, and passes it directly to Contentful CDA entry fetches. Do not use contentful.js
withAllLocales or raw CDA locale=* for entries passed to OptimizedEntry; SDK entry resolution
expects direct single-locale fields such as fields.nt_experiences and fields.nt_variants. See
Locale handling in the Optimization SDK Suite
for the broader locale model and
Entry personalization and variant resolution
for the entry contract.
- Node.js >= 20.19.0 (24.15.0 recommended to match
.nvmrc) - pnpm
- Android SDK,
adb, and at least one configured Android emulator for Android Detox flows. The one-shot runner and Detox can launch a configured emulator; it does not need to be running before you start the flow. - Xcode with an iOS Simulator available for iOS Detox flows
Run all steps from the monorepo root.
-
Install pnpm packages:
pnpm install
-
Build and package SDK tarballs used by this implementation:
pnpm build:pkgs
-
Install implementation dependencies:
pnpm implementation:run -- react-native-sdk implementation:install
-
Create the local
.envfile if it does not already exist:test -f implementations/react-native-sdk/.env || cp implementations/react-native-sdk/.env.example implementations/react-native-sdk/.env
The
.env.examplevalues are mock-safe defaults. Android rewrites localhost URLs to the emulator host alias inenv.config.ts; iOS Simulator uses the host network directly.
See implementations/react-native-sdk/package.json for more commands.
Run these commands from the monorepo root.
-
Start the mock API server:
pnpm implementation:run -- react-native-sdk serve:mocks
-
In another terminal, start Metro:
pnpm implementation:run -- react-native-sdk start
-
In a third terminal, install and launch the Android app or iOS app:
pnpm implementation:run -- react-native-sdk android pnpm implementation:run -- react-native-sdk ios
Use the one-shot E2E runner when you need automatic mock server, Metro, Android emulator, adb reverse, build, and cleanup orchestration.
Android E2E tests use Detox. Run these commands from the monorepo root.
-
Run the full root setup and E2E wrapper:
pnpm setup:e2e:react-native-sdk pnpm test:e2e:react-native-sdk
-
Run the preferred targeted local Android E2E flow:
pnpm implementation:run -- react-native-sdk test:e2e:android:full
-
Build Android Detox binaries:
pnpm implementation:run -- react-native-sdk test:e2e:android:build
-
Run Android Detox tests only:
pnpm implementation:run -- react-native-sdk test:e2e:android:run
-
Pass script arguments through to the one-shot runner:
pnpm implementation:run -- react-native-sdk test:e2e:android:full -- --test-file e2e/offline-behavior.test.js
The one-shot Android command:
- creates
.envfrom.env.examplefor E2E - starts the mock server and Metro
- configures adb reverse
- builds the Android app (unless skipped)
- runs Detox tests
- cleans up background processes
- creates
-
Useful one-shot variants:
Skip rebuild if the app is already built:
SKIP_BUILD=true pnpm implementation:run -- react-native-sdk test:e2e:android:full
Run one test file:
pnpm implementation:run -- react-native-sdk test:e2e:android:full -- --test-file e2e/offline-behavior.test.js
Run tests matching a name pattern:
pnpm implementation:run -- react-native-sdk test:e2e:android:full -- -t "should recover gracefully when network is restored" -
Run iOS Detox commands when needed:
pnpm implementation:run -- react-native-sdk test:e2e:ios:build pnpm implementation:run -- react-native-sdk test:e2e:ios:run
Local Android E2E logging is intentionally minimal by default.
-
Enable script/service logs (Metro, mock server, and adb logcat stream):
STREAM_BACKGROUND_LOGS=true ENABLE_DEVICE_LOGCAT=true METRO_VERBOSE=true pnpm implementation:run -- react-native-sdk test:e2e:android:full
-
Increase Detox runner logging and artifacts:
pnpm --dir implementations/react-native-sdk --ignore-workspace exec detox test --configuration android.emu.debug --loglevel trace --record-logs all --take-screenshots failing --record-videos failing
-
Read generated logs:
implementations/react-native-sdk/logs/mock-server.logimplementations/react-native-sdk/logs/metro.logimplementations/react-native-sdk/logs/device.logimplementations/react-native-sdk/logs/test-results.log
- @contentful/optimization-react-native - React Native SDK package
- React Native SDK package-local dev dashboard - Interactive development harness
- Mocks package - Shared mock API server and fixtures