To see your macOS version and build numbers on a Mac, choose Apple > About This Mac and click the version number. In iOS or iPadOS, go to Settings > General > About and tap Software Version. For watchOS, in your iPhone's Watch app, go to General > About and look at the Version line.
All the software released by Apple also comes with a build number. It's of the form of XaY where X is an integer, a is an alphabet, and Y is also an integer. X is incremented by one for every major release. a and Y get incremented with every release of the software.
Apple Technical Note TN2420, Version Numbers and Build Numbers
Version
, Build number
) must be unique.
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. For macOS apps, you cannot re-use build numbers in any release train.
Based on the checklist, the following (Version, Build Number)
sequence is valid too.
Case: reuse Build Number
in different release trains. (NOTE: NOT macOS app)
(1.0.0, 1) -> (1.0.0, 2) -> ... -> (1.0.0, 11) -> (1.0.1, 1) -> (1.0.1, 2)
The 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.
Source
The 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.
Source
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?
No.
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")
/!\ 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.
Both CFBundleVersion
and 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 CFBundleVersion
and 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.
The current Apple Technical Note TN2420, Version Numbers and Build Numbers says (my bolding):
- For iOS apps you can re-use build numbers in different release trains, but you cannot re-use build numbers within the same release train. For macOS apps, you cannot re-use build numbers in any release train.
Unfortunately, this means you can't reuse a build number that tracks to the release train number on iOS when you're trying to release the same build on Mac Catalyst.
In my case, for example, due to some earlier issues, I ended up releasing 1.0.2(4) as a Mac Catalyst app that corresponded to 1.0.2(1) on iOS. Now when trying to release 1.0.3(1) on both, the app fails verification on MacOS because of the build number, while it passes verification on iOS.
I guess now that I am releasing the same app on both iOS and MacOS routinely, I will adopt build numbers that correspond to the date, like 20200111 and increment with a decimal point if I need to change the build number within a given release.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With