Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>if you are trying to set that value in the Xcode compile build-phase, you may run into trouble, as i don't know that any interpretive operation takes place with the settings you are trying to set up the way you are trying to set them up.</p> <p>for auto-setting the version number, i have a much more complex semi-auto-version and auto-numbering scheme so i don't have to remember to change either, or so i can give a version-number i want but always increment the build number, and in both cases, it will put the build number in the About box in the app-settings that are displayed in the iOS system settings.</p> <p>you may not need much of any of it, but there are a couple of tricks for getting and writing information that you may find useful and may lead to a solution for your problem.</p> <hr> <p>the following scripts were inspired by a stack-overflow answer for how to do this that i can't find at the moment. i put in a bit more work, because (a) i want the version number to show up in the settings displayed in system settings; and (b) Xcode caches the contents of the Info.plist file, so doing this is not nearly as simple as i would have expected.</p> <p>in a build phase that comes before compile, i run the following (with <strong>Run script only when installing</strong> <em>unchecked</em>)</p> <pre><code>sh xolawareStashProductSettings.sh </code></pre> <p>the contents of xolawareStashProductSettings.sh check the git status of the info.plist file, and if not clean, stash it aside temporarily for later restoration.</p> <pre><code>#!/bin/sh # # should be run prior to the Copy Bundle Resources step # and prior to any version information modifier scripts INFOPLIST_GIT_PATH=${PROJECT}/`basename ${INFOPLIST_FILE}` echo "-- Temp Hold ${INFOPLIST_GIT_PATH} Script --" set -e # a fallback in case the user has made changes to the file if [ `git status --porcelain ${INFOPLIST_GIT_PATH} ]|wc -l` -gt 0 ]; then echo cp -p ${INFOPLIST_GIT_PATH} ${TARGET_TEMP_DIR} cp -p ${INFOPLIST_GIT_PATH} ${TARGET_TEMP_DIR} fi </code></pre> <p>script #2 (with <strong>Run script only when installing</strong> <em>unchecked</em>):</p> <pre><code>sh xolawareStashSettingsBundleRootPlist.sh </code></pre> <p>the contents of xolawareStashSettingsBundleRootPlist.sh are similar to the contents of script 1.</p> <pre><code>#!/bin/sh # # should be run prior to the Copy Bundle Resources step # and prior to any version information modifier scripts echo '-- Temp Hold Settings.bundle/Root.plist Script --' ROOT_PLIST=${PROJECT}/Resources/Settings.bundle/Root.plist set -e # a fallback in case the user has made changes to the file if [ `git status --porcelain ${ROOT_PLIST} ]|wc -l` -gt 0 ]; then echo cp -p ${ROOT_PLIST} ${TARGET_TEMP_DIR} cp -p ${ROOT_PLIST} ${TARGET_TEMP_DIR} fi </code></pre> <p>script #3 (with <strong>Run script only when installing</strong> <em>checked</em>)</p> <pre><code>sh xolawareIncrementProductSettingsBuildNumber.sh </code></pre> <p>the contents of xolawareIncrementProductSettingsBuildNumber use plistbuddy to see what it is and bump it by one:</p> <pre><code>#!/bin/sh # # this should be prior to xolawareAboutInfoVersionInfoInSettings.sh echo "-- Auto-Increment ${INFOPLIST_FILE} Build Version Install Script --" PLISTBUDDYCMD="/usr/libexec/PlistBuddy -c" CONFIGURATION_BUILD_SETTINGS_PATH=${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH} CFBV=$(${PLISTBUDDYCMD} "Print :CFBundleVersion" ${PRODUCT_SETTINGS_PATH}) if [[ "${CFBV}" == "" ]]; then echo "No build number in ${PRODUCT_SETTINGS_PATH}" exit 2 fi CFBV=$(expr $CFBV + 1) set -e echo ${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${PRODUCT_SETTINGS_PATH}" ${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${PRODUCT_SETTINGS_PATH}" echo ${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${CONFIGURATION_BUILD_SETTINGS_PATH}" ${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${CONFIGURATION_BUILD_SETTINGS_PATH}" </code></pre> <p>script #4 (with <strong>Run script only when installing</strong> <em>unchecked</em>)</p> <pre><code>sh xolawareProductSettingsShortVersion-from-git.sh sh xolawareAboutInfoVersionInfoInSettings.sh </code></pre> <p>the contents of xolawareProductSettingsShortVersion-from-git rely a little on me tagging my branch in git appropriately, but if i forget, it will use the number of commits since the last commit to auto-version my build for me. </p> <pre><code>#!/bin/sh # # this should be run after xolawareStashSettingsBundleRootPlist.sh # and prior to xolawareAboutInfoVersionInfoInSettings.sh echo '-- Get Product Settings Short Version String from git describe --' PLISTBUDDYCMD="/usr/libexec/PlistBuddy -c" CONFIGURATION_BUILD_SETTINGS_PATH=${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH} CFBVS=`git describe|awk '{split($0,a,"-"); print a[1]}'` CFBVSI=`git describe|awk '{split($0,a,"-"); print a[2]}'` if [[ "$CFBVSI" != "" ]]; then CFBVS=${CFBVS}.${CFBVSI} fi set -e echo ${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${PRODUCT_SETTINGS_PATH}" ${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${PRODUCT_SETTINGS_PATH}" echo ${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${CONFIGURATION_BUILD_SETTINGS_PATH}" ${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${CONFIGURATION_BUILD_SETTINGS_PATH}" </code></pre> <p>the contents of xolawareAboutInfoVersionInfoInSettings.sh place the contents in the About box in my Root.plist like i want. it relies on the About box being the first thing in your Root.plist of your settings.bundle:</p> <pre><code>#!/bin/sh # # this should be invoked after xolawareStashInfoAndRootPlist.sh, # xolawareIncrementProductSettingsBuildNumber.sh and # xolawareProductSettingsShortVersion-from-git.sh, and before # the regular Copy Bundle Resources Build Phase echo '-- Auto-Insert Version Info In System Settings Script --' PLISTBUDDYCMD="/usr/libexec/PlistBuddy -c" ROOT_PLIST=${PROJECT_DIR}/${PROJECT}/Resources/Settings.bundle/Root.plist CFBSVS=`exec -c ${PLISTBUDDYCMD} "Print :CFBundleShortVersionString" ${PRODUCT_SETTINGS_PATH}` CFBV=`exec -c ${PLISTBUDDYCMD} "Print :CFBundleVersion" ${PRODUCT_SETTINGS_PATH}` set -e echo ${PLISTBUDDYCMD} "Set :PreferenceSpecifiers:1:DefaultValue '${CFBSVS} (b${CFBV})'" ${ROOT_PLIST} ${PLISTBUDDYCMD} "Set :PreferenceSpecifiers:1:DefaultValue '${CFBSVS} (b${CFBV})'" ${ROOT_PLIST} </code></pre> <p>there are also a couple of cleanup scripts to be run after the Compile, Link &amp; Copy bundle resources phases</p> <pre><code>sh xolawareStashRestoreSettingsBundleRootPlist.sh </code></pre> <p>this may not be necessary, but i adjust other items in the Root.plist for release builds, so this restores those settings for debug builds.</p> <pre><code>#!/bin/sh # # should be run as the second to last script in Build Phases, after the Copy Bundle Resources Phase echo "-- Manual Restore $INFOPLIST_FILE Script --" ROOT_PLIST=${PROJECT}/Resources/Settings.bundle/Root.plist set -e # first, see if it was stashed earlier due to uncommitted changes if [ -e ${TARGET_TEMP_DIR}/Root.plist ]; then echo mv ${TARGET_TEMP_DIR}/Root.plist ${ROOT_PLIST} mv ${TARGET_TEMP_DIR}/Root.plist ${ROOT_PLIST} # the better option when available: restore to the pristine state elif [ `git status --porcelain ${ROOT_PLIST}|wc -l` -gt 0 ]; then echo git checkout -- ${ROOT_PLIST} git checkout -- ${ROOT_PLIST} fi </code></pre> <p>and finally, the step to auto-tag the git repo if i haven't already tagged the item just now myself:</p> <pre><code>sh xolawareProductSettings-git-commit-and-tag.sh #!/bin/sh # # this should be run after xolawareAboutInfoVersionInfoInSettings.sh # and xolawareProductSettingsShortVersion-from-git.sh echo "-- ${INFOPLIST_FILE} git commit &amp; tag Install Script --" SCRIPT_VERSION=`/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' ${INFOPLIST_FILE}` SCRIPT_BUILD_NUMBER=`/usr/libexec/Plistbuddy -c 'Print :CFBundleVersion' ${INFOPLIST_FILE}` if [ `git status --porcelain ${SCRIPT_INFO_PLIST}|wc -l` -gt 0 ]; then echo git commit -m '"'version ${SCRIPT_VERSION} build ${SCRIPT_BUILD_NUMBER}'"' ${INFOPLIST_FILE} git commit -m "version ${SCRIPT_VERSION} build ${SCRIPT_BUILD_NUMBER}" ${INFOPLIST_FILE} fi echo git tag -f ${SCRIPT_VERSION} git tag -f -F /dev/null ${SCRIPT_VERSION} </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload