1:背景
同一套代码,需要修改app启动图,图标等资源文件,app名称,版本号,bundleID等相应的配置,从而来生成不同的app.如果手动去修改的话,费时费力不说,有时候还有可能会漏改,改错的情况.所以这里来介绍使用shell脚本工具,去生成不同配置的app工程.
了解需求之后,可以把需要修改的配置项分为三类.
分别是1:icon资源文件替换 2:plist文件中字段修改.
2:以下是介绍满足以上需要的shell脚本
Shell脚本介绍:
Shell脚本并不能作为正式的编程语言,因为它是在linux的shell中运行的,所以成为shell脚本.
shell是一种脚本语言,可以使用逻辑判断,循环等语法,可以自定义函数.shell是系统命令的
集合,shell脚本可以实现自动化化运维,能大大增加我们的运维效率.
操作步骤
首先需要创建shell脚本文件,在终端中输入touch cp_20.sh,直接创建shell脚本文件(cp_20.sh名字可以自己根据实际来命名)
运行脚本时:首先将命令行切换到脚本文件所在的路径,回车之后,赋予脚本可执行
权限,需要输入:chmod +x cp_20.sh,然后输入sh cp_20.sh就可以直接运行脚本了.
Shell脚本开头需要加#!/bin/sh
以#开头的行作为解释说明,脚本以.sh结尾,用于区分这是一个shell脚本
在每个脚本的开头都使用”#!”,这意味着告诉你的系统这个文件的执行需要指定一个
解释器.“#!”实际上是一个2 字节的魔法数字,这是指定一个文件类型的特殊标记, 换句
话说, 在这种情况下,指的就是一个可执行的脚本(键入man magic 来获得关于这个迷人话题的
更多详细信息).在#!之后接着是一个路径名.这个路径名指定了一个解释脚本中命令的程序,这
个程序可以是 shell,程序语言或者是任意一个通用程序.这个指定的程序从头开始解释并且执
行脚本中的命令(从#!行下边的一行开始),忽略注释上边每一个脚本头的行都指定了一个不同
的命令解释器,如果是/bin/sh,那么就是默认shell(在Linux 系统中默认是bash.当然”#!”也可以被
忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用shell 内建的指令了,如果不
能使用变量的话,当然这也就失去了脚本编程的意义了.
脚本说明
appInfosLength=${#appBundleInfos[*]}
获取数组个数其他写法 =${#appBundleInfos[@]}
bedinTime=`date +%s` 记录开始时间,结尾有结束时间,用来计时打出来一个包需要多长时间
mkdir ${ipaPath}/allChannelIpa创建打包目录 还可以加双引号写:mkdir “${ipaPath}/allChannelIpa”
改路径的意思是在打包素材文件中再创建一个allChannelIpa文件来装打好的ipa包
allIPAPackPath="${ipaPath}/allChannelIpa”声明allIPAPackPath方便一下直接获取ipa路径
xcodebuild archive -workspace ${projectDir}/${schemeName}.xcworkspace-scheme ${schemeName} -configuration Release -sdkiphoneosclean -archivePath ${allIPAPackPath}/${schemeName}.xcarchive Build生成APP
-workspace 项目路径下面的.xcworkspace
–scheme 项目名称
-configuration 配置打包的环境Release或者debug
-archivePath archive 的路径
if [[$? = 0 ]]; then ([[$? = 0]] 等同于[”$?” != “0”] )
echo "\033[31m 编译成功\n \033[0m"
else echo "\033[31m
编译失败\n \033[0m"
fi 利用if语句判断build是否成功,成功的话就输出编译成功 echo输出打印
echo
"\033[31m 编译成功\n
\033[0m"
30--37前景色
40-----47 背景色
\033[0m恢复默认颜色属性
\033[45;36m设置背景为45前景为36
"\033[y;xH \033[10;25h" 把光标置于10行25列处
\033[K 清除光标行的内容
\033[u 恢复光标位
\033[s 保存当前光标位
//所有颜色和修饰符https://misc.flogisoft.com/bash/tip_colors_and_formatting
//与文件存在与否的判断-e是否存在
#
----全部打包----开始使用for遍历数组
for((i=0;i<appInfosLength;i++)); do
Bundle Name (CFBundleName)
appName=${appNameInfos[${i}]}
appDisplayName=${appNameInfos[${i}]}
appIconName=${appIconInfos[${i}]}
appBundleId=${appBundleInfos[${i}]}
mkdir $allIPAPackPath/${appName}创建不同app
ipa目录(可创建可不创建)
Applications_Path=${allIPAPackPath}/${schemeName}.xcarchive/Products/Applications #将对应的 icon
复制到需要修改的 app的目录下.xcarchive 文件下对应的Applications文件路径
rm -rf $Applications_Path/${projectName}.app/icon.png
#先删除项目中原有的icon,不然直接copy的话,会有icon重用的现象
cp -Rf $iconPath/${appIconName}/icon.png $Applications_Path/${projectName}.app/icon.png
#使用mac自带的plistbuddy修改plist文件
plist_path=$Applications_Path/${schemeName}.app/info.plist
/usr/libexec/PlistBuddy-c "Set :CFBundleName $appName"
$plist_path
/usr/libexec/PlistBuddy-c "Set :CFBundleDisplayName $appDisplayName" $plist_path
/usr/libexec/PlistBuddy-c "Set :CFBundleIdentifier $appBundleId"
$plist_path
/usr/libexec/PlistBuddy
-c "set CFBundleURLTypes:0:CFBundleURLSchemes:0 ch$appBundleId" ${plist_path}
Mac自带的一个操作plist文件的工具
路径:/usr/libexec/PlistBuddy
使用: /usr/libexec/PlistBuddy -c "Set key value" plistUrl
# 生成 ipa
xcodebuild -exportArchive -exportOptionsPlist "$allIPAPackPath/ExportOptions.plist”
-archivePath ${allIPAPackPath}/${schemeName}.xcarchive
-exportPath $allIPAPackPath/${appName}/$appBundleId
#移动位置重命名
mv /$allIPAPackPath/${appName}/$appBundleId/Rainbow.ipa /$allIPAPackPath/${appName}/$appBundleId.ipa
# 每打出来一个ipa包都得重签名,不然app安装不上 这里使用heyu证书
codesign -f -s "Apple Development: xxxx" --entitlements"$allIPAPackPath/ExportOptions.plist" $allIPAPackPath/${appName}/$appBundleId.ipa
# 清除无关文件
rm -r $allIPAPackPath/${appName}/$appBundleId
# 结束时间
endTime=`date +%s`
echo
-e "打包时间$[endTime - beginTime ]秒"
输出打包时间,从而可以更明显的看出打一个包需要多长时间
done 结束打包进程
知识延伸
1 :
-f是否为普通文件
-d 是否为目录
-s 是否为非空的文件
-p 是否为管道文件
-b 是否为块设备文件
-c 是否为字符设备文件
2: 条件分支分三种条件:单分支,双分支,多分支
单分支:
if[];then
echo
'aa'
fi
双分支:
if[];then
echo
'aa'
else
echo
'bb'
多分支:
if[];then
echo
'aa'
elif
echo
'bb'
elif
echo
'cc'
fi
3:
$var 引用var变量的值
${var} 引用var变量的值
${var%a*} 引用var变量的值并且截取a左边的字符串显示,如果字符串有多个a,则按从左向右最后一个a截取
${var%%a*} 引用var变量的值并且截取a左边的字符串显示,如果字符串有多个a,则按从左向右第一个a截取
${var#*a} 引用var变量的值并且截取a右边的字符串显示,如果字符串有多个a,则按从左向右第一个a截取
${var##*a} 引用var变量的值并且截取a右边的字符串显示,如果字符串有多个a,则按从左向右最后一个a截取
${var:3} 引用var变量的值并且从第3个字符开始截取
${var:3:6} 引用var变量的值并且从第3个字符开始截取,截取6个字符显示
${#var} 返回var变量值的长度
${var/a/b} 替换变量值的字符串,这里是把var变量值里的a换成b,如果有多个a也只能换一次
${var//a/b} 替换变量值的字符串,这里把var变量值里的a全换成b
4: 循环语句:
分为三种:while do循环,until do循环,for循环
while do循环i=10
while
[ $i
-eq
5 ];do
echo
$i;
((i--));
[ $i
-eq
5 ]可以换成(($i==5))这样写
until do循环:知道xx才执行
i=10
until (($a<0));do
echo $i;
((i--));
done;
for循环
for((i=1;i<=10;i++));do
echo $i
done;
5: PlistBuddy的几个关键点:
如何定义嵌套的键: 每个键之间使用":"符号分隔
如果键值的名称包含空格等特殊字符的时候,如同命令行的转义字符一样,使用"/"来转义,比如:
":Software:Gallery:Online/ Marketplace".
PlistBuddy如果不使用"-c"参数,则进入人机交互模式, "-c"的意思就是执行它后面的命令列表,而命令如果有参数,需要把它们包含在引号中。
需要注意的是scheme的修改:scheme
的数据结构为 数组元素可能是字典,字典key对应的value可能是数组,因此需要事先知道要修改的值的数据结构和位置,在使用plist工具时指定字典对应的key /usr/libexec/PlistBuddy
-c "set CFBundleURLTypes:0:CFBundleURLSchemes:0 ch$appBundleId" ${plist_path}
该意思是取 CFBundleURLTypes 数组下的第一个元素 X,再取
X 下 CFBundleURLSchemes 数组下的第一个元素 Y,并更新Y的值为chappBundleId.