【发布时间】:2011-05-18 17:29:23
【问题描述】:
我想编写一个脚本,它可以从应用程序的 Info.plist 中读取信息,例如 Bundle Identifier 或版本号。 Xcode 似乎没有在其环境变量中提供该信息。有没有其他方法可以让它们进入 sh/bash?
【问题讨论】:
标签: iphone xcode shell scripting post-processing
我想编写一个脚本,它可以从应用程序的 Info.plist 中读取信息,例如 Bundle Identifier 或版本号。 Xcode 似乎没有在其环境变量中提供该信息。有没有其他方法可以让它们进入 sh/bash?
【问题讨论】:
标签: iphone xcode shell scripting post-processing
您可以直接从构建的产品中读取文件。但是,如果您在编辑器中查看 info.plist 文件本身,您将看到 shell 变量本身。例如。 Bundle ID 具有以下 shell 命令:
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}
您可以在 Xcode 运行的任何 shell 脚本中调用 ${PRODUCT_NAME:rfc1034identifier},并且应该填充它。
【讨论】:
Mac 上安装了一个名为 PlistBuddy 的命令行程序,可以读取/写入 plist 中的值。在终端中输入“man PlistBuddy”以获取更多信息。
【讨论】:
使用 Apple 的应用 PlistBuddy,可以将字符串分配给 var,如下所示:
#!/bin/sh
BUNDLE_ID=$(/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "${BUILD_ROOT}/${INFOPLIST_PATH}")
如果您在“运行脚本”构建阶段运行此脚本,BUILD_ROOT 和 INFOPLIST_PATH 是 Xcode 设置的变量。
【讨论】:
defaults 命令可以读取/写入任何 plist 文件,只需给它一个路径减去 .plist 扩展名:
$ defaults read /Applications/Preview.app/Contents/Info CFBundleIdentifier
com.apple.Preview
这会直接从应用程序包的Info.plist 文件中提取CFBundleIdentifier 值。
默认值也适用于二进制 plist,无需任何额外步骤。
【讨论】:
BUNDLEID=$(defaults read $(dirname $PWD)/Info CFBundleIdentifier)。这是因为 Info.plist 位于 Resources 文件夹上方的父文件夹中。
man defaults 说:警告:默认命令将在即将发布的主要版本中更改为仅在首选项域上运行。一般 plist 操作实用程序将被折叠到不同的命令行程序中。
这个命令对我有用:
/usr/libexec/PlistBuddy -c 'print ":CFBundleIdentifier"' Info.plist
【讨论】: