Iphone 如何从shell脚本读取plist信息(bundle id)

Iphone 如何从shell脚本读取plist信息(bundle id),iphone,xcode,shell,scripting,post-processing,Iphone,Xcode,Shell,Scripting,Post Processing,我想写一个脚本,可以从应用程序的info.plist中读取信息,比如包标识符或版本号。Xcode似乎没有在其环境变量中提供这些信息。在sh/bash中是否有其他方法获取它们?您可以直接从构建的产品中读取文件。但是,如果在编辑器中查看info.plist文件本身,您将看到shell变量本身。例如,Bundle ID具有以下shell命令: com.yourcompany.${PRODUCT_NAME:rfc1034identifier} 您可以在Xcode运行并且应该填充的任何shell脚本中调

我想写一个脚本,可以从应用程序的info.plist中读取信息,比如包标识符或版本号。Xcode似乎没有在其环境变量中提供这些信息。在sh/bash中是否有其他方法获取它们?

您可以直接从构建的产品中读取文件。但是,如果在编辑器中查看info.plist文件本身,您将看到shell变量本身。例如,Bundle ID具有以下shell命令:

com.yourcompany.${PRODUCT_NAME:rfc1034identifier}

您可以在Xcode运行并且应该填充的任何shell脚本中调用
${PRODUCT_NAME:rfc1034identifier}

Mac上安装了一个名为PlistBuddy的命令行程序,可以读取/写入plist中的值。在终端中键入“man PlistBuddy”以获取更多信息。

使用苹果的应用程序PlistBuddy,可以将字符串分配给var,如下所示:

#!/bin/sh   
BUNDLE_ID=$(/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "${BUILD_ROOT}/${INFOPLIST_PATH}")

其中,如果在“运行脚本”构建阶段运行此脚本,则BUILD_ROOT和INFOPLIST_PATH是Xcode设置的变量。

默认值
命令可以读取/写入任何plist文件,只需为其指定一个路径减去
.plist
扩展名:

$ defaults read /Applications/Preview.app/Contents/Info CFBundleIdentifier

com.apple.Preview
这将直接从应用程序包的
Info.plist
文件中提取
CFBundleIdentifier


默认值也适用于二进制plist,无需任何额外步骤。

此命令适用于我:

/usr/libexec/PlistBuddy -c 'print ":CFBundleIdentifier"' Info.plist

听起来不错,虽然我还没有测试过。缺点是,您无法取回bundle id,而只能取回bundle id的最后一部分,因此您必须在某个地方硬编码“com.mycompanyname”部分……我已经尝试了PlistBuddy,并经常使用它。问题是PlistBuddy可以打印捆绑id,但不能返回它(它只返回0或1)。所以作为一个shell noob,我很难把它分配给一个变量。然而,这就是我如何使它发挥作用的。我现在就发布我的答案。这是更好的答案(尤其是因为不再默认安装PlistBuddy);您应该选择它。还要注意,默认值似乎需要完整路径,而不是相对路径,即使您当前所在的目录中有您试图读取的plist文件。(奇怪!)因此,当您在某个目录中执行此操作时,您可以使用:defaults write$PWD/SomeMyDirectory/Info.plist CFBundleIdentifier“com.apple.Preview”如果脚本在资源文件夹中运行,您可以这样做:
BUNDLEID=$(默认值为$(dirname$PWD)/Info CFBundleIdentifier)
。这是因为Info.plist位于Resources文件夹上方的父文件夹中。请注意,在10.12上,
man defaults
表示:警告:在即将发布的主要版本中,defaults命令将更改为仅在首选项域上操作。通用plist操纵实用程序将被折叠到不同的命令行程序中。PlistBuddy并不总是出现在系统中。如果分发脚本,则可以考虑使用默认值,正如其他答案所指出的那样。