前言
我们项目是做IOS移动端sdk开发和客户支持的,现在需要写一个脚本,根据客户提供的ipa包,自动检测包内plist文件和json文件的配置是否正确。我选择了用Shell脚本写。
思路
使用zip解包,定位到需要解析的文件位置,使用PlistBuddy解析plist文件,使用jq解析json文件,最后把解析的信息输出到text文件。
第一步,ipa解包
#脚本接收一个参数是ipa路径
#ipa路径
IPA_FILE=${1}
#解压路径
IPA_DIR="/Users/chen.peng/Desktop/ipaTemp"
#删除临时解包目录
if [ -d "$IPA_DIR" ]; then
echo "rm ipatemp"
rm -rf "${IPA_DIR}"
else
echo "mkdir ipatemp"
mkdir -p "${IPA_DIR}"
fi
#解包IPA
if [[ -f "$IPA_FILE" ]]; then
echo "unzip $IPA_FILE begin ..."
unzip -q "$IPA_FILE" -d "$IPA_DIR"
if [[ $? != 0 ]]; then
echo "unzip $IPA_FILE failed"
exit 2
else
echo "unzip $IPA_FILE successed"
fi
fi
第二步,定位到plist文件位置,并解析
1、先定位到plist文件
# 定位到*.app目录
appDir="$IPA_DIR/Payload/`ls "$IPA_DIR/"Payload`"
#定位到plist文件
infoPlist="${appDir}/Info.plist"
echo ${infoPlist}
2、判断一些固定的参数是否设置
这里写了一个方法统一处理
#判断是否设置 ${1}为info.plist中的key,${2}为打印的文字
function charge {
tempValue=`/usr/libexec/PlistBuddy -c "Print :${1}" $infoPlist`
echo $tempValue
if [[ -n $tempValue ]]; then
noteString=$noteString${2}"已设置;"
else
warningString=$warningString${2}"未设置;"
fi
}
这里要了解的是PlistBuddy的命令,可以参考这篇文章
然后直接调用传入需要检测的key和打印的文字即可
#判断基本设置
charge $calendars "日历"
charge $photo "打开相册权限"
charge $photoAdd "相册添加图片权限"
3、判断一些参数是否设置正确
同样写了一个方法统一处理
#${1}为值,${2}为打印的文字
function chargeTrue {
if [[ ! -n "${1}" ]]; then
warningString=$warningString"${2}未设置;"
else
if [[ "${1}" = "false" || "${1}" = "NO" || "${1}" = "no" ]]; then
noteString=$noteString"${2}设置为false;"
elif [[ "${1}" = "true" || "${1}" = "YES" || "${1}" = "yes" ]]; then
warningString=$warningString"${2}设置为true;"
else
warningString=$warningString"${2}设置错误;"
fi
fi
}
然后取出值,传入方法判断即可
debugLogValue=`/usr/libexec/PlistBuddy -c "Print :${debugLog}" $infoPlist`
echo ${debugLogValue}
chargeTrue $debugLogValue "debugLog"
第三步,解析json文件
首先需要安装jq,可以在终端使用brew直接安装
brew install jq
然后定位到文件,调用jq取出值,再调用之前的方法判断即可
# 定位到appInfo.json路径
appInfo="${appDir}/appInfo.json"
if [[ -f "$appInfo" ]]; then
#获取sandbox的值
sandbox=`cat ${appInfo} | jq -r '.sandbox'`
echo ${sandbox}
chargeTrue ${sandbox} "sandbox"
fi
jq的使用可以参考这篇文章
第四步,解析sdkVersion
因为需要解析的plist文件在我们的sdk中,所以需要先用find找到bundle,再定位到plist文件。代码如下:
#先查找lcm.bundle所在路径,以防路径不对
lcmBundle=`find "${appDir}/" -type d -name lcm.bundle`
lcmInfoPlist="${lcmBundle}/Info.plist"
echo $lcmInfoPlist
sdkVersionValue=`/usr/libexec/PlistBuddy -c "Print :SDK_VERSION" $lcmInfoPlist`
echo $sdkVersionValue
noteString=$noteString"SDK_VERSION="$sdkVersionValue
最后将检测的信息输出到text文件
echo "${warningString}\n${noteString}" > "$IPA_DIR"/waring.text
下面是完整代码,注释应该很详细了
#!/bin/sh
#脚本接收一个参数是ipa路径
wxKey="WX_KEY"
fbAppId="FacebookAppID"
fbName="FacebookDisplayName"
menuBarPosition="MenuBarPosition"
calendars="NSCalendarsUsageDescription"
photo="NSPhotoLibraryUsageDescription"
photoAdd="NSPhotoLibraryAddUsageDescription"
qqID="QQ_APP_ID"
qqKey="QQ_APP_KEY"
debugLog="debugLog"
#ipa路径
IPA_FILE=${1}
#解压路径
IPA_DIR="/Users/chen.peng/Desktop/ipaTemp"
warningString="错误:"
noteString="提示:"
#删除临时解包目录
if [ -d "$IPA_DIR" ]; then
echo "rm ipatemp"
rm -rf "${IPA_DIR}"
else
echo "mkdir ipatemp"
mkdir -p "${IPA_DIR}"
fi
#解包IPA
if [[ -f "$IPA_FILE" ]]; then
echo "unzip $IPA_FILE begin ..."
unzip -q "$IPA_FILE" -d "$IPA_DIR"
if [[ $? != 0 ]]; then
echo "unzip $IPA_FILE failed"
exit 2
else
echo "unzip $IPA_FILE successed"
fi
fi
# 定位到*.app目录
appDir="$IPA_DIR/Payload/`ls "$IPA_DIR/"Payload`"
infoPlist="${appDir}/Info.plist"
echo ${infoPlist}
#判断是否设置 ${1}为info.plist中的key,${2}为打印的文字
function charge {
tempValue=`/usr/libexec/PlistBuddy -c "Print :${1}" $infoPlist`
echo $tempValue
if [[ -n $tempValue ]]; then
noteString=$noteString${2}"已设置;"
else
warningString=$warningString${2}"未设置;"
fi
}
#${1}为值,${2}为打印的文字
function chargeTrue {
if [[ ! -n "${1}" ]]; then
warningString=$warningString"${2}未设置;"
else
if [[ "${1}" = "false" || "${1}" = "NO" || "${1}" = "no" ]]; then
noteString=$noteString"${2}设置为false;"
elif [[ "${1}" = "true" || "${1}" = "YES" || "${1}" = "yes" ]]; then
warningString=$warningString"${2}设置为true;"
else
warningString=$warningString"${2}设置错误;"
fi
fi
}
#判断基本设置
charge $calendars "日历"
charge $photo "打开相册权限"
charge $photoAdd "相册添加图片权限"
debugLogValue=`/usr/libexec/PlistBuddy -c "Print :${debugLog}" $infoPlist`
echo ${debugLogValue}
chargeTrue $debugLogValue "debugLog"
region=`/usr/libexec/PlistBuddy -c "Print :CFBundleDevelopmentRegion" $infoPlist`
if [ "${region}" = "zh_CN" ]; then
charge $wxKey "微信"
else
charge $fbName "FacebookDisplayName"
charge $fbAppId "FacebookAppID"
fi
#需要安装jq,brew install jq
# 定位到appInfo.json路径
appInfo="${appDir}/appInfo.json"
if [[ -f "$appInfo" ]]; then
#获取sandbox的值
sandbox=`cat ${appInfo} | jq -r '.sandbox'`
echo ${sandbox}
chargeTrue ${sandbox} "sandbox"
fi
#先查找lcm.bundle所在路径,以防路径不对
lcmBundle=`find "${appDir}/" -type d -name lcm.bundle`
lcmInfoPlist="${lcmBundle}/Info.plist"
echo $lcmInfoPlist
sdkVersionValue=`/usr/libexec/PlistBuddy -c "Print :SDK_VERSION" $lcmInfoPlist`
echo $sdkVersionValue
noteString=$noteString"SDK_VERSION="$sdkVersionValue
echo "${warningString}\n${noteString}" > "$IPA_DIR"/waring.text
总结
先根据需求找到思路,然后找到合适的工具,后面就水到渠成了。