Mobile Fastlane

React Native compatibility

Last updated 2026-10-07

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 NativeAndroidiOSWhat you need to do
0.73 – 0.87 (latest)SupportedSupportedNothing beyond the normal setup. JDK 17.
0.71 – 0.72SupportedSupportedUse the JDK your RN version requires (see below).
0.60 – 0.70With notesWith notesRuby ≥ 3.2, add cocoapods to the Gemfile, check the Info.plist version placeholders.
< 0.60Not supportedNot supportedNo CocoaPods/autolinking in the template, and old Gradle can't run on current JDKs. Upgrade React Native first.
Expo (bare or after prebuild)SupportedSupportedRun npx expo prebuild so android/ and ios/ exist.
Expo managed onlyNot supportedNot supportedNo native project to build. Use prebuild in CI, or EAS Build.

What has actually been run

SetupResult
RN 0.87.1 · Android · Windows 11 + GitHub ActionsVerified end-to-end: build → Firebase upload → testers → App Testing agent → Teams/e-mail
RN 0.87.1 · iOSImplemented and reviewed, not yet run on a Mac. See First run on a Mac.
Other rows of the matrixBased 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 usesWhereNotes
Gradle wrapper (gradlew / gradlew.bat)android/Run through fastlane's gradle action. doctor restores the executable bit on macOS/Linux.
Exact gradle_taskenvironments.ymlNever guessed. doctor checks it with gradlew tasks --all.
Output folders apk/<flavor>/<type>/ and bundle/<variant>/android/app/build/outputsSame layout for every RN version since 0.60 (Android Gradle Plugin 3+).
applicationId / namespace (auto-detect)build.gradle or build.gradle.ktsGroovy (applicationId "x") and Kotlin DSL (applicationId = "x").
App name (auto-detect)app.json → strings.xml → package.jsonExpo's {"expo": {"name"}} is supported.
Podfile → pod install → .xcworkspaceios/Uses bundle exec pod when cocoapods is in Gemfile.lock, otherwise the system pod (with a warning).
Shared Xcode schemexcshareddata/xcschemesMark it Shared in Xcode (Apple: build schemes).
$(MARKETING_VERSION) / $(CURRENT_PROJECT_VERSION)ios/<App>/Info.plistios doctor warns if the version values are hard-coded.
Not affected: the New Architecture (Fabric/TurboModules), Bridgeless mode, Hermes or JSC, Kotlin 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 NativeJDK (Android)Notes
0.73 and newer17Android Gradle Plugin 8 requires JDK 17 (AGP release notes).
0.67 – 0.721117 often works with 0.72. Follow that RN version's environment page.
0.60 – 0.668 or 11Old 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 ci before 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).
Download the JDK and Node.js
Java JDK 17 (Eclipse Temurin)17 LTS

Gradle needs it to build Android apps (React Native 0.73+ requires JDK 17).

winget install EclipseAdoptium.Temurin.17.JDK
Verify: java -version
In the Windows installer, enable “Set JAVA_HOME variable”.
Official install guide
Node.jsLTS

React Native's Gradle/Xcode build runs Node to bundle JavaScript; also needed for the Firebase CLI.

winget install OpenJS.NodeJS.LTS
Verify: node --version
Official install guide

Ruby, Gemfile and CocoaPods

RequirementWhy
Ruby ≥ 3.2fastlane-plugin-firebase_app_distribution 1.0.0 requires ≥ 3.2 (fastlane 2.240.1 itself requires ≥ 3.1).
Bundler 2.4 – 4.xRequired 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 templateWhat it shipsWhat to change
0.74 and newerruby ">= 2.6.10", cocoapods ≥ 1.13 (≠ 1.15.0/1.15.1), activesupport, xcodeproj < 1.26, concurrent-ruby < 1.3.4Nothing. Add the fastlane lines from Create the Gemfile.
~0.68 – 0.73Gemfile + .ruby-version pinned to Ruby 2.7.xSet .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.68No GemfileCreate the Gemfile and add gem "cocoapods", ">= 1.13".
Upgrade Ruby / add CocoaPods
Ruby 3.4 + DevKit (RubyInstaller)3.4.x

fastlane is a Ruby gem. DevKit compiles gems with native extensions on Windows.

winget install RubyInstallerTeam.RubyWithDevKit.3.4
Verify: ruby --version
Pick the “WITH DEVKIT” x64 installer, and let it run “ridk install” at the end.
Official install guide
Ruby 3.4 via rbenv3.4.x

Never use the macOS system Ruby; rbenv installs a private Ruby per project.

brew install rbenv ruby-build && rbenv install 3.4.1
Verify: ruby --version
Official install guide
CocoaPods≥ 1.13

Installs iOS native dependencies. The framework runs “pod install” for you.

echo 'gem "cocoapods", ">= 1.13"' >> Gemfile && bundle install
Verify: bundle exec pod --version

iOS versioning placeholders

The framework sets the version and build number through Xcode build settings, so Info.plist must reference them:

ios/MyApp/Info.plist
<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 — zsh
~/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 workflowWorks?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.
.github/workflows/android-distribution.yml (Expo excerpt)
- run: npm ci
- run: npx expo prebuild --platform android --no-install
- run: bundle exec fastlane android distribute environment:staging

If android/ is missing, android doctor stops with “Android project directory (Expo: run `npx expo prebuild` first)”.

Other project shapes

Project shapeWorks?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.
WindowsAndroid onlyiOS lanes need macOS + Xcode.

Check a project in 2 minutes

my-app — zsh
~/my-app $ npx react-native --version
~/my-app $ java -version
~/my-app $ ruby --version
~/my-app $ bundle exec fastlane android doctor environment:development
Android development configuration is valid.
~/my-app $ bundle exec fastlane ios doctor environment:development
iOS development configuration is valid.
When both doctor lanes pass, the project is compatible. Every failure names the file or value to fix.

Next steps

Official documentation

Was this helpful?