编写shell命令实现IOS的自动打包

开发过程中,需要这样的需求:

App的两个运行环境,一个是测试环境,一个是发布环境,两个环境的服务器Api是不同的。每次,编译打包测试软件的时候,很麻烦。因此,需要编写一个shell脚本,可以根据传入的参数,自动打包测试版或者发布版App,同时可以生成 无线安装所需的plist文件。接下来,我们分布讲解如何实现这个需求。

1.shell编程基础知识

1.1如何创建shell程序

首先,推荐大家一个mac系统的文本编辑软件Sublime Text,可以提高我们编写shell指令的效率。

Mac环境下,如何创建shell脚本?下面,我们以 桌面上创建一个名为 hello 的shell脚本 为例子 ,讲解创建shell的基本步骤:

1.打开终端,输入命令,进入桌面目录

cd /Users/huberysun/Desktop

2. 创建文件 hello

touch hello

3.使用sublime Tex打开文件 ,输入如下内容

#!/bin/bash  

#对变量赋值:  

variable="Hello"  #等号两边均不能有空格存在  

# 现在打印变量:  

echo ${variable} 

注意:

shell脚本的第一行必须是 #!/bin/bash,告诉系统这个文件是shell程序。

4.想要使得包含shell指令的文件可以执行,我们必须执行如下命令

chmod +x hello 

5.操作完成以上的步骤,就可以使用 shell程序了,进入shell程序所在的目录之后,在终端输入如下命令即可

./hello

1.2 shell编程的基本规范

定义变量,直接声明一个变量名称,后面紧跟等号和变量值,值得注意的是,变量名和等号之间,等号和变量值之间 都不能有空格

variable="Hello" 

使用变量时候,只需要在变量名之前加一个$符号

echo $variable

你也可以在变量名外面加上{}符号,我们推荐使用这种方式

echo ${variable}  

shell程序是可以接受参数的,关于shell程序的参数相关的知识,推荐看这个文章

getopt:命令行选项、参数处理

条件语句是一种很重要的控制语句,shell中关于条件语句的知识,可以参考如下文章

条件判断式

2.Xcode的打包命令

在Xcode开发环境中,我们使用Command+r命令编译代码,得到一个格式为.app 的二进制文件。我们可以通过以下的方式,找到.app文件的存储位置。

打开xcode的preferences菜单

选择Locations Tab选项,Derived Data指示的就是编译文件的存放位置。

说了这么多,那么Xcode是如何编译二进制文件.app的呢?Xcode提供了指令 xcodebuild 来实现编译文件。

xcodebuild命令可以 把项目文件 编译成 .app文件,但是,iPhone真机上App软件的格式是.ipa的,因此,我们可以猜到,xcode一定还存在一个指令,可以把.app文件转换成.ipa文件。这个指令就是 xcrun。关于 xcodebuild 和 xcrun命令 的详细使用情况,可以参考这篇文章iOS自动打包并发布脚本

3.跳过AppStore,通过WiFi无线安装App

OTA即Over-the-Air,是Apple在 iOS4 中新加的一项技术,目的是让开发者能够脱离Appstore,实现从自己的服务器下载并安装iOS应用。简单地说,就是用户只需要在Safari中点开一条链接,就能直接在主界面中安装App。

关于如何无线安装 App的详细步骤,可以参考文章实现 iOS App 在线安装(局域网OTA)

4.编写shell脚本,实现自动打包

这个shell脚本,接受两个参数,第一个参数 指定了项目所在的主目录 ,第二个参数指明了 App的运行环境,是发布环境 还是测试环境。shell脚本的实现分为四个步骤:

1. 根据第二个参数,生成配置文件cmf.plist(包含了一些服务的Api地址)

2. 使用xcodebuild 命令 打包生成 .app文件

3. 使用xcrun 命令打包生成 .ipa文件

4. 生成 无线安装 所需的 plist 文件

需要声明的是,这个脚本的编写思路参考与 github上源码xcode_shell

#!/bin/bash  


if [ ! -d $1 ];then  

echo"Error! The first param must be a directory."  

exit2  

fi  


#工程绝对路径  

cd $1  

project_path=$(pwd)  


#判断所输入路径是否是xcode工程的根路径  

ls | grep .xcodeproj > /dev/null  

rtnValue=$?  

if [ $rtnValue != 0 ];then  

echo"Error!! The param must be the root path of a xcode project."  

    exit  

fi  


#获取部署环境参数  

enviroment=$2  

if [ $2 != r -a $2 != d ]; then  

echo" must specify the environment argument in r or d"  

    exit  

fi  


#根据部署环境,重写cmf.plist  

config_path=${project_path}/Cmpd  

config_file=cmf.plist  

cd $config_path  

#判断是否包含cmf.plist  

ls ./${config_file} &>/dev/null  

rtnValue=$?  

if [ $rtnValue != 0 ];then  

echo"No cmf.plist file exists."  

else  

echo"remove cmf.plist file"  

    rm -rf $config_file  

fi  


#重写cmf.plist  

if [ $2 == r ]; then  

echo"hh"  

cat << EOF > $config_file  



  

      

        JPush  

        极光推送模块  



EOF  

else  

cat << EOF > $config_file  



  

      

        JPush  

        极光推送模块  



EOF  

fi  



#编译的configuration,默认为Release  

build_config=Release  

echo"home"  

#build文件夹路径  

build_path=${project_path}/build  

#生成的app文件目录  

appdirname=Release-iphoneos  


#clean release  

xcodebuild clean -configuration ${build_config}  


#组合编译命令  

build_cmd='xcodebuild'  

build_cmd=${build_cmd}' -configuration '${build_config}  


#编译工程  

cd $project_path  

$build_cmd || exit  



#进入build路径  

cd $build_path  


#创建ipa-build文件夹  

if [ -d ./ipa-build ];then  

    rm -rf ipa-build  

fi  

mkdir ipa-build  


#app文件名称  

appname=$(basename ./${appdirname}/*.app)  


#app文件中Info.plist文件路径  

app_infoplist_path=${build_path}/${appdirname}/${appname}/Info.plist  

#取版本号  

bundleShortVersion=$(/usr/libexec/PlistBuddy -c"print CFBundleShortVersionString" ${app_infoplist_path})  

#取build值  

bundleVersion=$(/usr/libexec/PlistBuddy -c"print CFBundleVersion" ${app_infoplist_path})  

#取bundleIdentifier  

bundleIdentifier=$(/usr/libexec/PlistBuddy -c"print CFBundleIdentifier" ${app_infoplist_path})  

#取bundleName  

bundleName=$(/usr/libexec/PlistBuddy -c"print CFBundleName" ${app_infoplist_path})  

#用于存储ipa、plist  

target_name=${bundleName}  

#IPA名称  

ipa_name="${bundleName}_$(date +"%Y%m%d")"  

echo $ipa_name  


#xcrun打包  

xcrun -sdk iphoneos PackageApplication -v ./${appdirname}/*.app -o ${build_path}/ipa-build/${ipa_name}.ipa || exit  



if [ "$output_path" != "" ];then  

    cp ${build_path}/ipa-build/${ipa_name}.ipa $output_path/${ipa_name}.ipa  

echo"Copy ipa file successfully to the path $output_path/${ipa_name}.ipa"  

fi  



#生成plist,上传到内网  


#判断是否执行过ipa-build脚本  

cd $project_path  

ls ./build/ipa-build/*.ipa &>/dev/null  

rtnValue=$?  

if [ $rtnValue != 0 ];then  

echo"Error!! No ipa files exists.Please run the \"ipa-build\" shell script first"  

    exit  

fi  



#进入到工程build路径下  

cd $build_path  


if [ -d ./$target_name ];then  

    rm -rf $target_name  

fi  

mkdir $target_name  


#拷贝ipa  

cp ./ipa-build/*.ipa ./$target_name/${target_name}.ipa  

cd $target_name  


#ipa下载url  

ipa_download_url=${pulish_url}/${target_name}/${target_name}.ipa  


#生成plist文件  

cat << EOF > ${target_name}.plist  



  

  

   items  

     

         

           assets  

             

                 

                   kind  

                   software-package  

                   url  

                   ${ipa_download_url}  


                 

                   kind  

                   display-image  

                   needs-shine  

                     

                   url  

                   ${pulish_url}/${target_name}/${target_name}_logo.png  


             

                   kind  

                   full-size-image  

                   needs-shine  

                     

                   url  

                   ${pulish_url}/${target_name}/${target_name}_logo.png  


           metadata  

             

               bundle-identifier  

               ${bundleIdentifier}  

               bundle-version  

               ${bundleVersion}  

               kind  

               software  

               subtitle  

               ${bundleName}  

               title  

               ${bundleName}  







EOF  

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011417590/article/details/51547225

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 前言 自动化(Automation)是指机器设备、系统或过程(生产、管理过程)在没有人或较少人的直接参与下,按照人...
    秦明Qinmin阅读 2,491评论 1 12
  • 上图的三个文件是打包脚本中要用的,百度自动打包就会找到 # !/bin/bash## 联系方式 :# BY# wy...
    王洋Future阅读 1,834评论 0 0
  • 使用xcodebuild和xcrun打包签名 要构建Xcode项目,可以从包含项目的目录(即包含名称的目录)运行x...
    花椒不麻牙阅读 443评论 1 0
  • 推荐一个自动化打包的工具套件,提供一个运行良好的持续部署流程,只需要运行一个简单的命令就可以触发这个流程。下面是G...
    終于阅读 557评论 0 1