使用 Fastlane 简化 iOS 打包

Posted by QXSoftware on September 29, 2017

最近 Xcode9 发布,之前的自动化打包也随之失效了,在咒骂了 Xcode 工具链如何垃圾反人类很多次之后,还是硬着头皮摸索出了解决方案。问题还是要解决的。

最终选择现成的 iOS 打包工具,这个工具最好简单易用,方便部署,于是在网上找了一圈之后,我选择了 Fastlane。

Fastlane

Fastlane 是一个开源免费的自动化打包工具集合,能帮你处理 iOS、Android 的打包、签名等等繁杂的任务。并且方便集成到 Jenkins 这种持续集成平台。

Fastlane 包含很多小工具,比如Sigh 可以帮你管理iOSmobileprovision文件,sert可以帮你管理iOS的签名证书,gym可以帮你进行iOS的自动化打包。这些小工具可以组合使用,以满足不同需求。

Gym

为什么使用 Gym?

使用 Gym 之前:

xcodebuild clean archive -archivePath build/MyApp \
                         -scheme MyApp
xcodebuild -exportArchive \
           -exportFormat ipa \
           -archivePath "build/MyApp.xcarchive" \
           -exportPath "build/MyApp.ipa" \
           -exportProvisioningProfile "ProvisioningProfileName"

使用 Gym:

fastlane gym

Gym 可以非常方便地处理 iOS 的打包细节,它可以生成 xcarchive、生成 ipa 文件、以及生成符号表。

安装 Fastlane/Gym

首先,Fastlane 使用 ruby 开发,所以需要先设置好 ruby 源。Mac 电脑上面的 ruby 默认的源是:https://rubygems.org/,由于政策原因,这个源基本上无法使用,所以需要添加替代的源。好在国内有现成的:https://gems.ruby-china.org/。

# 删除默认的 ruby 源
gem sources --remove https://rubygems.org/
# 添加国内的替代品
gem sources --add https://gems.ruby-china.org/

然后就可以安装 Fastlane 了:

sudo gem install fastlane

安装完毕之后,就可以使用 Gym 了:

cd path/to/xcproject
fastlane gym

如果没有任何参数,Gym 会在当前目录寻找 Xcode 工程,如果找到,它就会开始自动打包。

Gymfile

可以给 Gym 提供一些参数,这些参数放在一个名叫 Gymfile 的文本文件里面。 可以通过一个命令创建初始 Gymfile:

fastlane gym init

下面是一个实际使用的Gymfile:

scheme "Unity-iPhone"
configuration "Release"
output_name "ff"
clean true
include_symbols false
include_bitcode false
skip_build_archive false

# 常用可选值:app-store ad-hoc development
export_method: "development"

# 这个 provisioningProfiles 是 Xcode9 中引入的新概念,每个 bundleId 都必须对应于一个 Provisioning Identity
export_options(
	provisioningProfiles: {
		"com.aa.bb.ccc" => "iPhone Developer: xxxxx xx (ABCDEFGHIJ12)",
		"com.aa.bb.ccc2" => "iPhone Developer: yyyyy yy (KJDHKJFSDHA34)"
	}
)

iOS 打包的一些基础设定

首先,iOS 的打包,常用的分为三种类型:

  • development 这个表示打一个测试包
  • ad-hoc 这个表示打一个测试包,可以用于 TestFlight、可以测试沙盒账号
  • app-store 这个是正式包

这三种类型,必须在 Gymfile 中的 export_method 中明确指定,并且打包用的 mobileProvision 文件也必须和这个选项一一对应,否则打包一定失败。

其次,如果是 Xcode9,那么必须在 Gymfile 中设定好 provisioningProfiles。这个里面的的值表示某 bundleId 用哪个 mobileProvision 文件打包,这个 mobileProvision 也必须和 export_method 严格对应,否则打包一定失败。


转载请注明出处:

This work is licensed under a MIT License.