Xcode8以后的自动打包

缘起

最近的工作需要频繁使用企业证书给项目打包,用于当前项目的企业内部测试。由于测试工作的临时性以及需要用外网发布的特性,所以并没有使用当前用于开发测试组的CI。这个工作在我这里就是简单的导出用企业证书打包的IPA包并交付同事。

网上针对自动打包脚本的文章多如牛毛,本文只是自己在修改老脚本的过程中形成的一些细枝末节。

xcodebuild, xctool, xcbuild

翻出以前的脚本,看到以前的build脚本用xctool替代了官方的xcodebuild。习惯性地点开xctool的github主页想看看有什么更新,却看到了README上的这段话:

Note: Support for building projects with xctool is deprecated and will not be updated to support future versions of Xcode. We suggest moving to xcodebuild (with xcpretty) for simple needs, or xcbuild for more involved requirements. xctool will continue to support testing (see above).

太久没逛的缘故,这才发现了xctool在Xcode8以后不再支持build功能。对于build功能的简单使用,Facebook团队推荐转回官方的xcodebuild(搭配xcpretty更给力),或者转而使用他们家的xcbuild,而xctool将专注于测试功能(这篇文章也解释了为何从xctool迁移回xcodebuild)。

对我而言xcbuildxcpretty又是新鲜的东西,继续点开链接。前者的主页上写道,在搭配Ninja的情况下,使用xcbuild来编译速度甚至比xcodebuild还快。而回想当时使用xctool的缘由,仅仅是为了日志更好看些,再加上本能地也不想为一个简单需求再增加依赖(Ninja),于是果断选择xcodebuild + 只是用于格式化输出的xcpretty

xcpretty非常简单,安装后作为管道使用:

1
$ xcodebuild [flags] | xcpretty

自动脚本打包

岔路走完,继续回到主题。快使用xcodebuild,哼哼哈兮。要把工程打包IPA,拢共分几步?两步!

  1. xcodebuild archive
  2. xcodebuild -exportArchive -archivePath xcarchivepath -exportPath destinationpath -exportOptionsPlist path

嗑嗑,额,具体来讲第一步呢,当然要根据实际情况加上-project, -configuration, -archivePath等参数,还可以搭配给力的xcpretty

1
xcodebuild archive -workspace /Path/To/Workspace/Demo.xcworkspace -scheme DemoScheme -configuration Release -archivePath /Path/To/Archive/Demo.xcarchive | xcpretty

第二条命令xcodebuild -exportArchive-archivePath -exportPath ``-exportOptionsPlist三个选项很容易理解,其中-exportOptionsPlist替换了以前的-exportSigningIdentity -exportSigningIdentity等选项。这部分改动在官方文档中还未更新,当然在man文档中早有体现,-exportOptionsPlist要求指定一个plist文件作为配置文件,下面列举几个常用的key值:

1
2
3
4
method : String
Describes how Xcode should export the archive. Available options: app-store, ad-hoc, package, enterprise, development, and developer-id. The list of options varies based on the type of archive. Defaults to development.
teamID : String
The Developer Portal team to use for this export. Defaults to the team used to build the archive.

对应到具体的需求,我的plist里就只指定了这两个键值对,其中method选择enterprise(其他发布方式对应选择即可),teamID选择对应值。这两个选项也对应了在Xcode中手动arhive并导出包时要点选的两个动作。

Xcode8中的设置

Xcode近年来致力于自动管理开发证书,每个大版本都会有修改(有方便的地方也有坑的地方)。到了Xcode8,在target的General设置面板中直接新增了“Signing”,看得出来,Automatically manage signing选项是苹果推荐的签名方式。如果恰巧不幸,你的证书里的App ID与Xcode中的bundle ID不符(比如我的企业证书中的App ID带有通配符),就应该关闭该选项,手动为某个configuration指定打包证书。不要忘记在-exportOptionsPlist指定的plist中配置对应的teamID,否则在xcodebuild -exportArchive时会报团队不匹配的错误。

总结

  • 如果对编译速度有较高要求,可以参考使用xcbuild;对于自动化测试工作,xctool有更好的支持;如果只是简单的自动打包需求,官方的xcodebuild可以满足,并且无需折腾也不用担心失效,如果需要更直观的输出,可以搭配xcpretty
  • Xcode8中根据实际情况打开或关闭Automatically manage signing
  • 自动打包是iOS开发中的一项基础工作,作为自动化工作的一小部分往往被应用于CI系统。持续集成的内容很多,还有自动化测试、代码静态检查、持续交付等内容。这篇文章概括了其中一些方面,并给出了实际工程方案。

文章写了这么多,其实只是说了很多人再熟悉不过的一条命令xcodebuild。在实际工作中,肯定会有更多的需求,比如我以前的脚本简单地用Python检查了项目中的一些配置项,如IP地址、插件的api key、BundleDisplayName(大厂也犯过错噢)等,检查通过后再打包。最后,如果文章有错误或纰漏,非常欢迎指出。