如何将IPA中提取的Info.plist内容直接传递给PlistBuddy?
解决PlistBuddy读取直接提取的IPA中Info.plist的问题
你遇到的核心问题是提取出的Info.plist是二进制格式,而你用<<< $(unzip ...)的方式传递数据时,shell会把二进制内容当作文本字符串处理,破坏了原始的二进制结构,导致PlistBuddy无法正确解析。
正确的解决方案:直接用管道传递二进制数据
unzip -qp会直接输出指定文件的原始二进制内容,我们可以通过管道直接把这个二进制流传给PlistBuddy,它完全支持读取标准输入的二进制plist:
unzip -qp test.ipa Payload/*.app/Info.plist | /usr/libexec/PlistBuddy -c "Print" /dev/stdin
这个命令会:
- 仅从IPA中提取
Payload/*.app/Info.plist的原始内容(不解压整个文件) - 通过管道将二进制plist直接传递给PlistBuddy
- PlistBuddy读取
/dev/stdin的二进制数据,正常解析并输出内容
为什么你的原命令会报错?
你用的<<< $(unzip -qp ...)是shell的here-string语法,它会先执行unzip命令,把输出的二进制内容当作文本字符串处理——shell会把二进制中的非打印字符转义或丢弃,导致原始的二进制plist结构被破坏。比如开头的bplist00本来是二进制标识,被当成了文本字符,PlistBuddy读取时就会出现Unexpected character b的错误。
优化你的脚本
把原来的脚本改成只提取目标文件的版本,处理大IPA时速度会快很多:
#!/bin/bash # 检查参数是否正确 if [ $# -ne 1 ]; then echo "Usage: $0 <path-to-your-ipa-file>" exit 1 fi # 直接提取并解析Info.plist unzip -qp "$1" Payload/*.app/Info.plist | /usr/libexec/PlistBuddy -c "Print" /dev/stdin
可选:转成XML格式处理(如果需要)
如果你需要先把二进制plist转成XML格式再处理,可以用plutil做转换,再传给PlistBuddy,但这会多一步处理,效率略低:
unzip -qp test.ipa Payload/*.app/Info.plist | plutil -convert xml1 -o - - | /usr/libexec/PlistBuddy -c "Print" /dev/stdin
内容的提问来源于stack exchange,提问作者mles
相关产品推荐
相关产品推荐

