Shell脚本检测IPA包内plist、json文件

前言

我们项目是做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

总结

先根据需求找到思路,然后找到合适的工具,后面就水到渠成了。

你可能感兴趣的:(Shell脚本检测IPA包内plist、json文件)