【问题标题】:How to read plist information (bundle id) from a shell script如何从 shell 脚本中读取 plist 信息(bundle id)
【发布时间】:2011-05-18 17:29:23
【问题描述】:

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

【问题讨论】:

    标签: iphone xcode shell scripting post-processing


    【解决方案1】:

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

    com.yourcompany.${PRODUCT_NAME:rfc1034identifier}
    

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

    【讨论】:

    • 这听起来不错,虽然我还没有测试过。缺点是您无法取回捆绑 ID,而只能取回它的最后一部分,因此您必须在某处硬编码“com.mycompanyname”部分...
    【解决方案2】:

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

    【讨论】:

    • 我已经尝试过 PlistBuddy 并经常使用它。问题是 PlistBuddy 可以打印 bundle id 但不能返回它(它只返回 0 或 1)。因此,作为一个 shell 菜鸟,我在将其分配给变量时遇到了一些麻烦。然而,这是我设法让它工作的方式。我现在将发布我的答案。
    【解决方案3】:

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

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

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

    【讨论】:

    • PlistBuddy 并不总是存在于系统中。如果您分发脚本,您可以考虑使用默认值,正如其他答案所指出的那样。
    【解决方案4】:

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

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

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

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

    【讨论】:

    • 这是更好的答案(尤其是因为 PlistBuddy 不再默认安装);你应该选择它。
    • 另请注意,默认值似乎需要完整路径,而不是相对路径,即使您当前位于要读取的 plist 文件所在的目录中也是如此。 (奇怪!)
    • 因此,当您在某个目录中执行此操作时,您可以使用: defaults write $PWD/SomeMyDirectory/Info.plist CFBundleIdentifier "com.apple.Preview"
    • 如果脚本在资源文件夹中运行,您可以这样做:BUNDLEID=$(defaults read $(dirname $PWD)/Info CFBundleIdentifier)。这是因为 Info.plist 位于 Resources 文件夹上方的父文件夹中。
    • 注意,在 10.12,man defaults 说:警告:默认命令将在即将发布的主要版本中更改为仅在首选项域上运行。一般 plist 操作实用程序将被折叠到不同的命令行程序中。
    【解决方案5】:

    这个命令对我有用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多