iOS自动化打包

555 阅读6分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

前言

image.png

Fastlane是iOS和Android开发者的一个工具,可以自动完成一些乏味的任务,比如生成截图、处理配置文件和发布应用。

github地址

官网地址

文档地址

1. fastlane 安装

Fastlane 是用 Ruby 语言编写的一个命令行工具,可以自动化几乎所有 iOS 开发所需要的操作,例如自动打包和签名 APP,自动上传到 App Store 等等。

虽然官方文档推荐使用 Bundle 来安装,但是为了简便,笔者这里使用 Mac 自身的环境来安装的

1.1 安装 Xcode 命令工具

xcode-select --install

会弹出个弹窗提示安装 xcode-selct 命令工具,点击安装。。。

如果已经安装,会提示

xcode-select: error: command line tools are already installed, use "Software Update" to install updates

1.2 安装 fastlane

sudo gem install fastlane -NV 或是 brew cask install fastlane 我这里使用gem安装的

如果出现以下错误

ERROR:  While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/rougify

输入以下命令

sudo gem install -n /usr/local/bin fastlane

安装成功后可以查看版本 fastlane --version

image.png

2. Action 与 Lane

fastlane 为我们提供了一百多个 Action(Action: 可以理解成是 fastlane 自动化流程中的最小执行单元。),它们是 iOS 项目开发中所有自动化操作的基础。常用的 Action 有:

  • scan 用于自动测试 App

  • cert 用于自动生成和管理 iOS App 签名的证书

  • sign 用于自动生成、更新、下载和修复 Provisioning Profile

  • match 为整个团队自动管理和同步证书和 Provisioning Profile

  • gym 用于自动构建和打包 App

  • snapsheot 用于自动在不同设备上截屏

  • pliot 用于自动吧 App 部署到 TestFlight 并管理测试用户

  • deliver 用于自动把 App 上传到 App Store

  • pem 用于自动生成和更新推送消息的 Profile

这里的 Action 根据项目需要,在开发自动化操作通过合适的参数来调用 fastlane 所提供的 Action。在 fastlane 中,我们把这个自动化操作或任务叫做 Lane。实际上,iOS 开发中的所有自动化操作,主要通过 Lane 来封装和配置的。

3. 初始化 fastlane

cd 到你的项目目录,执行 fastlane init,即会创建一个 fastlane 的文件夹,文件夹包含 Fastfile, 还有 Appfile,以及执行过程所生成的一些中间文件(如截图、日志与报告等)(笔者这里选择的是以下选择 4 选项,因此不包含 App Store 配置的元数据、截图等等。)。

image.png

如果这个过程出现 bundle update 卡住的场景,可以参考 Fastlane bundle update卡住解决方案,笔者这里卡住后,重新初始化一次就可以了。

初始化过程中会让选择你想要的目的,我这里选择了4 (手动配置选项), 目的仅仅是打包出ipa,后面可自行根据需求完善修改,一般我们选择的都是3,自动打包到App Store。

如果选择的是3,这个过程中会让输入 AppID 的账号和密码,会检查你的 BundleID 是否是开发者关联以及是否允许创建 App 到 App Store Connect,这些我们可以输入账号去添加。

4. fastlane 配置

iOS 自动打包过程中,主要分为两步:

  1. 自动化配置证书及描述文件,开发对应开发证书、发布对应发布证书配置。

  2. lane 自动化打包 ipa 并且自动发布到 App Store、蒲公英、Jenkins 服务器等等。

4.1 统一管理 Certificates 和 Prefiles

首先需要创建 Github 私有 Repo,存放 .p12 及描述文件

部分操作步骤及lane命令来自 拉钩视频 - 林永坚老师的视频,有兴趣的可以自行查看

GitHub 私有 Repo 是免费的,有详细的修改历史,我们可以在 Github 创建 私有 Repo 来存储私钥和证书。

在 GitHub New repository 创建一个管理你项目签名的私有仓库,在 Settings -> Developer settings -> Personal access tokens 添加 Github Access Token

image.png

image.png

因为这个 Token 关闭当前页面后就无法获取,因此,最好把这个 Token 保存下来。

  1. 有了这个 Token 后,我们需要生成一个 BASE64 字符串提供给 fastlane 使用,命令如下
$> echo -n your_github_username:your_personal_access_token | base64

your_github_username - GitHub 用户名

your_personal_access_token - 刚刚生成的 token

  1. 接着在 Shell 里把 BASE64 赋值给环境变量
$> export MATCH_GIT_BASIC_AUTHORIZATION=<YOUR BASE64 KEY>
  1. 为了提高安全性,还可以配置环境变量 MATCH_PASSWORD 来加密私钥、证书 和 Provisioning Profile 文件。但是要注意:一定要记住这个秘密,因为使用这些文件的机器都需要使用该密码。
$> export MATCH_PASSWORD=<YOUR MATCH PASSWORD>

笔者这里直接上传 .p12 及 描述文件到私有仓库,因此下面可以直接执行下载的 lane,去下载 p12 和描述文件。

执行 fastlane download_profiles 命令

lane :download_profiles do
    keychain_name = "TemporaryKeychain"
    keychain_password = "TemporaryKeychainPassword"

    create_keychain(
      name: keychain_name,
      password: keychain_password,
      default_keychain: false,
      timeout: 3600,
      unlock: true,
    )

    match(
      type: "appstore",
      keychain_name: keychain_name,
      keychain_password: keychain_password,
      storage_mode: "git",
      git_url: "你的证书私有仓库地址",
      app_identifier: "你的BundleID",
      team_id: "证书对应的团队ID"
    )
  end

这里有个要注意的点,type: "enterprise" 需要输入你对应证书的用户名账号,因为笔者的企业证书是分发出来的,并没有持有人账号。因此无法继续。

另外试了一下线上App Store证书,type: "appstore" 类型,可以看到,如果你拥有是该账户持有人或者具备管理权限,可以成功下载证书到 Keychain

image.png

4.2 lane 简便的自动化打包命令

如果不需要自动选择证书,那么就忽略 4.1 证书配置的操作,和之相比,多了一步手动选择发布证书及 BundleID 的操作

Xcode 项目一般默认的是 Debug 和 Release 两个环境,为此,我们可以设定两个 lane 来对应打包测试包、发布包

非完全自动化打包,需要主动去选择发布证书及对应的 BundleID

image.png

执行 fastlane ipa-debug 命令,可以看到,我们很容易就打包出个 ipa 安装包(笔者测试用的企业证书,因此选择的是 enterprise 模式。因为线上应用还没上架,后面会补充App Store 自动化流程),但是,有个前提,需要手动去选择你自己的发布证书,这样我们就不算完全是自动化打包

image.png

这里可以自己自动上传 ipa 包至蒲公英 -- 使用 Fastlane 上传 App 到蒲公英

4.3 自动化打包与签名

在我们执行成功 fastlane download_profiles 命令后,可以看到,我们的 keyChain 多了证书和描述文件。

需要执行打包命令

lane :ipa_debug do  #函数名称,执行打包的时候使用
    unlock_keychain(
      path: "TemporaryKeychain-db",
      password: "TemporaryKeychainPassword")

    update_code_signing_settings(
      use_automatic_signing: false,
      path: "GBYPhotoManage.xcodeproj",
      code_sign_identity: "iPhone Distribution",
      bundle_identifier: "BundleID",
      profile_name: "match AppStore BundleID")

    gym(
       clean:true,
       scheme:"GBYPhotoManage", #项目名称
       export_method:"app-store",#打包的类型
       configuration:"Debug",#模式
       workspace: "GBYPhotoManage.xcworkspace",
       xcargs: "-allowProvisioningUpdates",
       output_name:"ios-uat",#输出的包名
       output_directory:"~/Desktop/ipa_file"#输出的位置
    )

    update_code_signing_settings(
      use_automatic_signing: true,
      path: "GBYPhotoManage.xcodeproj")

  end

第一步 解锁 Keychain

第二步 更新签名信息 里面 BundleID 那一块,需要输入和你证书对应的 BundleID

第三步 打包 ipa 操作

第四步 恢复自动签名

image.png

可以看到已经成功构建出能上传 App Store 的 ipa 包,后续的自动发布到 App Store 待补充。

总结

笔者本意是配置企业应用证书自动打包的,但是没有持有人或者管理权限账号,因此只能以 App Store 线上应用来举例,想来都是一样的操作。时间有限,有不足的见谅,后续会继续补充。