You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PlistBuddy无法识别plist文件中的CFBundleVersion键,求排查

PlistBuddy提示CFBundleVersion键不存在,但plist文件中确有该键的问题

使用PlistBuddy多年,近期在Xcode构建流程的Shell脚本环节中,PlistBuddy报错提示键“CFBundleVersion”不存在。已打印$PROJECT_DIR和$INFOPLIST_FILE的值,确认plist文件存在于指定目录,且文件内容中明确包含CFBundleVersion键(对应值为318)。

plist文件内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleExecutable</key>
    <string>${EXECUTABLE_NAME}</string>
    <key>CFBundleHelpBookFolder</key>
    <string>FSHelp</string>
    <key>CFBundleHelpBookName</key>
    <string>File Synchronization Help</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string><HIDDEN></string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>$(MARKETING_VERSION)</string>
    <key>CFBundleSignature</key>
    <string>FSYN</string>
    <key>CFBundleVersion</key>
    <string>318</string>
    <key>LSApplicationCategoryType</key>
    <string>public.app-category.utilities</string>
    <key>LSHasLocalizedDisplayName</key>
    <true/>
    <key>LSMinimumSystemVersion</key>
    <string>${MACOSX_DEPLOYMENT_TARGET}</string>
    <key>NSMainNibFile</key>
    <string>MainMenu</string>
    <key>NSPrincipalClass</key>
    <string>NSApplication</string>
</dict>
</plist>

使用的Shell脚本内容

echo -n "PROJECT_DIR: ${PROJECT_DIR}"
echo -n "INFOPLIST_FILE: ${INFOPLIST_FILE}"
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

执行脚本后的输出

Command PhaseScriptExecution failed with a nonzero exit code
PROJECT_DIR: /Users/laurent/Documents/Development/Personal/Mac OS X Projects/File Synchronization
INFOPLIST_FILE: File Synchronization Apps Store-Info.plist
Print: Entry, "CFBundleVersion", Does Not Exist

问题原因及解决方案

核心原因:路径拼接错误

你手动拼接${PROJECT_DIR}/${INFOPLIST_FILE}的方式存在隐患:

  1. echo -n导致路径显示误导,实际脚本输出的两个变量内容是连在一起的,无法准确判断拼接后的真实路径;
  2. Xcode中INFOPLIST_FILE可能是相对路径,而PROJECT_DIR的指向可能和你预期的目录存在偏差,导致拼接后的路径并未指向你修改的那个plist文件。

解决方案

  1. 直接使用Xcode提供的完整路径变量
    Xcode自带${INFOPLIST_PATH}变量,已经是plist文件的绝对路径,无需手动拼接,修改脚本如下:
echo "INFOPLIST_PATH: ${INFOPLIST_PATH}"
buildNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_PATH}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${INFOPLIST_PATH}"
  1. 修复调试用的echo命令
    去掉echo -n,让每个变量单独一行显示,方便确认路径:
echo "PROJECT_DIR: ${PROJECT_DIR}"
echo "INFOPLIST_FILE: ${INFOPLIST_FILE}"
echo "Full plist path: ${PROJECT_DIR}/${INFOPLIST_FILE}"
  1. 添加文件存在性检查
    在脚本中加入检查,确保操作的是正确的文件:
plistPath="${PROJECT_DIR}/${INFOPLIST_FILE}"
if [ ! -f "$plistPath" ]; then
    echo "Error: Plist file not found at $plistPath"
    exit 1
fi
  1. 规范PlistBuddy命令格式
    在键名前加上冒号:,明确指向根字典下的键,避免解析歧义:
# Print命令
/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "plist路径"
# Set命令
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion 新值" "plist路径"

内容的提问来源于stack exchange,提问作者Nemesys Software

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:34:55