用bash解析mobileprovision文件?

时间:2011-06-18 19:24:55

标签: iphone bash shell plist adhoc

我正在建立一个php / bash / mysql系统,用于自动化iPhone应用程序的adhoc发布。但我想读取项目的mobileprovision文件中的application-identifier键,并根据它更改info.plist文件。

我目前可以从php构建ipa文件,如果cfbundleidentifer密钥与其配置文件相同。

我找到了像https://gist.github.com/711794这样的代码,但我希望bash脚本将它集成到我的系统中。

由于

6 个答案:

答案 0 :(得分:47)

如果您在使用mac os x的计算机上运行此程序,则可以使用以下命令:

/usr/libexec/PlistBuddy -c 'Print :Entitlements:application-identifier' /dev/stdin <<< $(security cms -D -i path_to_mobileprovision)

答案 1 :(得分:26)

如果你想以适当的方式从mobileprovision中提取plist而不依赖grepping / sedding / etc.,你可以使用OpenSSL:

openssl smime -inform der -verify -noverify -in file.mobileprovision

您案例中的完整示例可能是:

openssl smime -inform der -verify -noverify -in file.mobileprovision > tmp.plist
/usr/libexec/PlistBuddy -c 'Print :Entitlements:application-identifier' tmp.plist

OpenSSL部分应该可以在任何平台上运行,尽管到目前为止我只在Mac上完成了。 PlistBuddy仅在Mac上,但可以找到其他实用程序来读/写属性列表文件。

答案 2 :(得分:6)

许多人中的一个解决方案......

将egrep与-a选项一起使用,该选项处理二进制文件,如文本文件和'-A 2',它将在您要匹配的字符串后显示两行:ApplicationIdentifierPrefix。

之后,使用sed修剪括号和空格行。

使用一系列管道:

egrep -a -A 2 ApplicationIdentifierPrefix file.mobileprovision | grep string | sed -e 's/<string>//' -e 's/<\/string>//' -e 's/ //'

答案 3 :(得分:6)

我根据jlawrie的答案创建了一个bash函数,列出了~/Library/MobileDevice/Provisioning Profiles文件夹中所有.mobileprovision的包ID。

将其保存到您的.bash_profile,然后从终端点击list_xcode_provisioning_profiles

list_xcode_provisioning_profiles() {
    while IFS= read -rd '' f; do
        2> /dev/null /usr/libexec/PlistBuddy -c 'Print :Entitlements:application-identifier' /dev/stdin \
            <<< $(security cms -D -i "$f")

    done < <(find "$HOME/Library/MobileDevice/Provisioning Profiles" -name '*.mobileprovision' -print0)
}

答案 4 :(得分:0)

由于.mobileprovision是“PKCS#7签名数据”左右,因此有点单调乏味。

幸运的是,你可以使用grep:)

答案 5 :(得分:0)

我使用mobileprovision-read存储库中的代码来从mobileprovision文件中提取信息。这使用macOS API来读取文件。

以下是运行生成的程序的用法:

mobileprovision-read -- mobileprovision files querying tool.

USAGE
mobileprovision-read -f fileName [-o option]

OPTIONS
    type – prints mobileprovision profile type (debug, ad-hoc, enterprise, appstore)
    appid – prints application identifier
Will print raw provision's plist if option is not specified.
You can also use key path as an option.

EXAMPLES
mobileprovision-read -f test.mobileprovision -o type
    Prints profile type

mobileprovision-read -f test.mobileprovision -o UUID
    Prints profile UUID

mobileprovision-read -f test.mobileprovision -o ProvisionedDevices
    Prints provisioned devices UDIDs

mobileprovision-read -f test.mobileprovision -o Entitlements.get-task-allow
    Prints 0 if profile doesn't allow debugging 1 otherwise