了解 xcodebuild 命令 ,自动打包ipa
引用博客:http://blog.nswebfrog.com/2015/10/31/xcodebuild/
在 iOS 开发中,如果需要把工程打包成 ipa 文件,通常的做法就是在 Xcode 里点击 「Product -> Archive」,等待整个工程 archive 后,然后在自动弹出的 「Organizer」 中进行选择,根据需要导出 ad hoc,enterprise 类型的 ipa 包。虽然 Xcode 通过提供的 GUI 操作已经屏蔽了大部分的细节,但作为一个偷懒的程序员,当然只是想简单的执行一个命令,然后坐下来惬意地喝一杯茶,静静等待整个过程的完成。那 xcodebuild 这个命令就是来完成这个事情的。
目前已经有不少封装得很不错的第三方打包服务可以用,比如最出名的有 AFNetworking 的作者 mattt 大大的 shenzhen (没错,就是深圳),还有一个名叫 gym 也很不错。这些库都是对 xcodebuild 这个命令做了一些封装,更方便使用而已。
xcodebuild 使用方法
xcodebuild 命令是 Xcode Command Line Tools 的一部分。通过调用这个命令,可以完成 iOS 工程的编译,打包和签名过程。这个命令随着 Xcode 的版本不同使用方法上也会有所不同。打开命令行,调用以下命令查看使用方法
xcodebuild --help
虽然这个命令屏蔽了大量编译器的细节,实际使用起来还是较为繁琐,使用的话最好还是对其做一层封装,来更方便地使用,这个之后的文章里再细说。

上面截图中显示了命令执行结果。当前环境是目前最新的 Xcode 7.1。
Archive 工程
我们就根据显示的帮助信息来调用命令完成整个打包的过程吧。首先需要了解的是,archive 工程后,实际上我们是把整个工程编译,然后签名,变成了一个后缀名为 xcarchive 的文件。通过调用以下命令,我们将整个工程编译,签名,然后将生成的 xcarchive 文件放到工程根路径下的 build 文件夹里。
xcodebuild -scheme <schemeName> -archivePath build/<schemeName>.xcarchive archive
参数说明:SchemeName 就是工程的 scheme 的名字,在 Xcode 中可以看到。如下图

如果工程使用了 Cocoapods 来管理第三方库,那么命令的执行方式上有所不同,因为 Cocoapods 会把工程变成一个 workspace。将 workspace 工程 archive 的命令如下。
xcodebuild -workspace <workspaceName> -scheme <schemeName> -archivePath build/<schemeName>.xcarchive archive
这个命令和上面的命令区别就在于需要指定 workspace 的文件名。
上面这两个命令适用于不同类型的工程: workspace 或者非 workspace。执行中读取的配置都是在工程的 Target 或者 Scheme 中设置好的配置。比如,archive 进行编译的是 release 环境,这个在工程的 scheme 中可以看到。而签名的证书默认也是在各个 Target 的 Build Setting 中的配置。
命令中可以添加一些参数实现在命令执行时配置不同的环境。比如,如果想 archive 出 Debug 环境的包,那么就可以在命令中添加 -configuration Debug 参数。对于非 workspace 的工程,还可以通过添加 PROVISIONING_PROFILE=<profileuuid> 的参数来指定签名所用的 Profile 文件,参数的值为 profile 文件的 UUID。
注意:如果下一步中需要导出的是 enterprise 类型的 ipa 包,则导出过程中使用的 profile 文件中指定的 identifier 一定要和相应的 target 的 Bundle Identifier 完全一样,不能使用包含通配符 * 的 profile
小提示:如果 archive 命令无法执行成功, 则可以在 Xcode 中通过点击「Product -> Archive」来查看产生问题的原因。如果 Xcode 中操作没有问题,那么 archive 命令也是可以正确执行的。
导出 IPA
接下来就是将上一步生成的 xcarchive 文件导出,生成 ipa 文件。这里需要用到的命令是 xcodebuild -exportArchive。
从上面的帮助文件中可以看到命令的使用方法。这里需要注意的是,目前的 Xcode 7 中此命令的使用已经变成使用 -exportOptionsPlist 的参数形式了。这种形式支持 bitcode 的功能。但在实际的使用中,我发现使用这种形式我们工程并不能正确导出 ipa 包。原因我暂未找到,关于 xcodebuild 的资料也真是少的可怜。我猜测是我们工程未使用 bitcode 导致。所以我改为使用了 Xcode 6 时代的 -exportFormat IPA参数来完成导出 ipa 包的功能。
xcodebuild -exportArchive -exportFormat IPA -archivePath <archivePath> -exportPath <exportPath>
参数说明:archivePath 就是上一步生成的 xcarchive 文件的路径。exportPath 就是导出的 ipa 文件路径。
如果导出的 ipa 中要更换 profile 文件,也就是需要修改上一步中 archive 文件用于签名的 profile 文件,有两种方式可以完成这个任务。
一种方式是直接指定新的 profile 文件,用法是添加参数 -exportProvisioningProfile <profile name> 这种用法适用于只有一个 target 的项目。
如果工程中有多于一个的 tagert, 比如提供了 watchkit 的功能。由于 watchkit 和 watchkitextension 的 target 也分别需要不同的 profile,需要使用第二种形式的参数, -exportSigningIdentity <signing identity name> 只要相关的 profile 文件已经正确安装,那么就可以导出需要的 ipa 文件。 identity 可以在 Keychain 中找到。如下图

实例
以一个实际工程举例,该工程的名字叫 Tyrion。Scheme 名字也是 Tyrion。 那么 archive 的命令如下
xcodebuild -scheme Tyrion -archivePath build/Tyrion.xcarchive archive
导出 ipa 包的命令如下
xcodebuild -exportArchive -exportFormat IPA -archivePath build/Tyrion.xcarchive -exportPath build/Tyrion.ipa
依次执行完这两个命令后,工程根路径下的 build 文件夹内容如下图。

后续
导出 ipa 包后,就可以利用 iFunBox 之类的软件直接安装到对应的 iPhone ,或者利用 items-service 协议来远程安装。
就整个 CI 环境搭建来说,能够通过命令行正确导出 ipa 包只是完成了第一步,要完成整个自动化构建,还需要能够自动将 ipa 包发布出去。这篇文章就到此为止啦~~
了解 xcodebuild 命令 ,自动打包ipa的更多相关文章
- iOS利用xcodebuild命令自动打包方法
1,xcode项目先打包试一下可以打包成功 2,创建一plist导出文件 3,xcodebuild命令直接运行 导出文件内容: <?xml version="1.0" enc ...
- xcodebuild命令行打包发布ipa
配置好证书,然后在命令行转到项目目录 1.清除 EthantekiiMac:CTest ethan$ xcodebuild clean 2.编译 EthantekiiMac:CTest ethan$ ...
- gradle编译命令 & 自动打包等
./gradlew -v 版本号,首次运行,没有gradle的要下载的哦. ./gradlew clean 删除HelloWord/app目录下的build文件夹 ./gradlew build 检查 ...
- iOS 本地自动打包工具
1.为什么要自动打包工具? 每修改一个问题,测试都让你打包一个上传fir , 你要clean -> 编译打包 -> 上传fir -> 通知测试.而且打包速度好慢,太浪费时间了.如果有 ...
- 基于python脚本,实现Unity全平台的自动打包
转载请标明出处:http://www.cnblogs.com/zblade/ 0. 概述 本文主要针对项目中自动打包过程进行调研,实现用python脚本来打出win/android/ios三个平台下的 ...
- ios自动打包-fastlane 安装、使用、更新和卸载
ios自动打包使用fastlane 1.首先安装xcode 首先检查是否已经安装 Xcode 命令行工具,fastlane 使用 xcodebuild 命令进行打包,运行 xcode-select - ...
- XCode自动打ipa包脚本 命令
XCode 新建文件 选择other Shell script 放入下面命令行. #工程绝对路径 #cd $ project_path=$(pwd) #build文件夹路径 build_path=$ ...
- xcodebuild和xcrun实现自动打包iOS应用程序
随着苹果手持设备用户的不断增加,ios应用也增长迅速,同时随着iphone被越狱越来越多的app 的渠道也不断增多,为各个渠道打包成了一件费时费力的工作,本文提供一种比较智能的打包方式来减少其带来的各 ...
- [原] Android自动打包之命令行打包
Android自动打包流程详细图: 总结为以下几个步骤: 1. 生成R文件 2. Java代码编译成class文件 3. class文件生成dex文件 4. 打包资源 5. 生成apk 6. 创建密匙 ...
随机推荐
- AVL树
AVL树 在二叉查找树(BST)中,频繁的插入操作可能会让树的性能发生退化,因此,需要加入一些平衡操作,使树的高度达到理想的O(logn),这就是AVL树出现的背景.注意,AVL树的起名来源于两个发明 ...
- CenterOS 7 常用命令
1.防火墙开放端口 1.1 开启端口 # firewall-cmd --zone=public --add-port=80/tcp --permanent 1 ...
- dell md3200i mdss (企业管理) 安装的那点事儿(2)
yum install iscsi-initiator-utils.x86_64yum install iscsi-initiator-utils-devel.x86_64yum install de ...
- excel多组数据散点图生成
在研究数据分布时,散点图是一类比较常用的方法,通过三点图可以很好的显示数据的分布位置.一组数据生成散点图,利用excel是很容易生成的:但是,多组数据生成散点图,不同组数据用不同颜色表示,那该怎么生成 ...
- How do I get the path of the current executed file in Python?
First, you need to import from inspect and os from inspect import getsourcefile from os.path import ...
- testng 失败自动截图
testng执行case failed ,testng Listener会捕获执行失败,如果要实现失败自动截图,需要重写Listener的onTestFailure方法 那么首先新建一个Listene ...
- foxmail邮箱,签名中如何添加当前日期
菜单--工具--模板管理 当前HTML模板中光标定位在签名之前,然后进行操作:插入宏--当前日期,适当调整位置即可 最下方为新邮件选择HTML模板 新建一封邮件试试吧
- I/O 函数总结
经过一段时间的学习,发现字符处理时或者文件处理时,经常需要进行输入(读入)和输出,而可供选择的函数很多,现在反而容易搞混淆,下面就对常用的7个 输入输出函数 进行总结和比较,以便于区分和熟练掌握. 标 ...
- JSP复习整理(一)表单
好久没更了,一周完成了SRDP,一周完成了课程设计,这一周就要好好回顾回顾Java Web的学习轨迹了. 用的eclipse Mars 一.表单 start.jsp <%@ page langu ...
- Eclipse 增加php插件
Eclipse 下载解压后运行, Help ------> Install New Software,在 Work whit 输入http://download.eclipse.org/tool ...