Which iOS app version/build number(s) MUST be incremented upon App Store release?
Three version/build fields for an iOS app are:
“Version” CFBundleShortVersionString (String – iOS, OS X) specifies the release version number of the bundle, which identifies a released iteration of the app. The release version number is a string comprised of three period-separated integers.
- Protocol extension in Swift 3
- Objective-C Wrapper for CFunctionPointer to a Swift Closure
- Drawing with Core Graphics looks chunky on Retina display
- MKMapSnapshotOptions : Adding snapshot of Custom Pin Annotation View or UIView
- Is it possible to let somebody else upload and distribute my app in Apple's App Store?
- How to add a right button to a UINavigationController?
“Build” CFBundleVersion (String – iOS, OS X) specifies the build version number of the bundle, which identifies an iteration (released or unreleased) of the bundle. The build version number should be a string comprised of three non-negative, period-separated integers with the first integer being greater than zero. The string should only contain numeric (0-9) and period (.) characters. Leading zeros are truncated from each integer and will be ignored (that is, 1.02.3 is equivalent to 1.2.3). This key is not localizable.
“iTunes Connect Version Number”: version number you specify when creating a new version of the app on iTunes Connect.
My question is:
Which version/build numbers are required to be incremented when a new version of the app is uploaded to the App Store?
CFBundleVersion remain the same between app updates?
Extra points for Apple sources or the exact error messages iTunesConnect displays upon uploading an invalid version/build number.
Android / Google Play note:
The discussion prompting this question is that the public “version” of an Android app in the Google Play Store does not need to be incremented and is in no way validated. The
android:versionName can remain the same between releases, upgrade, downgrade, or be any random string rather than something that appears to be a valid “version number”.
android:versionName— A string value that represents the release version of the application code, as it should be shown to users.
The value is a string so that you can describe the application version as a
<major>.<minor>.<point>string, or as any other type of absolute or relative version identifier.
android:versionCode is enforced to be an incrementing-on-release integer.
As noted in the newly accepted answer, Apple has recently added a Technical Note to their website that discusses their version/build number scheme in detail:
Apple Technical Note TN2420 – Version Numbers and Build Numbers
- Submission of ios app: invalid team id
- How to send the user directly to the review page on The App Store?
- How do I detect if an app has been cracked without examining the SignerIdentity?
- Will fork() in iOS app likely be rejected by Apple's vetting process?
- App store review guidelines 2.10 - should iPhone app be adjusted to iPad?
- How to implement a “rate us” feature in a phonegap app
7 Solutions Collect From Internet About “Which iOS app version/build number(s) MUST be incremented upon App Store release?”
Apple Technical Note TN2420, Version Numbers and Build Numbers
- The pair (
Build number) must be unique.
- The sequence is valid: (1.0.1, 12) -> (1.0.1, 13) -> (1.0.2, 13) -> (1.0.2, 14) …
Version(CFBundleShortVersionString) must be in ascending sequential order.
Build number(CFBundleVersion) must be in ascending sequential order.
Version Number and Build Number Checklist
Here are some things you can check when submitting a new build to the App Store. Making sure you have your Version Number and Build Number set properly will help you by avoiding having your App automatically rejected for having them improperly configured.
- For each new version of your App, you need to invent a new Version Number. This number should be a greater value than the last Version Number that you used. Though you may provide many builds for any particular release of your App, you only need to use one new Version Number for each new release of your App.
- You cannot re-use Version Numbers.
- For every new build you submit, you will need to invent a new Build Number whose value is greater than the last Build Number you used (for that same version).
- You can re-use Build Numbers in different release trains, but you cannot re-use Build Numbers within the same release train.
Based on the checklist, the following
(Version, Build Number) sequence is valid too.
Build Numberin different release trains.
(1.0.0, 1) -> (1.0.0, 2) -> … -> (1.0.0, 11)
-> (1.0.1, 1) -> (1.0.1, 2)
CFBundleShortVersionString should match the version number you give iTunes Connect. It is also the version number that appears when the user looks at your App in the App Store.
The version number is shown in the store and that version should match the version number you enter later in iTunes Connect.
CFBundleVersion is not displayed in the App Store, but is used by the iTunes to determine when your App has been updated.
If you update the build string, as described in “Setting the Version Number and Build String,” iTunes recognizes that the build string changed and properly syncs the new iOS App Store Package to test devices.
Answering your questions more specifically…
Which version/build numbers are required to be incremented when a new version of the app is uploaded to the app store?
Both. One is displayed in the App Store, the other is used by iTunes to update the App.
Can either CFBundleShortVersionString or CFBundleVersion remain the same between app updates?
No. (Meta question, what would the use case be here? If you’ve edited the payload in any way, the build will be different, and the user will want to know about it). If you try, you’ll see error messages like below:
Or are they compared to the previous respective number to ensure that a numerically greater number is uploaded with the new version of the app?
Yes. Using the semver.org standard.
Are the CFBundleShortVersionString and CFBundleVersion numbers in any way compared to each other?
CFBundleShortVersionString is the public “name” of the version (example: “2.5”, or “3.8.1”).
You must increase it at each release.
CFBundleVersion is the private build number. It is not seen on the AppStore. You must increase it at each upload. It means that if you ever reject a binary before it goes online, and you want to upload a new binary, it will have the same CFBundleShortVersionString but must have a higher CFBundleVersion (example: public “2.5”, private “2.5”, and then binary reject, and re-upload private “2.5.1”)
Edit on Nov 16, 2016:
/!\ The CFBundleVersion property is also used (along with CFBundleName) in the
User-Agent header sent by NSURLConnection in your code.
Example: if CFBundleName is MyApp and CFBundleVersion is 2.21, then any programmatic HTTP query sent directly by your code using NSURLConnection will embed the header:
User-Agent: MyApp/2.21 CFNetwork/... Darwin/...
(This does not apply to requests issued automatically by UIWebView).
CFBundleVersion and CFBundleShortVersionString must be greater than the app’s last version number. It’s a good practice to keep them same. You should find them in your -info.plist.
When you try to validate the app in organizer it will throw an error if either of them has not been incremented. Happened to me last night.
CFBundleShortVersionString MUST be incremented when releasing a new version to the App Store.
Additionally, one of the strings must must match the version specified in iTunes Connect.
This question includes the above screenshot of the Xcode Organizer’s Validator refusing to validate the app when the
CFBundleShortVersionString have not been incremented.
This bundle is invalid. The value for key
CFBundleVersion[1.0] in the Info.plist file must contain a higher version than that of the previously uploaded version [1.134].
This bundle is invalid. The value for key
CFBundleShortVersionString[1.0] in the Info.plist file must contain a higher version than that of the previously uploaded version [1.134].
The validator also throws an error proving that one of the strings must match the version of the app created on iTunes Connect.
- Version Mismatch. Neither CFBundleVersion [‘1.0’] nor CFBundleShortVersionString [‘1.0’] in the Info.plist match the version of the app set in iTunes Connect [‘1.4’].
You need to increment both.
When uploading a new version, you will need to create a new version on the iTunes Connect, which automatically will be higher than the previous releases. This version on the iTunes Connect will be expecting a binary with the same version number, thus
CFBundleShortVersionString needs to be incremented.
If you update the version but forget to increment the
CFBundleVersion, you will encounter an error during the upload. See pkamb’s answer and screenshot.
For details on
CFBundleVersion, please see: https://stackoverflow.com/a/31921249/936957
AFAIK, off the top of my head, you only need to increment the build number
CFBundleVersion. Incrementing the short version string is not necessarily needed, though you probably should increment it, as it does tell the user that the app is new. Apple does say that numbering should follow traditional software versioning conventions, however, and iTunes Connect may complain if you try to re-upload an already existing version.
Long story short, it may work, but probably not.
- react-native-linkedin-sdk – Cannot read property 'configure' of undefined (LinkedInSessionManager.ios.js)
- Dismiss view controller with custom animation?
- Deleting CoreData store on OS X?
- Interface Builder could not open the document “.xib” because it does not exist
- IOS Core Bluetooth : Writing NSData for Characteristic
- Attempt to present UIAlertController on UIViewController whose view is not in the window hierarchy
- How to check for Nil
- Define height of one specific table cell
- UICollection View causes “UICollectionViewFlowLayoutBreakForInvalidSizes” on smaller devices
- Programmatically logging in to website with saved username and password
- Autoscrolling infinite effect in .linear type of iCarousel in swift
- Possible to create statically allocated array in swift?
- Stretchy UIBezierPath line?
- Deleting core data version xcdatamodel files
- How do I calculate a logarithm in iOS?