Osheep

时光不回头,当下最重要。

iOS打包发布工具fastlane初级攻略

以前一直做持续发布使用xcbuild和xctool这些工作进行打包,但是经常遇到证书相关的问题,各种Provising Profile文件匹配不上,然后又证书不匹配等等。于是开始寻求新的解决方案,找到了新的神器fastlane。

相关信息

fastlane是一整套的工具帮助开发者主要是iOS开发者,打包App上传App到App store或着TestFlight。
fastlane的官方repo地址:
https://github.com/fastlane/fastlane
fastlane的快速上手文档:
https://docs.fastlane.tools/
fastlane支持的action文档
https://docs.fastlane.tools/actions/

安装fastlane

1.确保xcode命令行工具已经安装
`xcode-select --install`
2.参考官方文档有三种安装方式任选一种进行安装

《iOS打包发布工具fastlane初级攻略》

Paste_Image.png

使用fastlane进行打包

1.初始化项目 fastlane init
使用fastlane必须要先对项目进行初始化fastlane init
a.使用命令行工具进入项目目录执行fastlane init命令

《iOS打包发布工具fastlane初级攻略》

Paste_Image.png

初始化的过程中会需要填写一些项目信息包括scheme name和你的Apple id等等。同时会在项目中生成一个fastlane的文件夹。

2.查看fastlane文件夹中的内容
上面已经说到初始化之后,在项目根目录会生成一个fastlane的文件夹,接着打开文件夹看一看

《iOS打包发布工具fastlane初级攻略》

Paste_Image.png

文件夹里一共有4个文件

  1. Appfile里面存放了App的基本信息包括app_identifier、apple_id、team_id等等。如果在第一步init的时候你输入了正确的appId账号和密码会在这里生成正确的team_id信息。
  2. Fastfile是最重要的一个文件,可以编写和定制我们打包脚本的一个文件,我们自定义的一些功能就写在这里。
  3. README.md里面是一些帮助说明信息
  4. report.xml就不用管了

Fastfile

下面贴一下Fastfile中的内容

《iOS打包发布工具fastlane初级攻略》

Paste_Image.png

前面几行记录了fastlane的版本信息
platform :ios do开始下面的就是fastlane可以执行的任务
第一个

before_all do
    cocoapods
end

这个点意思是在执行每一个lane之前都先执行这个功能,它里面其实就跑了一个fastlane的action这个action叫cocoapods
3.1查看fastlane的action以及action的用法
上面提到before_all中其实就是执行了一个action那么让我们来看看fastlane一共有哪些action,以及action怎么用
在命令行中使用fastlane actions可以列出所有的action,使用fastlane action [action的名字]可以查看该action的相关信息,最重要的是在帮助文档中的这里可以查看具体action的使用方法和示列https://docs.fastlane.tools/actions/.
列出所有action

《iOS打包发布工具fastlane初级攻略》

Paste_Image.png

查看某个action的说明

《iOS打包发布工具fastlane初级攻略》

Paste_Image.png

网页文档中关于cocoapods这个action的说明:

《iOS打包发布工具fastlane初级攻略》

屏幕快照 2016-12-05 上午1.11.49.png

3.编写自己的lane

知道了action和lane之后,我们回到Fastfile文件中,看看其实在生成的文件中已经帮我们写了好几个lane了

  desc "Runs all the tests"
  lane :test do
    scan
  end

  desc "Submit a new Beta Build to Apple TestFlight"
  desc "This will also make sure the profile is up to date"
  lane :beta do
    # match(type: "appstore") # more information: https://codesigning.guide
    gym # Build your app - more options available
    pilot

    # sh "your_script.sh"
    # You can also use other beta testing services here (run `fastlane actions`)
  end

上面有2个lane,一个叫test 一个叫beta,test中执行了scan这个action,这就是用来运行单元测试的一个action,具体信息可以使用fastlane action scan查看,然后beta这个lane执行了gym和pilot,gym是打包,pilot是把应用发到TestFlight,具体使用方法一定要去查看文档哦。
但是生成的这些lane可能不满足我们的需求,下面以一个企业版应用打包为例我们自己新建一个lane:

  desc "打包成企业版ipa"
  lane :inhouse do |options|
    #更新info plist文件 ENV["key"]表示从环境变量中读取值,也可以直接写死,如果要在打包时改变某些参数,可以把它们设置成环境变量
    update_info_plist(
        plist_path: "GoodFolks/info.plist",
        display_name: "新App名字",
      )
    #更新urlType 具体用法查询action文件update_info_plist的说明
    update_info_plist(
        xcodeproj: "GoodFolks.xcodeproj",
        plist_path: "GoodFolks/info.plist",
        block: lambda { |plist|
          #这里我在更新微信的urlType 这个action还可以更新app的bundleid 具体可以查阅文档
          urlScheme = plist["CFBundleURLTypes"].find{|scheme| scheme["CFBundleURLName"] == "weixin"}
          urlScheme[:CFBundleURLSchemes] = ENV["app_urlschems_weixin"]
        }
      )
    #设置版本号
    increment_version_number(
      version_number: ENV["app_versionName"]
      )
    #设置build号,这些都可以写死,也可以不要这些action,也可以从环境变量中获取值
    increment_build_number(
      build_number: ENV["app_versionCode"]
      )
    #这个action很重要cert就是下载和安装匹配的Provision Profile文件,不用你去管那些证书不匹配的事情啦,下载的文件会存在项目根目录的build文件夹下
    cert(output_path:"build")
    #这一步就是签名了
    sigh(
      app_identifier: ENV["app_applicationId"],
      team_id:"9M8CTWAV8P",
      output_path: "build"
      )
    #最后就是打包,企业版打包,打包完成后会在项目根目录的build文件夹下生成ipa文件
    gym(
      scheme: "GoodFolks",
      export_method: "enterprise",
      output_directory: "build",
      include_bitcode: false
      )

    # do some other stuff here
end

4.起飞
上面说了这么多,但是怎么运行呢?
很简单在你的项目根目录执行fastlane [lane的名字]比如我们上面自己写的一个fastlane inhouse,fastlane就会执行指定的任务了,然后你就可以去喝咖啡啦。

Tips
fastlane在打包的时候可能需要交互比如输入你的Apple id的密码,但是很明显在做持续发布的时候都是自动化的,不是交互式的shell,没办法人工去输入密码,这个只需要把你的Appleid的密码设置成一个环境变量即可,环境变量的key为FASTLANE_PASSWORD。

点赞