React Native compatibility
The framework is not tied to a React Native version. It never calls React Native APIs or the RN CLI. It drives the native tool chains (the Gradle wrapper in android/, CocoaPods and Xcode in ios/) and reads a few stable files. Any project from React Native 0.60 onward is supported, including Expo after npx expo prebuild. Older ranges need the small adjustments below.
Support matrix
| React Native | Android | iOS | What you need to do | |
|---|---|---|---|---|
| 0.73 – 0.87 (latest) | Supported | Supported | Nothing beyond the normal setup. JDK 17. | |
| 0.71 – 0.72 | Supported | Supported | Use the JDK your RN version requires (see below). | |
| 0.60 – 0.70 | With notes | With notes | Ruby ≥ 3.2, add cocoapods to the Gemfile, check the Info.plist version placeholders. | |
| < 0.60 | Not supported | Not supported | No CocoaPods/autolinking in the template, and old Gradle can't run on current JDKs. Upgrade React Native first. | |
| Expo (bare or after prebuild) | Supported | Supported | Run npx expo prebuild so android/ and ios/ exist. | |
| Expo managed only | Not supported | Not supported | No native project to build. Use prebuild in CI, or EAS Build. |
What has actually been run
| Setup | Result | |
|---|---|---|
| RN 0.87.1 · Android · Windows 11 + GitHub Actions | Verified end-to-end: build → Firebase upload → testers → App Testing agent → Teams/e-mail | |
| RN 0.87.1 · iOS | Implemented and reviewed, not yet run on a Mac. See First run on a Mac. | |
| Other rows of the matrix | Based on what the framework reads (next section) compared against each RN template generation, not test runs. Run doctor to confirm. |
Why the RN version barely matters
| What the framework uses | Where | Notes |
|---|---|---|
| Gradle wrapper (gradlew / gradlew.bat) | android/ | Run through fastlane's gradle action. doctor restores the executable bit on macOS/Linux. |
Exact gradle_task | environments.yml | Never guessed. doctor checks it with gradlew tasks --all. |
| Output folders apk/<flavor>/<type>/ and bundle/<variant>/ | android/app/build/outputs | Same layout for every RN version since 0.60 (Android Gradle Plugin 3+). |
applicationId / namespace (auto-detect) | build.gradle or build.gradle.kts | Groovy (applicationId "x") and Kotlin DSL (applicationId = "x"). |
| App name (auto-detect) | app.json → strings.xml → package.json | Expo's {"expo": {"name"}} is supported. |
Podfile → pod install → .xcworkspace | ios/ | Uses bundle exec pod when cocoapods is in Gemfile.lock, otherwise the system pod (with a warning). |
| Shared Xcode scheme | xcshareddata/xcschemes | Mark it Shared in Xcode (Apple: build schemes). |
$(MARKETING_VERSION) / $(CURRENT_PROJECT_VERSION) | ios/<App>/Info.plist | ios doctor warns if the version values are hard-coded. |
MainApplication and Gradle-plugin autolinking (0.75+). These happen inside the Gradle/Xcode build that the framework simply runs.Tool chain per React Native version
If ./gradlew assembleRelease (or an Xcode archive) works on the machine, the framework works too.
| React Native | JDK (Android) | Notes |
|---|---|---|
| 0.73 and newer | 17 | Android Gradle Plugin 8 requires JDK 17 (AGP release notes). |
| 0.67 – 0.72 | 11 | 17 often works with 0.72. Follow that RN version's environment page. |
| 0.60 – 0.66 | 8 or 11 | Old Gradle fails on JDK 17 with “Unsupported class file major version”. |
- Node.js on the PATH of the machine running fastlane: the React Native Gradle plugin runs Node during the release build. In CI run
npm cibefore fastlane. - Xcode: App Store Connect only accepts builds from recent Xcode versions. Very old React Native versions may not compile with it, which is an RN upgrade issue (Upgrade Helper).
Gradle needs it to build Android apps (React Native 0.73+ requires JDK 17).
winget install EclipseAdoptium.Temurin.17.JDKjava -versionReact Native's Gradle/Xcode build runs Node to bundle JavaScript; also needed for the Firebase CLI.
winget install OpenJS.NodeJS.LTSnode --versionRuby, Gemfile and CocoaPods
| Requirement | Why |
|---|---|
| Ruby ≥ 3.2 | fastlane-plugin-firebase_app_distribution 1.0.0 requires ≥ 3.2 (fastlane 2.240.1 itself requires ≥ 3.1). |
| Bundler 2.4 – 4.x | Required by fastlane 2.240.1. |
| cocoapods in the Gemfile (iOS) | Pins pod install. Without it the framework uses the system pod and logs a warning. |
| RN template | What it ships | What to change |
|---|---|---|
| 0.74 and newer | ruby ">= 2.6.10", cocoapods ≥ 1.13 (≠ 1.15.0/1.15.1), activesupport, xcodeproj < 1.26, concurrent-ruby < 1.3.4 | Nothing. Add the fastlane lines from Create the Gemfile. |
| ~0.68 – 0.73 | Gemfile + .ruby-version pinned to Ruby 2.7.x | Set .ruby-version to 3.4.1. If pod install fails, raise cocoapods to >= 1.13 and activesupport to >= 6.1.7.5, != 7.1.0. |
| older than ~0.68 | No Gemfile | Create the Gemfile and add gem "cocoapods", ">= 1.13". |
fastlane is a Ruby gem. DevKit compiles gems with native extensions on Windows.
winget install RubyInstallerTeam.RubyWithDevKit.3.4ruby --versionNever use the macOS system Ruby; rbenv installs a private Ruby per project.
brew install rbenv ruby-build && rbenv install 3.4.1ruby --versionInstalls iOS native dependencies. The framework runs “pod install” for you.
echo 'gem "cocoapods", ">= 1.13"' >> Gemfile && bundle installbundle exec pod --versioniOS versioning placeholders
The framework sets the version and build number through Xcode build settings, so Info.plist must reference them:
<key>CFBundleShortVersionString</key><string>$(MARKETING_VERSION)</string><key>CFBundleVersion</key><string>$(CURRENT_PROJECT_VERSION)</string>Older templates hard-code 1.0 / 1. The build still succeeds, but every upload has the same build number and TestFlight rejects it. ios doctor warns about this:
~/my-app $ bundle exec fastlane ios doctor environment:development[!] ios/MyApp/Info.plist: CFBundleVersion is hard-coded to '1'. Set it to $(CURRENT_PROJECT_VERSION) so build numbers/versions from the framework apply.Expo
| Expo workflow | Works? | How |
|---|---|---|
| Bare workflow (native folders committed) | ✅ | Same as React Native CLI. |
| Continuous Native Generation (native folders generated) | ✅ | Run npx expo prebuild --platform android --no-install (and/or ios) before fastlane, locally and in CI. |
| Managed workflow with EAS Build only | ❌ | No native project to build. Keep EAS, or adopt prebuild. |
- run: npm ci- run: npx expo prebuild --platform android --no-install- run: bundle exec fastlane android distribute environment:stagingIf android/ is missing, android doctor stops with “Android project directory (Expo: run `npx expo prebuild` first)”.
Other project shapes
| Project shape | Works? | Configuration |
|---|---|---|
| Monorepo (Yarn/npm/pnpm workspaces, Nx) | ✅ | Set android.project_dir / ios.project_dir (e.g. apps/mobile/android) and matching artifact.glob paths. |
| Product flavors / multiple app IDs | ✅ | One gradle_task per environment, or pick per run with fastlane setup. |
| Kotlin DSL (build.gradle.kts) | ✅ | Detected for flavors, build types and the package name. |
| Brownfield (RN inside an existing native app) | ✅ | Point project_dir at the native project; set the exact task, workspace and scheme. |
| Fully native Android / iOS (no RN) | ✅ | The framework never requires React Native. |
| Windows | Android only | iOS lanes need macOS + Xcode. |
Check a project in 2 minutes
~/my-app $ npx react-native --version~/my-app $ java -version~/my-app $ ruby --version~/my-app $ bundle exec fastlane android doctor environment:developmentAndroid development configuration is valid.~/my-app $ bundle exec fastlane ios doctor environment:developmentiOS development configuration is valid.Next steps
Official documentation
- React NativeSet up your environmentreactnative.dev/docs/set-up-your-environment
- React NativeUpgrade Helper (diff between RN versions)react-native-community.github.io/upgrade-helper/
- AndroidAndroid Gradle Plugin release notes (JDK requirements)developer.android.com/build/releases/gradle-plugin
- ExpoContinuous Native Generation (expo prebuild)docs.expo.dev/workflow/continuous-native-generation/
- CocoaPodsCocoaPods: getting startedguides.cocoapods.org/using/getting-started.html
- AndroidBuild your app from the command linedeveloper.android.com/build/building-cmdline