iOS 8:【转】iOS开发 - 开发版+企业版无线发布一建打包

源地址:http://www.cnblogs.com/boch2436/p/4187326.html

背景:项目进入快速迭代期,需要快速地交付出AdHoc版本和企业无线发布版本。每次打包都要来回切换bundle identifier和code signing,浪费很多时间。

示例项目名称名称为TestOneKeyPublish。

  • xcode设置:

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:[email protected]
 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的主页上都有说明,有需要的可以研究一下。

时间: 2024-08-03 07:17:31

iOS 8:【转】iOS开发 - 开发版+企业版无线发布一建打包的相关文章

iOS开发 - 开发版+企业版无线发布一键打包

背景:项目进入快速迭代期,需要快速地交付出AdHoc版本和企业无线发布版本.每次打包都要来回切换bundle identifier和code signing,浪费很多时间. 示例项目名称名称为TestOneKeyPublish. xcode设置: 1.假设默认的target(即TestOneKeyPublish)用作个人开发者证书的AdHoc发布和平时的联机调试使用,这样,TestOneKeyPublish就设置为个人开发证书的bundle identifier和code signing.步骤略

《iOS开发全然上手——使用iOS 7和Xcode 5开发移动与平板应用》之Objective-C新手训练营

编写Hello World应用程序通常被觉得,是学习不论什么编程语言的第一步.在这一章,你将创建iOS版的Hello World应用程序作为起步,高速了解Xcode这个开发iOS应用程序的主要工具. 下一步.你将学习Objective-C的基础知识.在此基础之上.将探索类(class)与对象(object)的知识.它们是构建应用程序的主要基石.与此同一时候,你将创建CarValet应用程序,练习一些类的编写.并学习属性(property)的知识.在本章末尾,你将在指导下完毕编程挑战题以探索子类扩

《iOS开发完全上手——使用iOS 7和Xcode 5开发移动与平板应用》之Objective-C新手训练营

编写Hello World应用程序通常被认为,是学习任何编程语言的第一步.在这一章,你将创建iOS版的Hello World应用程序作为起步,快速了解Xcode这个开发iOS应用程序的主要工具. 下一步,你将学习Objective-C的基础知识.在此基础之上,将探索类(class)与对象(object)的知识,它们是构建应用程序的主要基石.与此同时,你将创建CarValet应用程序,练习一些类的编写,并学习属性(property)的知识.在本章末尾,你将在指导下完成编程挑战题以探索子类扩展的知识

【转载】Xcode 4.1~4.6 + iOS 5、iOS 6免证书(iDP)开发+真机调试+生成IPA全攻略

原创文章,欢迎分享:未经许可,不得转载:版权所有,侵权必究 开发环境使用的是目前为止最新的稳定版软件:Mac OS X Lion 10.7 + Xcode 4.1 目前Xcode 4.2 Preview版也已经发布,据说其修改方法跟4.1非常类似,只改动了一行代码,请参看参考文章的第二篇.本文仍以4.1版本为例. 更新:现在Xcode 4.2正式版和iOS 5均已发布,下面补充上4.2的修改方法.(2011-10-24) 各步骤会标明版本,比如(Xcode4.1请执行)和(Xcode4.2请执行

iOS定位服务与地图开发(1)---获取经纬度

定位服务是通过GPS等方式查找定位自己的位置的,再通过地图标注出来. 在iOS中定位服务和地图开发是使用两套API分别完成的. 1.定位服务: iOS系统提供3种不同定位途径: 1>WiFi定位:通过查询一个WiFi路由器的地理位置信息,iPhone.iPod Touch.iPad都可以采用. 2>蜂窝式移动电话基站定位:通过移动运营商基站定位 3>GPS卫星定位:通过3~4颗GPS卫星位置定位,最为准确,但是耗电量大 iOS不像Android系统在定位服务编程时可以指定采用哪种途径进行

[MS]Microsoft SQL Server 2008 R2 开发版/企业版/标准版

Microsoft? SQL Server? 2008 R2 是一个功能强大且可靠的数据管理系统,它功能丰富,能保护数据,并且可改善嵌入式应用程序.轻型网站和应用程序以及本地数据存储区的性能. 数据中心版:PTTFM-X467G-P7RH2-3Q6CG-4DMYB(可用,已验证)DDT3B-8W62X-P9JD6-8MX7M-HWK38(待测) 开发版:MC46H-JQR3C-2JRHY-XYRKY-QWPVM (可用,已验证)FTMGC-B2J97-PJ4QG-V84YB-MTXX8(待测)

iOS定位服务与地图开发(4)---显示地图

iOS 6之前,苹果使用的是谷歌地图,iOS 6之后,苹果使用了自己的地图(国内好像用的是高德地图),但是API编程接口与iOS 5相比没有太大变化. iOS 应用程序中使用Map Kit API开发地图应用程序,使用MKMapView类作为地图显示视图,其委托协议是MKMapViewDelegate. 1.显示地图: .h文件中代码 #import <MapKit/MapKit.h> @interface YXCViewController <MKMapViewDelegate>

iOS应用内付费(IAP)开发步骤列表

iOS应用内付费(IAP)开发步骤列表 前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作.步骤繁多,在此把开发步骤列表整理如下.因为只是步骤列表,所以并不含详细的说明教程,需要看教程的新手,可以看我附在最后的一些参考链接. 配置Developer.apple.com 登录到Developer.apple.com,然后进行以下步骤: 为应用建立建立一个不带通配符的App ID 用该App ID生成和安装相应的Provisioning Profi

iOS 开发之Widget的开发及使用(下)

在iOS 开发之Widget的开发及使用(上)中都交代清楚了关于widget扩展的添加,以及布局部分的内容,下面说下关键部分:关于数据共享的操作. 在Apple发布iOS8.0以后,对App有提供一个新的扩展选择项,叫做App groups,选择宿主Target之后,在capabilities选项卡下面会找到这个选项: 那么这个选项主要是做何使用呢? iOS系统,每个开发应该都清楚,其内部程序都是遵循沙盒机制,App与App之间,是不能进行数据共享的,A 不能访问 B 的数据,同样 B 也不能访