标签:
源地址:http://www.cnblogs.com/boch2436/p/4187326.html
背景:项目进入快速迭代期,需要快速地交付出AdHoc版本和企业无线发布版本。每次打包都要来回切换bundle identifier和code signing,浪费很多时间。
示例项目名称名称为TestOneKeyPublish。
1、假设默认的target(即TestOneKeyPublish)用作个人开发者证书的AdHoc发布和平时的连接调试使用,这样,TestOneKeyPublish就设置为个人开发证书的bundle identifier和code signing。步骤略。接下来添加新的target,用作企业无线发布。
2、在xcode的Project面板,在Targets中选中TestOneKeyPublish,Duplicate出一个新的target,默认名称为TestOneKeyPublish copy。
3、将新target的名字修改成TestOneKeyPublishEnterprise。现在在Xcode的Toolbar的scheme中应该会有一个TestOneKeyPublish copy的新scheme。是的,名字看起来很没有特色。接下来我们统一命名。
4、选择“Manage Scheme...”,在里面删除TestOneKeyPublish copy,保存后,回到主界面选择“New Scheme...”,在”Target“栏中选择刚改名的TestOneKeyPublishEnterprise,“Name”栏填写“TestOneKeyPublishEnterprise”。在新的target,即“TestOneKeyPublishEnterprise”的Build Settings中搜索Product Name,修改名字为TestOneKeyPublishEnterprise。这样就完成了命名的统一。
5、既然要用作企业无线发布,当然需要修改TestOneKeyPublishEnterprise这一target的bundle identifier和code signing为企业证书的appID和provisioning profile。步骤略。
去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 2
100 fi
101 OPTIND=$tmp_optind
102
103
104 cd $tmp_optarg
105 output_path=$(pwd)
106 cd ${project_path}
107
108 if [ ! -d $output_path ];then
109 echo "Error!The value of option o must be an exist directory."
110 exit 2
111 fi
112
113 ;;
114 "w")
115 workspace_name=‘*.xcworkspace‘
116 ls $project_path/$workspace_name &>/dev/null
117 rtnValue=$?
118 if [ $rtnValue = 0 ];then
119 build_workspace=$(echo $(basename $project_path/$workspace_name))
120 else
121 echo "Error!Current path is not a xcode workspace.Please check, or do not use -w option."
122 exit 2
123 fi
124
125 ;;
126 "s")
127 tmp_optind=$OPTIND
128 tmp_optname=$optname
129 tmp_optarg=$OPTARG
130
131 OPTIND=$OPTIND-1
132 if getopts $param_pattern optname ;then
133 echo "Error argument value for option $tmp_optname"
134 exit 2
135 fi
136 OPTIND=$tmp_optind
137
138 build_scheme=$tmp_optarg
139
140 ;;
141 "t")
142 tmp_optind=$OPTIND
143 tmp_optname=$optname
144 tmp_optarg=$OPTARG
145
146 OPTIND=$OPTIND-1
147 if getopts $param_pattern optname ;then
148 echo "Error argument value for option $tmp_optname"
149 exit 2
150 fi
151 OPTIND=$tmp_optind
152
153 build_target=$tmp_optarg
154
155 ;;
156
157
158 "?")
159 echo "Error! Unknown option $OPTARG"
160 exit 2
161 ;;
162 ":")
163 echo "Error! No argument value for option $OPTARG"
164 exit 2
165 ;;
166 *)
167 # Should not occur
168 echo "Error! Unknown error while processing options"
169 exit 2
170 ;;
171 esac
172 done
173
174
175 #build文件夹路径
176 build_path=${project_path}/build
177 #生成的app文件目录
178 appdirname=Release-iphoneos
179 if [ $build_config = Debug ];then
180 appdirname=Debug-iphoneos
181 fi
182 if [ $build_config = Distribute ];then
183 appdirname=Distribute-iphoneos
184 fi
185 #编译后文件路径(仅当编译workspace时才会用到)
186 compiled_path=${build_path}/${appdirname}
187
188 #是否clean
189 if [ "$should_clean" = "y" ];then
190 xcodebuild clean -configuration ${build_config}
191 fi
192
193 #组合编译命令
194 build_cmd=‘xcodebuild‘
195
196 if [ "$build_workspace" != "" ];then
197 #编译workspace
198 if [ "$build_scheme" = "" ];then
199 echo "Error! Must provide a scheme by -s option together when using -w option to compile a workspace."
200 exit 2
201 fi
202
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 else
206 #编译project
207 build_cmd=${build_cmd}‘ -configuration ‘${build_config}
208
209 if [ "$build_target" != "" ];then
210 build_cmd=${build_cmd}‘ -target ‘${build_target}
211 fi
212
213 fi
214
215
216 #编译工程
217 cd $project_path
218 $build_cmd || exit
219
220 #进入build路径
221 cd $build_path
222
223 #创建ipa-build文件夹
224 if [ -d ./ipa-build ];then
225 rm -rf ipa-build
226 fi
227 mkdir ipa-build
228
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.plist
237 #取版本号
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 #取displayName
242 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_name
246
247 #xcrun打包
248 xcrun -sdk iphoneos PackageApplication -v ./${appdirname}/*.app -o ${build_path}/ipa-build/${ipa_name}.ipa || exit
249
250 if [ "$output_path" != "" ];then
251 cp ${build_path}/ipa-build/${ipa_name}.ipa $output_path/${ipa_name}.ipa
252 echo "Copy ipa file successfully to the path $output_path/${ipa_name}.ipa"
253 fi
作者很细心地解释了整个脚本的使用注意事项,我们可以直接使用。
1、新建一个目录:/Users/username/Documents/Jenkins/xcode-shell ,将“ipa-build”复制到里面。
2、在上述目录下,新建一个dis-one-key-ipa-build.sh文件,内容为:
1 #!/bin/bash 2 ./ipa-build /Users/username/Documents/TestOneKeyPublish/ -n -t TestOneKeyPublishEnterprise -o /Users/username/Documents/Jenkins/xcode-shell
其中/Users/username/Documents/公司文稿/TestOneKeyPublish/为工程路径,-n表明打包前执行clean,-t后面指明target名,-o后面指明目标ipa文件的位置。
3、给予dis-one-key-ipa-build.sh执行权限。然后在命令行中执行: ./dis-one-key-ipa-build.sh
这时候就会自动打包,完成后,会在/Users/username/Documents/Jenkins/xcode-shell目录下生成一个ipa文件,文件名很详细。
4、同理可以新建一个用来AdHoc发布的dev-one-key-ipa-build.sh,内容为:
1 #!/bin/bash 2 ./ipa-build /Users/username/Documents/TestOneKeyPublish/ -n -t TestOneKeyPublish -o /Users/username/Documents/Jenkins/xcode-shell
现在,可以在命令行通过执行不同的脚本文件来生成不同的包。
xcode_shell项目里面,还有一些功能强大的脚本,可以配置出更加自动化的脚,这些在gitHub的主页上都有说明,有需要的可以研究一下。
iOS 8:【转】iOS开发 - 开发版+企业版无线发布一建打包
标签:
原文地址:http://www.cnblogs.com/michaellfx/p/4187417.html