I received the following email from Apple when I submit an app update:
We have discovered one or more issues with your recent delivery for \"Project
1) Go to project settings, choose PROJECT (above targets), go to Build Settings
2) Press Add User-Defined Setting
and add APP_BUILD
and APP_VERSION
3) In your targets go to Info
and replace Bundle version
to $(APP_BUILD)
and Bundle version string
to $(APP_VERSION)
in all targets and extensions where you need to sync.
4) Woila! You should change bundle versions only in one place - in Build Settings
of your PROJECT.
The scheme actions aren't in source control so it's better to add a build phase into your app's target. Syncing the versions across all targets can be solved with a simple script that can be modified for every target you want synced:
Rename the script to something like "Sync Versions" and drag it above "Compile Sources" (NOTE: Xcode has a bug that may prevent the drag-drop to work. If so, you'll need to manually edit the .pbxproj file so the build phase goes in the right spot
Paste the following script into the shell:
INFOPLIST_MYAPP="${SRCROOT}/MyApp/MyApp-Info.plist"
myAppVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_MYAPP")
myAppBuild=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_MYAPP")
INFOPLIST_SHAREEXT="${SRCROOT}/ShareExtension/Info.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $myAppVersion" "$INFOPLIST_SHAREEXT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $myAppBuild" "$INFOPLIST_SHAREEXT"
When trying to validate my archive I got an error message CFBundleShortVersionString missing. To fix the problem I went into Info.plist in the xml code and added CFBundleShortVersionString new version number This produced in plist format Bundle versions string, short This solve my problem
I was able to achieve keeping the target extension version and build strings in sync with the main app with the following:
Run Script Phase
above Compile Sources
WIDGET_EXTENSION="${SRCROOT}/MyWidget/Info.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${MARKETING_VERSION}" "$WIDGET_EXTENSION"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${CURRENT_PROJECT_VERSION}" "$WIDGET_EXTENSION"
There is a really sweet version management system that Twitch has shared.
Described in this blog post, it is somewhat similar to stk's accepted answer but cleaner and also supports the following:
Ties the build number directly (and reversibly) to the git commit before the build. Go back easily to the exact version built for use with crash report.
Handles version generation through a target dependency, which is easier to share across multiple targets.
Uses C Preprocessor on Info.plist functionality built into Xcode build settings to allow the version numbers to be substituted on the fly, with no modification of the Info.plist file.
It is a little more complex to implement, but it's the best solution I've found, particularly if you have extensions or other targets whose versions must be kept in sync.
Installation Notes: Note the blog does a great job of describing the four shell files, but doesn't really give installation or customization instructions. Here's what I did:
Create a Versions subdirectory at the top level of your project (where the .xcodeproj lives).
Download the four files indicated from the gist link at bottom left of the code samples. Move the four files into your Versions directory.
Using terminal, cd to your Versions directory, then execute the cmd: chmod +x *
to make the shell files executable
Now follow the directions in the blog from the start to create your dependency target.
You probably should customize the scripts a bit. I altered the naming and refactored to move the 4 tools to a separate tools directory that I share across projects. YMMV.
The version of your ProjectTodayExtension.appex have to be the same as your app. example:
Target> General:
Version: 1.0 <- change here Biuld: 1.0
If the version of your app to get on itunes connect is 2.3, then you must change the version of your TodayExtension to the same version 2.3.