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

Dim*_*ris 25 iphone shell scripting xcode post-processing

我想编写一个脚本,可以读取Bundle Identifier等信息,也可以从应用程序的Info.plist中读取版本号.Xcode似乎没有在其环境变量中提供该信息.还有其他办法让他们进入sh/bash吗?

joe*_*ler 50

defaults命令可以读取/写入任何plist文件,只需给它一个减去.plist扩展名的路径:

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

com.apple.Preview
Run Code Online (Sandbox Code Playgroud)

CFBundleIdentifier直接从应用程序包的Info.plist文件中提取值.

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

  • 另请注意,默认情况似乎需要完整路径,而不是相对路径,即使您当前位于包含您尝试阅读的plist文件的目录中也是如此.(奇怪的!) (15认同)
  • 因此,当您在某个目录中执行此操作时,您可以使用:defaults write $ PWD/SomeMyDirectory/Info.plist CFBundleIdentifier"com.apple.Preview" (6认同)
  • 这是更好的答案(特别是因为PlistBuddy不再默认安装); 你应该选择它. (3认同)
  • 如果一个脚本在资源文件夹中运行,你可以这样做:`BUNDLEID = $(默认读取$(dirname $ PWD)/ Info CFBundleIdentifier)`.这是因为Info.plist位于Resources文件夹上方的父文件夹中. (3认同)
  • 注意,在10.12,`man defaults`说:警告:defaults命令将在即将发布的主要版本中更改为仅在首选项域上运行.一般plist操作实用程序将折叠到不同的命令行程序中. (2认同)
  • 尽管这似乎是最好的方法 - 但它对我不起作用。我总是收到错误:“Domain MyApp.app/Contents/Info.plist 不存在”尽管它确实存在。似乎默认值需要一些东西来告诉它我正在从 .plist 读取而不是从默认系统读取。 (2认同)

Dim*_*ris 41

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

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

如果在"运行脚本"构建阶段运行此脚本,则BUILD_ROOT和INFOPLIST_PATH是由Xcode设置的变量.


小智 11

这个命令对我有用:

/usr/libexec/PlistBuddy -c 'print ":CFBundleIdentifier"' Info.plist
Run Code Online (Sandbox Code Playgroud)