iOS使用fastlane一键打包审核

JosephColin 发布于1年前

前言:一直有听过脚本一键打包审核,但是自己一直没在意。在微信公众号看到ios一键打包的文章,突然想想自己每次从打包到提交审核(大约都是30分钟)。自己浪费了多少时间啊!

脚本打包方式有很多,我看中了fastlane(ios,Android都支持),github地址:

https://github.com/fastlane/fastlane 文档地址: https://docs.fastlane.tools/

原因是看了星星:21201多星星。3247个fork,所以大量的开发者信任并一起维护他。

搬运: http://www.code4app.com/home.php?mod=space&uid=363485&do=blog&quickforward=1&id=1856

并自己添加遇到的问题,并解决。(原文章作者用了3天的时间搞清楚,我用了1天理解了作者的做法,作者的教程有挺多问题 没有指出说明,所以我还浪费了1天去解决所谓不清楚的问题)。

相信您能通过此篇快速一键打包审核。

搬运,完善,整理。

安装:

Installing fastlane

Make sure you have the latest version of the Xcode command line tools installed:

xcode-select --install

Install fastlane using

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

or alternatively using brew cask install fastlane

Navigate to your project directory and run

fastlane init

end

安装后具体使用:

我们在日常开发中经常会遇到如下问题

  1. 团队成员一不小心Revoke了证书导致所有的开发小伙伴需要重新下载证书

  2. 每次提交App Store审核需要重复【修改证书】- 【打包】-【iTunes Connect】- 【发布】等一系列动作

真的是不厌其烦,让人抓狂。这个时候,幸好Fastlane来了,看他怎么来拯救我们吧。在开始我们的教程之前,笔者先做个澄清,fastlane不是什么:

  • fastlane 不是一个工具,而是一系列工具的集合。比如match工具能管理证书,deliver能提交APPStore审核。所以我们在使用fastlane的时候更多的是和它的工具集打交道。

  • fastlane内部的工具不是新写的,而是调用mac本身的命令,只不过是实现了自动化而已。比如gym工具只是xcodebuild工具的一个封装,如果你会xcodebuild,那gym对你来说小菜一碟。

  • fastlane本身没有一套特殊语法,使用的Ruby语言,相信使用过cocoapods的同学应该很容易上手。

安装完fastlane并调用fastlane init后,目录结构大概如下所示:

iOS使用fastlane一键打包审核

具体的安装和初始化,本文稍后会详细讲述,先带大家分析一下安装后的fastlane的目录结构。红色区域就是多出来的文件。本项目是笔者的一个APP Store上线项目,大家可以 点击这里 获取。

  • Gemfile 告诉我们fastlane 依赖的gem以及版本等其他信息。这个跟本文主题不大,笔者就不详细描述了

  • fastlane文件夹里的Appfile看文件也知道,里面是关于本App的信息的;Fastfile则是fastlane的最主要的文件,在这个文件中可以编写我们需要使用的各个工具的顺序、方式等。

这里我们先看一个已经写好的fastlane的内容:

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
    match(
        git_url: "https://github.com/zjh171/fastlaneProvingProfile",
        type: "appstore" ,
        readonly: true
        )
    gym(
        scheme:"Wallpaper",
        export_method:"app-store",
        output_directory:"./build",
        archive_path:"./Archive"
        )
  end
end

这里我们只需要关注 match 和gym这两个工具以及括号后的内容。match工具是我们本文开头描述的用于同步开发小伙伴证书的工具,而gym则是xcodebuild工具的封装,它指定了打包的目录以及打包的类型。保存该文件并执行fastlane custom_lane后我们可看到

iOS使用fastlane一键打包审核

这就表明我们打的App Store包已经生成了。目录就是我们指定的output_directory对应的目录。当然大家也不难猜想到,如果要让fastlane实现自动提交到App Store审核,还需要在gym后面加上我们需要的工具。这里先卖个关子,稍后告诉大家。下面笔者就详细的介绍一下fastlane的使用。

安装

执行命令sudo gem install fastlane --verbose即可,安装完成后检查一下是否安装成功输入fastlane --version看是否有版本号显示。

fix:出现错误

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

OS 10后没权限,so改执行

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

初始化

输入命令fastlane init会看到如下选项

What would you like to use fastlane for?
1\. Automate screenshots
2\. Automate beta distribution to TestFlight
3\. Automate App Store distribution
4\. Manual setup - manually setup your project to automate your tasks

这四个选项的意思是

  1. 自动截屏。这个功能能帮我们自动截取APP中的截图,并添加手机边框(如果需要的话),我们这里不选择这个选项,因为我们的项目已经有图片了,不需要这里截屏。

  2. 自动发布beta版本用于TestFlight,如果大家有对TestFlight不了解的,可以参考王巍写的 这篇文章

  3. 自动的App Store发布包。我们的目标是要提交审核到APP Store,按道理应该选这个,但这里我们先不选,因为选择了以后会需要输入用户名密码,以及下载meta信息,需要花费一定时间,这些数据我们可以后期进行配置。

  4. 手动设置。

选择第四个后一路回车即可,我们会看到生成了我们熟悉的fastlane目录,该目录下包含了Appfile和Fastfile。我们打开这两个文件。

Appfile

# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app
# apple_id("[[APPLE_ID]]") # Your Apple email address

# For more information about the Appfile, see:
#     https://docs.fastlane.tools/advanced/#appfile

发现里面没有任何信息(“#”在ruby里是注释,所以里面没有任何信息)注释的部分中,app_identifier用于指定APP的bundle id,apple_id指的是你的AppleID。

Fastfile

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
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

这个文件的信息稍微多一点,而且我们也更熟悉了,语法跟cocoapods很像,而且我们在文章开头已经稍微做了一些介绍,发现在lane :custom_lane do后面是空的。其实意思也就是说,这里任何操作都没有执行。

fix:出现错误 在如下卡住

[14:50:58]: $ bundle update

RubyGems 一直以来在国内都非常难访问到,在本地你或许可以翻墙,当你要发布上线的时候,你就很难搞了!

这是一个完整 RubyGems 镜像,你可以用此代替官方版本,我们是完全基于 CDN 技术来实现,能确保几乎无延迟的同步。

前往: https://gems.ruby-china.com 更换源

$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
# 确保只有 gems.ruby-china.com

运行

虽然这是个什么都没有做的fastlane项目,但其实我们可以运行了,执行

fastlane custom_lane命令,我们可以看到如下输出

fastlane detected a Gemfile in the current directory however it seems like you don't use `bundle exec` to launch fastlane faster, please use
 $ bundle exec fastlane custom_lane
//此处省略多行
fastlane.tools finished successfully

大致意思就是,我们可以使用命令bundle exec fastlane custom_lane代替fastlane custom_lane,这样会执行的更快。最后的fastlane.tools finished successfully表示执行成功了。

打包

提交审核的前一步是打包,也是最主要的一步fastlane中有专门用于编译、打包的命令gym,我们加到lane :custom_lane do后看看会不会有问题。

iOS使用fastlane一键打包审核

然后执行fastlane custom_lane我们会收到如下提示

Select Scheme:
1\. Wallpaper
2\. AFNetworking
3\. Mangogo
4\. Masonry
5\. MJRefresh
6\. Pods-Wallpaper
?

毫无疑问我们选择1,其他的都是我们调用的三方库。但聪明的读者肯定在想,这个Scheme是否能在fastlane文件中就设置好,省的这里在自己选择。是的,这就是文章开头提到的

gym(
    scheme:"Wallpaper",
    export_method:"app-store",
    output_directory:"./build",
    archive_path:"./Archive"
    )

中scheme:"Wallpaper",的含义。其他的参数也就不一一赘述了。读到这里,相信大部分读者已经对fastlane的原理一清二楚了。其实所谓的会用fastlane也就是会用里面的各种工具而已。我相信大家选完Scheme后还没到打包这一步,应该已经出现了错误提示,错误应该就是大家都非常熟悉的证书问题;当然,如果读者够侥幸,证书已经设置好了,并将output_directory、archive_path设置好了,那就能生成对应的对应的IPA包。但相信成功的读者应该寥寥无几,这个时候就要使出我们的大杀器match

fix:出现错误

fastlane gym produces error: method `to_plist' not defined in Array #11503

可以参考:

https://github.com/fastlane/fastlane/issues/11503

方法终端命令:
1、rvm @global do uninstall fastlane
2、`gem install fastlane`

我测试过第二步执行完就可以了.
3、`rvm @global do gem install fastlane`
4、rvm @global do fastlane action gym
5、`rvm @global do gem uninstall fastlane `
`rvm all do gem uninstall fastlane`
**`gem uninstall fastlane`**
6、*`gem install fastlane`*

证书管理

match:详情教程: https://docs.microsoft.com/zh-cn/xamarin/ios/deploy-test/provisioning/fastlane/match#using

fastlane中能管理证书和签名的工具其实还有sigh以及cer,那为何笔者要给大家推荐match呢,原因已经在文章开头指出了,对于多人开发时出现的证书错乱问题match可以很好的处理。它将开发人员的证书提交到一个git仓库进行集中处理,在有新的成员加入开发时候,只需要运行一两条命令。下面我就详细讲一下其实现过程吧:

  1. 创建一个仓库(空仓库或者现有仓库都可以,但建议大家使用一个空仓库专门处理证书),这里笔者的仓库地址是: https://github.com/zjh171/fastlaneProvingProfile

  2. 在终端运行fastlane match init可以看到需要我们输入giturl地址,我们将地址拷进来即可。

iOS使用fastlane一键打包审核

输入地址后我们会看到如下提示

You can now run `fastlane match development`, `fastlane match adhoc`, `fastlane match enterprise` and `fastlane match appstore

我们按照提示生成development和App Store证书,然后会在Xcode中发现生成的证书以及Provision Profile文件。我们在Xcode中设置好即可。

iOS使用fastlane一键打包审核

接下来,我们将match添加到fastlane文件中,如下

iOS使用fastlane一键打包审核

当然,这个文件我们已经在文章开头看过了,是不是再次感觉豁然开朗。回到命令行,我们再次执行fastlane custom_lane发现我们可爱的IPA包已经打包完毕。

fix:出现错误

[!] No matching provisioning profiles found and can not create a new one because you enabled readonly. Check the output above for more information.

解决:

选择工程里面的PROJECT------->build Settings --------->搜索bundleID,然后修改Product Bundle Identifier 的值为你工程的bundleID即可!

提交App Store审核

终于到了最令人激动的提交App Store时刻了。我们要使用的工具是deliver。聪明的你应该已经知道,第一步肯定是要调用fastlane deliver init,这里会让我们输入APPle ID,输入以后就看到我们的项目文件夹发生了变化:

iOS使用fastlane一键打包审核

接着,我们修改一下fastfile文件,添加deliver,因此我们最终版的fastlane文件是这样的:

lane :release do
        # 增加build版本号
      increment_build_number
      match(
        git_url: "https://github.com/zjh171/fastlaneProvingProfile",
        type: "appstore" ,#can be appstore,adhoc, development,enterprise
        app_identifier:"cn.kyson.wallpaper",
        username:"zjh171@qq.com",
        readonly: true
        )
      # 编译代码
    gym(
        scheme:"Wallpaper",
        export_method:"app-store",
        )
    # 发布到Apple Store
    deliver
  end

可以看到,大部分配置跟以前一样,只做了lane名的改变,还有添加了increment_build_number这一行。increment_build_number的作用是防止本地版本的build号比App Store(或上次)低而做的自动增长版本号的处理。当然加了这几句还需要在Xcode中做相应处理:

iOS使用fastlane一键打包审核

最后在命令行中输入fastlane release,等待大概十几分钟就可以看到成功的提示了。然后我们进入iTunes Connect,确认一下:

iOS使用fastlane一键打包审核

确实是已经在审核状态。如果大家想实现“一键审核”可以给deliver带上参数submit_for_review。这样就真正实现了一键提交App Store审核。至此,我们的一键打包审核流程完美收工。

注意点

笔者从开始研究fastlane到完全跑出来大概花了三天时间,期间遇到了很多问题,走了很多弯路,总结一下,希望对读者有一定帮助

  • fastlane的初始化命令是fastlane init,不需要加root权限,也就是sudo fastlane init是不需要的,如果使用了sudo会对后面的各个操作造成很大影响,比如项目文件(workspace后project文件)会锁定不能操作,还会引起打包失败

  • 很多刚接触fastlane的同学会一不注意就被fastlane上的各种命令整的晕头转向,例如sync_code_signing命令,其实是match命令的另外一种写法;build_app命令其实是gym的别名。因此大家在学习fastlane的时候只需要学习本文介绍的命令,大部分情况下已经够用。如果对一个命令的用法不熟悉,可以通过fastlane action查找,例如fastlane action match。

作者:光彩影

链接:https://www.jianshu.com/p/450379a5e185

查看原文: iOS使用fastlane一键打包审核

  • blackladybug
  • silverlion
  • goldenleopard
  • whitetiger