如果您尝试在 Xcode 编译构建阶段设置该值,您可能会遇到麻烦,因为我不知道任何解释操作都发生在您尝试设置的设置方式下您尝试设置的方式他们起来。
对于自动设置版本号,我有一个更复杂的半自动版本和自动编号方案,所以我不必记住更改任何一个,或者我可以给出我想要但总是递增的版本号内部版本号,在这两种情况下,它都会将内部版本号放在 iOS 系统设置中显示的应用程序设置中的“关于”框中。
您可能不需要太多,但是有一些技巧可以获取和编写您可能会发现有用的信息,并且可能会为您的问题带来解决方案。
以下脚本的灵感来自我目前无法找到的有关如何执行此操作的堆栈溢出答案。我做了更多的工作,因为(a)我希望版本号显示在系统设置中显示的设置中;(b) Xcode 缓存 Info.plist 文件的内容,所以这样做并不像我预期的那么简单。
在编译之前的构建阶段,我运行以下命令(仅在未选中安装时使用运行脚本 )
sh xolawareStashProductSettings.sh
xolawareStashProductSettings.sh 的内容检查 info.plist 文件的 git 状态,如果不干净,将其暂时存放在一边以备日后恢复。
#!/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
脚本 #2(仅在安装时运行脚本 未选中):
sh xolawareStashSettingsBundleRootPlist.sh
xolawareStashSettingsBundleRootPlist.sh 的内容与脚本1的内容类似。
#!/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
脚本 #3(仅在安装时运行脚本已 选中)
sh xolawareIncrementProductSettingsBuildNumber.sh
xolawareIncrementProductSettingsBuildNumber 的内容使用 plistbuddy 查看它是什么并将其增加一:
#!/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}"
脚本 #4(仅在未选中安装时运行脚本 )
sh xolawareProductSettingsShortVersion-from-git.sh
sh xolawareAboutInfoVersionInfoInSettings.sh
xolawareProductSettingsShortVersion-from-git 的内容有点依赖于我在 git 中适当地标记我的分支,但如果我忘记了,它将使用自上次提交以来的提交次数为我自动版本我的构建。
#!/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}"
xolawareAboutInfoVersionInfoInSettings.sh 的内容将内容放在我想要的 Root.plist 中的 About 框中。它依赖于关于框是你的 settings.bundle 的 Root.plist 中的第一件事:
#!/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}
在编译、链接和复制捆绑资源阶段之后还有几个清理脚本要运行
sh xolawareStashRestoreSettingsBundleRootPlist.sh
这可能不是必需的,但我调整了 Root.plist 中的其他项目以进行发布版本,因此这会恢复调试版本的这些设置。
#!/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
最后,如果我自己还没有标记该项目,则自动标记 git repo 的步骤:
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 & 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}