通过xcodebuild自动构建并发布Ad Hoc测试包
通过xcodebuild自动构建并发布Ad Hoc测试包
目标是通过一个shell脚本,完成构建及发布。
Ad Hoc发布证书及Provisioning Profile
在『钥匙串访问』中执行:
证书助理->从证书颁发机构请求证书:

填写证书信息:
此处,为了方便识别证书,其常用名称,被设置为了”Ad Hoc”。

点击『继续』按钮:
会弹出certSigningRequest文件的保存路径。
生成certSigningRequest文件后,『钥匙串访问』中会多出名为”Ad Hoc”的专用密钥和名为”Ad Hoc”的公用密钥,然后登录苹果开发者账号,进入『Certificates, Identifiers & Profiles』,在『Certificates』中添加证书,在第一步中会让用户选择需要创建哪种类型的证书,这里我们需要选择『Ad Hoc』。
- 如果是个人开发者账号,界面会是这样:

- 如果是企业开发者账号,界面会是这样:

注意:一个是
App Store and Ad Hoc,一个是In-House and Ad Hoc。也就是说,发布到App Store用的证书也可用于Ad Hoc发布。我这里的不可用(显示为灰色),是因为之前已经创建了相关的证书。
后面会上传之前生成的certSigningRequest文件,然后生成证书,下载并双击证书,证书就会与『钥匙串访问』中之前多出的Ad Hoc专用密钥进行配对。
接着,需要生成Ad Hoc所用的Provisioning Profile:
- 如果是个人开发者账号,界面会是这样:

- 如果是企业开发者账号,界面会是这样:

在随后的步骤中,会让选择App ID,对于Ad Hoc发布,可以使用明确的App ID,也可以使用包含通配符(*)的App ID。如果没有相应的App ID,可以在Identifiers->App IDs中进行添加:

选择App ID后,会让选择certificates,勾选在之前生成的证书,然后就可以生成Provisioning Profile文件,下载并双击,系统会自动将这个文件复制到~/Library/MobileDevice/Provisioning Profiles目录,并为其重新命名,新名称会类似这样:86ceff27-1dff-40eb-8fd7-6072af8cb03b.mobileprovision,这样的名称会在xcodebuild命令中使用到,但不会使用到.mobileprovision扩展名。
使用xcodebuild构建项目
xcodebuild简介
用途
xcodebuild最主要的用途就是『构建Xcode项目及工作空间』,也有其它用途:
- 列举信息(项目配置、SDK、
xcodebuild版本) - 导出存档(从
xcarchive存档导出ipa及manifest.plist) - 导入/导出本地化文件(
localization)
xcodebuild命令的详情使用说明,请自行在命令行中执行man xcodebuild及xcodebuild -help进行查看。这里给出的用法示例,基本能够满足日常的使用。
项目构建
项目构建主要会使用xcodebuild的三种构建形式:
1 | |
如果没有使用workspace,也就是没有使用xcworkspace文件,就使用前两种形式。
如果使用了workspace,就使用第三种形式(比如,项目使用了CocoaPods)。
生成xcarchive存档
为了构建xcarchive,需要将action指定为archive,此时必须指定一个scheme,scheme名称可在Xcode菜单的Product->Scheme->Manage Schemes中查找到。
比如,你的项目名称为Ad-Hoc-Demo,Scheme为Ad-Hoc-Demo-Scheme且没有使用workspace,就可以使用如下命令,对项目进行archive:
1 | |
但有可能出错。因为项目的配置可能是不正确的(比如证书、Provisioning Profile、Bundle Identifier配置错误)。
有三种途径可以查看项目的配置,:
- 直接在
Xcode中进行查看(最直观) - 在
XXX.xcodeproj/project.pbxproj文件中进行查看 - 通过
xcodebuild的-showBuildSettings选项进行查看(建议使用这种方式)。
建议通过
-showBuildSettings选项进行查看,主要原因是之前遇到的一个坑,我在Xcode中已经将证书、Provisioning Profile正确地设置了(对于Xcode来说是正确的,对于xcodebuild来说就不一定是正确的),但在使用xcodebuild时还是报出错误:Provisioning profile "XXXDis" doesn't include signing certificate "iPhone Distribution: XXX.。之所以报出这样的错误,只是因为Xcode中的配置并没有与项目的XXX.xcodeproj/project.pbxproj文件中的配置完全保持一致,该文件中的PROVISIONING_PROFILE_SPECIFIER与PROVISIONING_PROFILE所对应的Provisioning Profile文件并不是同一个。
为了让构建进行得更加顺利,需要指定一些[buildsetting=value ...],比如,指定前面提到的PROVISIONING_PROFILE_SPECIFIER与PROVISIONING_PROFILE。
PROVISIONING_PROFILE_SPECIFIER的值可以这样找到:Xcode->Preferences...->Accounts,然后选择一个Apple ID,再点击右下角的View Details,进入详情界面,其中的Provisioning Profiles那一列就是PROVISIONING_PROFILE_SPECIFIER:

在这个界面中,右键点击某个Provisioning Profile,可以看到Show In Finder项,选择该项,可以直接进入~/Library/MobileDevice/Provisioning Profiles目录。
如果Provisioning Profile文件名为86ceff27-1dff-40eb-8fd7-6072af8cb03b.mobileprovision,就将PROVISIONING_PROFILE的值指定为”86ceff27-1dff-40eb-8fd7-6072af8cb03b”(不带后面的.mobileprovision):
1 | |
这样就可以构建出xcarchive存档,其默认的存放目录为~/Library/Developer/Xcode/Archives,我们可以修改存放目录,只需要指定-archivePath选项,并在其后面指定xcarchive存档存放路径(需要包含xcarchive存档的文件名)就可以了:
1 | |
自己指定
xcarchive存档的存放路径,可以方便后续处理
action为archive时,xcodebuild默认使用的Build Configuration是Release,不过我们可以根据实际情况进行设置(比如,使用生产环境还是测试环境,因为在默认情况下,Release配置中是没有设置DEBUG宏的,有些团队会根据这个宏,去连接不同的服务器),此时,需要使用到-configuration选项,可以指定Release或Debug:
1 | |
导出ipa
使用-exportArchive就可以从xcarchive存档导出ipa及manifest.plist。
不过需要指定其它3个选项,使用方式如下:
1 | |
配置-exportOptionsPlist选项所需的plist文件
对于-exportOptionsPlist,需要创建一个plist文件,通过xcodebuild -help可以查看到该文件中可用的键及其描述,常用的有:
compileBitcodemanifestmethodteamIDuploadBitcodeuploadSymbols
其中,manifest、method及teamID是最重要的。
manifest对应的值是一个字典,这个字典需要包含appURL、displayImageURL、fullSizeImageURL这三个键。通过它,就可以生成一个名为manifest.plist文件,通过网页下载应用程序时,会使用这个manifest.plist文件。
method用于指明应该导出什么样的存档。
teamID可以在『钥匙串访问』中查看到:

导出ipa及manifest.plist
创建并配置好-exportOptionsPlist选项所需的plist文件后,就可以通过xcodebuild -exportArchive导出ipa及manifest.plist
生成下载页
在下载页面中,最重要的就是下载链接的href属性,该属性值的形式如下:
itms-services://?action=download-manifest&url=xxx/manifest.plist
其中的xxx是manifest.plist所在URL的某一部分,需要根据具体情况进行设置。
对于
iOS 7.1及更高版本,manifest.plist所在URL必须使用https协议
将文件上传到服务器
只需要将下载页面、manifest.plist及ipa文件上传到服务器的某个目录下,并确保可以通过网站访问到该目录下的文件。
将以上步骤整合为脚本
需要将脚本保存在
XXX.xcodeproj所在目录下(记得加执行权限)
脚本示例:
1 | |