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 を使用してそれが何であるかを確認し、1 つ増やします。
#!/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 の最初にある About ボックスに依存しています。
#!/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 リポジトリに自動タグを付ける手順:
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}