Skip to main content

Native Builds


A native build of your application is platform specific and can run on a physical device. Native builds produce native build artifacts such as aab files for Android and ipa files for iOS.

After the native build artifacts are generated:

  • The binaries will be stored and available for you to download from the dashboard.
  • You can find the history and status of your native builds as well as download successful builds in the side menu under Builds in the Build tab.

The steps of the native build will depend on the framework used to develop the project.


Native Builds for both Capacitor and Cordova start with the following steps:

  • npm install will run to install any dependencies you have.
  • npm run build will run if a build script is detected in the scripts section of your package.json in order to build the web app components for your application.

A native build for a Capacitor project will then follow these steps:

  • npx cap sync [ios|android] will run with the platform you have configured. This will copy the newly generated web app components to the corresponding native platform directory and update any native plugins found in that directory.
  • For an iOS build, gym is executed to produce the ipa and dsym files (or app file for Simulator builds).
  • For an Android build, gradle is used to produce the aab and apk files.

While a native build for a Cordova project will then follow these steps:

  • cordova platform add [ios|android] will run with the platform you have configured. NOTE: DO NOT commit your platforms directory as this will cause your build to fail.
  • cordova build [ios|android] will run with the platform and options you have configured and generate the native binaries.

React Native

Native builds for React Native all start with the following steps:

  • Detects the package manager and installs dependencies based on configuration or default for package manager (yarn, npm ci, etc.)
  • Detects if the project is using a React Native variant like Expo.
  • For Expo projects, the prebuild command is run to generate native code.

For Expo projects, an ios.bundleIdentifier for iOS and android.package for Android must be set in your app.json for a successful native build.


  • For an iOS build, gym is executed to produce the ipa and dsym files (or app file for Simulator builds).
  • For an Android build, gradle is used to produce the aab and apk files.

Performing a Build

A native build can be triggered from the Commits or the Build tab.

From your commits list, click "Start build" on the commit you'd like to use to create the native build. You can also click "New build" from the Builds list and select a commit to use.

On the new build page, choose the type of build you want to perform, as well as any signing certificates, custom environment, or native config. Once you have a successful build, you can download it by clicking the file name in the Artifacts section in the right of the build detail page or clicking the Download IPA/AAB icon on the build in the Build > Builds tab.

You can rerun a build from the Builds list or the log of a build. Rerunning a build uses the same stack, environment, configuration, and other settings from the initial build attempt. A new build number and build ID are generated for the rerun, as well as a new build in the Builds list.

Concurrency limits

Each account plan has a defined maximum amount of concurrent builds allowed (see Plans Details). This limit is enforced at the account level across different apps.

When you trigger a build, in the Appflow Dashboard you will notice that a build can have different statuses before it is processed:

  • Queued: this means that your build is queued for the next available runner. Usually your build should not be in this state for more than few seconds.
  • Pending: this means that you have reached your concurrent build limit and your build will continue when your current builds are completed.

After the build starts to be processed the statuses are:

  • Running: the build is currently being processed. You can read the logs in the build details.
  • Successful: the build terminated in a correct state.
  • Failed: the build terminated in an incorrect state.

More concurrent builds can be added to your plan. If you have a Basic or above plan, please contact us.