如何通过Shell命令判断Provisioning Profile的类型(App Store/Ad Hoc)?
问题1:如何仅通过Shell判断Provisioning Profile是App Store还是Ad Hoc类型?
嘿,这个我熟!核心是抓这俩类型的结构差异:Ad Hoc是给指定测试设备用的,所以它的plist里一定会有ProvisionedDevices字段(存着设备UDID列表);而App Store类型是面向全量用户的,根本不需要指定设备,所以没有这个字段。
给你两种实用的Shell方法:
方法1:分步解码+检查(适合新手调试)
先把Provisioning Profile解码成可读的plist,再检查字段:
# 第一步:解码签名的profile到临时plist文件 security cms -D -i your_profile.mobileprovision > temp_profile.plist # 第二步:检查是否存在ProvisionedDevices字段 if /usr/libexec/PlistBuddy -c "Print :ProvisionedDevices" temp_profile.plist > /dev/null 2>&1; then echo "这是Ad Hoc类型的Provisioning Profile" else echo "这是App Store类型的Provisioning Profile" fi # 用完记得删临时文件(可选) rm temp_profile.plist
方法2:一行命令搞定(高效无残留)
不想生成临时文件?直接用管道把解码结果传给PlistBuddy:
PROFILE_PATH="your_profile.mobileprovision" if security cms -D -i "$PROFILE_PATH" | /usr/libexec/PlistBuddy -c "Print :ProvisionedDevices" /dev/stdin > /dev/null 2>&1; then echo "Ad Hoc类型" else echo "App Store类型" fi
问题2:如何判断Provisioning Profile是App Store/Ad Hoc,还是两者都不属于?
要覆盖所有情况,就得结合多个字段判断——毕竟还有Development(开发版)、Enterprise(企业分发版)这些其他类型。这里给你一个逻辑完整的脚本:
PROFILE_PATH="your_profile.mobileprovision" # 先解码并提取三个关键字段(忽略错误输出) PROVISIONED_DEVICES=$(security cms -D -i "$PROFILE_PATH" | /usr/libexec/PlistBuddy -c "Print :ProvisionedDevices" /dev/stdin 2>/dev/null) GET_TASK_ALLOW=$(security cms -D -i "$PROFILE_PATH" | /usr/libexec/PlistBuddy -c "Print :Entitlements:get-task-allow" /dev/stdin 2>/dev/null) PROFILE_TYPE=$(security cms -D -i "$PROFILE_PATH" | /usr/libexec/PlistBuddy -c "Print :ProfileType" /dev/stdin 2>/dev/null) # 开始判断类型 if [[ -n "$PROVISIONED_DEVICES" ]]; then # 有设备列表的情况:要么是Ad Hoc,要么是开发版 if [[ "$GET_TASK_ALLOW" == "false" ]]; then echo "类型:Ad Hoc" else echo "类型:Development(开发测试版,允许调试)" fi else # 无设备列表的情况:要么是App Store,要么是企业版,或者无效文件 if [[ "$PROFILE_TYPE" == "AppStore" ]]; then echo "类型:App Store" elif [[ "$PROFILE_TYPE" == "Enterprise" ]]; then echo "类型:Enterprise(企业分发版)" else echo "类型:不属于App Store/Ad Hoc,可能是无效文件或其他少见类型" fi fi
关键判断逻辑拆解:
- Ad Hoc:有
ProvisionedDevices,且get-task-allow为false(不能调试,只能分发测试) - App Store:无
ProvisionedDevices,ProfileType明确为AppStore,get-task-allow为false - Development:有
ProvisionedDevices,且get-task-allow为true(允许Xcode调试) - Enterprise:无
ProvisionedDevices,ProfileType为Enterprise(给企业内部分发用)
如果以上条件都不匹配,那大概率是损坏的profile或者其他小众类型啦。
内容的提问来源于stack exchange,提问作者BlueSialia




