使用fastlane自动化构建iOS应用

前篇文章介绍Android多环境编译打包

本篇介绍如何使用fastlane构建多版本应用。

安装

工具的起源本身是专门针对 iOS 项目,因此目前依赖于 macOS 10.9 以上系统,Ruby 是一个众所周知的轮子发明者,很多知名的工具都是它开发的,fastlane 也不例外。以下是依赖环境:

  • macOS 10.9+
  • Ruby 2.0+ (推荐 rvm 或 rbenv 安装)
  • Xcode + command line tools

安装最新的Xcode命令行工具

xcode-select --install

安装fastlane

# Using RubyGems
sudo gem install fastlane -NV

# Alternatively using Homebrew
brew cask install fastlane

使用

切换到你的iOS工程目录,在目录下执行:

fastlane init

初始化过程会有选项提示,根据自己的情况选择即可,我一般选择“Manual setup”。

完成后会看到目录下多了一个Gemfile,还有一个fastlane文件夹,里面包含两个文件:AppFile和Fastfile。

  • Fastfile: 核心文件,主要用于 cli 调用和处理具体的流程
  • Appfile: 从 Apple Developer Portal 获取和项目相关的信息

先将注意力集中在Fastfile中。新创建的文件内容如下:

default_platform(:ios)

platform :ios do
  desc "Description of what the lane does"
  lane :custom_lane do
    # add actions here: https://docs.fastlane.tools/actions
  end
end

我们需要编写的内容都在platform :ios do到末行end之间。

  • lane:定义一个名为custom_lane的任务方法。任务可以定义多个并互相调用,支持参数。
  • desc:任务描述

我们的目标是构建应用,先来创建一个最简单的任务:

platform :ios do
  desc "构建beta版本"
  lane :beta do
    # add actions here: https://docs.fastlane.tools/actions
  build_app(scheme: "myapp",
            workspace: "myapp.xcworkspace",
            export_method: "development",
            include_bitcode: true)
  end
end

执行命令:fastlane beta
编译结束后,你就会在根目录看到已经编译好的ipa文件:MyApp.ipa

build_app是一个action,是build_ios_app的别名,常用的参数配置如下:

  • workspace:xcworkspace工程文件路径
  • project:xcodeproj工程文件路径,如果是workspace工程不需要填这个
  • scheme:指定scheme
  • clean:编译前是否清理
  • output_directory:ipa文件保存路径
  • output_name:自定义ipa文件名
  • export_method:支持app-store, ad-hoc, package, enterprise, development, developer-id
  • include_bitcode:是否开启include_bitcode选项

更详细的参数列表请看文档:https://docs.fastlane.tools/actions/build_app/#parameters

除了build_app之外,falstlane还支持非常多的action,更多action查看文档https://docs.fastlane.tools/actions

下面列举几种:

  • increment_version_number:自动更新版本号
  • update_app_identifier:更新bundleID
  • update_info_plist:更新info.plist,不过只能更新bundle id和Display Name。不要用此方法更新bundle id,而是建议用update_app_identifier更新。
  • update_plist:更新plist文件中,可以修改plist中的键值对。

多版本构建

我希望通过fastlane在本地快速构建开发、生产环境不同版本的App,需求点依然是每个版本的bundle id、接口地址、应用名称、sdk secret key不一样,最终只通过命令完成一键构建。

我们先定一个任务(lane),用来修改配置

  desc "修改项目配置"
  desc "参数 prod 判断是否为生产版本"
  lane :set_app_mode do |options|
    prod = options[:prod] || false
    # bundle id
    app_id_suffix = prod ? "prod" : "dev"
    # 应用名称
    app_name_suffix = prod ? "" : "测试版"

    # app center应用统计sdk的secret key,分环境
    app_center_dev_secret = "aaaaaa"
    app_center_prod_secret = "bbbbbb"
    app_center_secret = prod ? app_center_prod_secret : app_center_dev_secret

    # 接口地址
    backend_dev = "https://dev.example.com"
    backend_prod = "https://prod.example.com"
    backend = prod ? backend_prod : backend_dev

    # 更新bundle id
    update_app_identifier(
      xcodeproj: "myapp.xcodeproj",
      plist_path: "myapp/Info.plist",
      app_identifier: "com.example.myapp.#{app_id_suffix}"
    )
    # 更新应用名称字段display_name
    update_info_plist(
      xcodeproj: "myapp.xcodeproj",
      plist_path: "myapp/Info.plist",
      display_name: "MyApp#{app_name_suffix}"
    )
    update_plist(
      plist_path: "myapp/Config.plist",
      block: proc do |plist|
        plist[:appSecret] = app_center_secret
        plist[:backend] = backend
      end
    )
  end

有了这个方法,我们可以轻松得通过fastlane命令来切换环境配置

# 切换到生产环境
fastlane set_app_mode prod:true

接着我们编写一个编译任务

  desc "编译任务"
  lane :build do |options|
    prod = options[:prod] || false
    suffix = prod ? "prod" : "dev"
    set_app_mode(prod: prod)
    build_app(
      scheme: "myapp",
      workspace: "myapp.xcworkspace",
      include_bitcode: true,
      export_method: prod ? "ad-hoc" : "development",
      output_directory: "./build",
      output_name: "myapp_#{suffix}.ipa"
    )
    # 重置回开发版配置。日常开发使用的就是开发版配置,这里只是置到日常状态
    set_app_mode(prod: false)
  end

  desc "编译beta版本"
  lane :beta do
    build(prod: false)
  end

  desc "编译release版本"
  lane :release do
    build(prod: true)
  end

这里就实现了轻松编译两个版本的命令

#编译生产环境ipa,保存路径 ./build/myapp_prod.ipa
fastlane release
#编译开发环境ipa,保存路径 ./build/myapp_dev.ipa
fastlane beta

实现分发

fastlane还有个很好用的插件机制,官方还提供了个可用的插件列表https://docs.fastlane.tools/plugins/available-plugins/

我app分发用的fir.im,当然也可以使用蒲公英。他们在fastlane中都有对应的插件:fir
pgyer

首先引入插件,执行

fastlane add_plugin fir

如果你之前没有装过插件,它会在fastlane文件夹中创建一个Pluginfile文件,内容如下:

# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!

gem 'fastlane-plugin-firim'

好了,这样插件就装好了,接着是使用,直接定义两个任务

  desc "编译beta版本并上传至fir.im"
  lane :beta_fir do
    beta
    firim(firim_api_token: ENV["FIR_TOKEN"])
  end

  desc "编译release版本并上传至fir.im"
  lane :release_fir do
    release
    firim(firim_api_token: ENV["FIR_TOKEN"])
  end

这样就非常方便的打包和发布不同版本的安装包了。

# 编译beta版本并上传至fir.im
fastlane beta_fir
# 编译release版本并上传至fir.im
fastlane release_fir

推荐写的非常详细的关于fastlane的博客:
Fastlane - iOS 和 Android 的自动化构建工具
深入浅出 Fastlane 一看你就懂

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容