--- title: App version management description: Learn about different version types and how to manage them remotely or locally. --- import { Collapsible } from '~/ui/components/Collapsible'; import Video from '~/components/plugins/Video'; Android and iOS each expose two values that identify the version of an application; one that is visible in stores, and another that is visible only to developers. In managed projects, we use fields `version`/`android.versionCode`/`ios.buildNumber` in **app.json** to define versions, where `android.versionCode`/`ios.buildNumber` represents the developer-facing build version and `version` is the user-facing value visible in stores. For bare projects, each of those values maps to specific parts of the native configuration: - [`version`][config-version] field in **app.json** on iOS represents `CFBundleShortVersionString` in **Info.plist**. - [`version`][config-version] field in **app.json** on Android represents `versionName` in **android/app/build.gradle**. - [`ios.buildNumber`][config-ios-buildnumber] field in **app.json** represents `CFBundleVersion` in **Info.plist**. - [`android.versionCode`][config-android-versioncode] field in **app.json** represents `versionCode` in **android/app/build.gradle**. One of the most frequent causes of app store rejections is submitting a build with a duplicate version number. This happens when a developer forgets to increment the version number prior to running a build. EAS Build can manage automatically incrementing these versions for you if you opt into using the "remote" app version source. The default behavior is to use a "local" app version source, which means you control versions manually in their respective config files. To simplify the descriptions, we will use **app.json** terminology (`version`/`versionCode`/`buildNumber`) for the rest of this page, but unless stated otherwise, the same applies to bare projects.