通过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
可以查看到该文件中可用的键及其描述,常用的有:
compileBitcode
manifest
method
teamID
uploadBitcode
uploadSymbols
其中,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 |
|