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

总结

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容