iOS工程自动打包 (Shell脚本打包)
来源:互联网 发布:威客网络兼职 编辑:程序博客网 时间:2024/05/16 07:43
公司要实现脚本打包的功能,我在网上搜了下,有好多类似的文章,看了好久才找到了一篇适合的博客,我对该作者的博客,添加了些自己的总结,使看到我博客的人可以很快的完成这项打包的任务。下面开始为大家介绍:
前提是要打包的项目在Xcode 配置好证书之后并且可以正常的打包。然后执行如下的操作
- 自动打包脚本设置:
去GitHub上下载xcode_shell,拿到“ipa-build”脚本,内容如下:
1 #!/bin/bash 2 3 #-------------------------------------------- 4 # 功能:编译xcode项目并打ipa包 5 # 使用说明: 6 # 编译project 7 # ipa-build <project directory> [-c <project configuration>] [-o <ipa output directory>] [-t <target name>] [-n] [-p <platform identifier>] 8 # 编译workspace 9 # ipa-build <workspace directory> -w -s <schemeName> [-c <project configuration>] [-n] 10 # 11 # 参数说明:-c NAME 工程的configuration,默认为Release。 12 # -o PATH 生成的ipa文件输出的文件夹(必须为已存在的文件路径)默认为工程根路径下的”build/ipa-build“文件夹中 13 # -t NAME 需要编译的target的名称 14 # -w 编译workspace 15 # -s NAME 对应workspace下需要编译的scheme 16 # -n 编译前是否先clean工程 17 # -p 平台标识符 18 # 作者:ccf 19 # E-mail:ccf.developer@gmail.com 20 # 创建日期:2012/09/24 21 #-------------------------------------------- 22 # 修改日期:2013/02/18 23 # 修改人:ccf 24 # 修改内容:打包方式改为使用xcrun命令,并修改第二个参数 25 #-------------------------------------------- 26 # 修改日期:2013/04/25 27 # 修改人:ccf 28 # 修改内容:采用getopts来处理命令参数,并增加编译前清除选项 29 #-------------------------------------------- 30 # 修改日期:2013/04/26 31 # 修改人:ccf 32 # 修改内容:增加编译workspace的功能 33 #-------------------------------------------- 34 35 36 37 if [ $# -lt 1 ];then 38 echo "Error! Should enter the root directory of xcode project after the ipa-build command." 39 exit 2 40 fi 41 42 if [ ! -d $1 ];then 43 echo "Error! The first param must be a directory." 44 exit 2 45 fi 46 47 #工程绝对路径 48 cd $1 49 project_path=$(pwd) 50 51 #编译的configuration,默认为Release 52 build_config=Release 53 54 param_pattern=":p:nc:o:t:ws:" 55 OPTIND=2 56 while getopts $param_pattern optname 57 do 58 case "$optname" in 59 "n") 60 should_clean=y 61 ;; 62 "p") 63 tmp_optind=$OPTIND 64 tmp_optname=$optname 65 tmp_optarg=$OPTARG 66 67 OPTIND=$OPTIND-1 68 if getopts $param_pattern optname ;then 69 echo "Error argument value for option $tmp_optname" 70 exit 2 71 fi 72 OPTIND=$tmp_optind 73 74 platform_id=$tmp_optarg 75 76 ;; 77 "c") 78 tmp_optind=$OPTIND 79 tmp_optname=$optname 80 tmp_optarg=$OPTARG 81 OPTIND=$OPTIND-1 82 if getopts $param_pattern optname ;then 83 echo "Error argument value for option $tmp_optname" 84 exit 2 85 fi 86 OPTIND=$tmp_optind 87 88 build_config=$tmp_optarg 89 90 ;; 91 "o") 92 tmp_optind=$OPTIND 93 tmp_optname=$optname 94 tmp_optarg=$OPTARG 95 96 OPTIND=$OPTIND-1 97 if getopts $param_pattern optname ;then 98 echo "Error argument value for option $tmp_optname" 99 exit 2100 fi101 OPTIND=$tmp_optind102 103 104 cd $tmp_optarg105 output_path=$(pwd)106 cd ${project_path}107 108 if [ ! -d $output_path ];then109 echo "Error!The value of option o must be an exist directory."110 exit 2111 fi112 113 ;;114 "w")115 workspace_name='*.xcworkspace'116 ls $project_path/$workspace_name &>/dev/null117 rtnValue=$?118 if [ $rtnValue = 0 ];then119 build_workspace=$(echo $(basename $project_path/$workspace_name))120 else121 echo "Error!Current path is not a xcode workspace.Please check, or do not use -w option."122 exit 2123 fi124 125 ;;126 "s")127 tmp_optind=$OPTIND128 tmp_optname=$optname129 tmp_optarg=$OPTARG130 131 OPTIND=$OPTIND-1132 if getopts $param_pattern optname ;then133 echo "Error argument value for option $tmp_optname"134 exit 2135 fi136 OPTIND=$tmp_optind137 138 build_scheme=$tmp_optarg139 140 ;;141 "t")142 tmp_optind=$OPTIND143 tmp_optname=$optname144 tmp_optarg=$OPTARG145 146 OPTIND=$OPTIND-1147 if getopts $param_pattern optname ;then148 echo "Error argument value for option $tmp_optname"149 exit 2150 fi151 OPTIND=$tmp_optind152 153 build_target=$tmp_optarg154 155 ;;156 157 158 "?")159 echo "Error! Unknown option $OPTARG"160 exit 2161 ;;162 ":")163 echo "Error! No argument value for option $OPTARG"164 exit 2165 ;;166 *)167 # Should not occur168 echo "Error! Unknown error while processing options"169 exit 2170 ;;171 esac172 done173 174 175 #build文件夹路径176 build_path=${project_path}/build177 #生成的app文件目录178 appdirname=Release-iphoneos179 if [ $build_config = Debug ];then180 appdirname=Debug-iphoneos181 fi182 if [ $build_config = Distribute ];then183 appdirname=Distribute-iphoneos184 fi185 #编译后文件路径(仅当编译workspace时才会用到)186 compiled_path=${build_path}/${appdirname}187 188 #是否clean189 if [ "$should_clean" = "y" ];then190 xcodebuild clean -configuration ${build_config}191 fi192 193 #组合编译命令194 build_cmd='xcodebuild'195 196 if [ "$build_workspace" != "" ];then197 #编译workspace198 if [ "$build_scheme" = "" ];then199 echo "Error! Must provide a scheme by -s option together when using -w option to compile a workspace."200 exit 2201 fi202 203 build_cmd=${build_cmd}' -workspace '${build_workspace}' -scheme '${build_scheme}' -configuration '${build_config}' CONFIGURATION_BUILD_DIR='${compiled_path}' ONLY_ACTIVE_ARCH=NO'204 205 else206 #编译project207 build_cmd=${build_cmd}' -configuration '${build_config}208 209 if [ "$build_target" != "" ];then210 build_cmd=${build_cmd}' -target '${build_target}211 fi212 213 fi214 215 216 #编译工程217 cd $project_path218 $build_cmd || exit219 220 #进入build路径221 cd $build_path222 223 #创建ipa-build文件夹224 if [ -d ./ipa-build ];then225 rm -rf ipa-build226 fi227 mkdir ipa-build228 229 230 231 #app文件名称232 appname=$(basename ./${appdirname}/*.app)233 #通过app文件名获得工程target名字234 target_name=$(echo $appname | awk -F. '{print $1}')235 #app文件中Info.plist文件路径236 app_infoplist_path=${build_path}/${appdirname}/${appname}/Info.plist237 #取版本号238 bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" ${app_infoplist_path})239 #取build值240 bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" ${app_infoplist_path})241 #取displayName242 displayName=$(/usr/libexec/PlistBuddy -c "print CFBundleDisplayName" ${app_infoplist_path})243 #IPA名称244 ipa_name="${displayName}_${platform_id}_${bundleShortVersion}_${build_config}_${bundleVersion}_$(date +"%Y%m%d")"245 echo $ipa_name246 247 #xcrun打包248 xcrun -sdk iphoneos PackageApplication -v ./${appdirname}/*.app -o ${build_path}/ipa-build/${ipa_name}.ipa || exit249 250 if [ "$output_path" != "" ];then251 cp ${build_path}/ipa-build/${ipa_name}.ipa $output_path/${ipa_name}.ipa252 echo "Copy ipa file successfully to the path $output_path/${ipa_name}.ipa"253 fi
以上代码我们可以直接使用。
1、新建一个目录:/Users/username/Documents/Jenkins/xcode-shell(~/Documents/Jenkins/xcode-shell 和前者一样) ,将“ipa-build”复制到里面。(随便创建一个目录就可以的但是你自己要知道在哪里,要能在终端访问到)
2、在上述目录下,新建一个dis-one-key-ipa-build.sh文件,内容为:
1 #!/bin/bash2 ./ipa-build ~/Documents/TestOneKeyPublish/ -n -t TestOneKeyPublishEnterprise -o ~/Documents/Jenkins/xcode-shell
其中~/Documents/TestOneKeyPublish/为工程路径,-n表明打包前执行clean,-t后面指明target名,-o后面指明目标ipa文件的位置。(路径可以根据自己的需求来定的,同样的在工程的文件夹中也会build/ipa-build 也会有生成.ipa文件)
3、给予dis-one-key-ipa-build.sh执行权限chmod +x dis-one-key-ipa-build.sh
4、然后在命令行中执行: ./dis-one-key-ipa-build.sh
这时候就会自动打包,完成后,会在/Users/username/Documents/Jenkins/xcode-shell目录下生成一个ipa文件,文件名很详细。
5、同理可以新建一个用来AdHoc发布的dev-one-key-ipa-build.sh,内容为:
1 #!/bin/bash2 ./ipa-build /Users/username/Documents/TestOneKeyPublish/ -n -t TestOneKeyPublish -o /Users/username/Documents/Jenkins/xcode-shell
现在,可以在命令行通过执行不同的脚本文件来生成不同的包,再也不需要来回切换bundle和code singing了。
- 改进的方面:
xcode_shell项目里面,还有一些功能强大的脚本,可以配置出更加自动化的脚本,这些在gitHub的主页上都有说明,有需要的可以研究一下。
原文地址:http://www.cnblogs.com/boch2436/p/4187326.html
- iOS工程自动打包 (Shell脚本打包)
- [iOS]shell 自动打包工程
- iOS利用(Shell脚本)自动打包项目工程生成ipa
- ios xcodebuild命令行自动打包 shell脚本
- 【ios开发技术】IOS项目工程自动打包并发布(用脚本实现打包)
- IOS工程自动打包
- iOS自动打包脚本
- IOS自动打包脚本
- iOS自动打包脚本
- [iOS 自动打包]shell脚本使用-ipa_build 脚本使用
- 【IOS】IOS工程自动打包并发布脚本实现
- 【IOS】IOS工程自动打包并发布脚本实现
- IOS工程自动打包并发布脚本实现
- IOS工程自动打包并发布脚本实现
- IOS工程自动打包并发布脚本实现
- IOS工程自动打包并发布脚本实现
- IOS工程自动打包并发布脚本实现
- IOS工程自动打包并发布脚本实现
- POJ 题目2796 Feel Good(动态规划)
- 关于IOS深浅拷贝的深入分析
- Leetcode #62 Unique Paths
- 【Spring五】AOP之使用注解配置
- synopsys DC
- iOS工程自动打包 (Shell脚本打包)
- C++函数重载
- 如何快速成为数据分析师?
- GRE写作必备句型
- PAT 00-自测1. 打印沙漏(20)
- 几何模板
- MSSQL Server 创建分区表
- 【Spring六】JDBC编程之XML配置
- csdn