iOS-shell脚本自动化打包

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.

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