使用fastlane deliver 自动上传App Store Connect 物料和截图

 

背景

时光荏苒,今年发生了很多事情(省略2w字)。最终iOS商店页物料上传的工作,辗转最终准备交给开发团队来处理。

运营丢过来的物料有6个国家,10种语言,每个语言6~7张截图,各种主标副标变更,更新点文案,哇的一下就哭出来了。

程序员懒癌发作,经过大概30s的google搜索和10s的艰难决策,我最终选择了fastlane。

提交在即,让持续集成帮忙估计不现实,就自己开始搞了。(当然最终还是希望能够放在持续集成一起完成。)

fastlane

fastlane是为iOS和Android应用程序自动化测试部署和发布的最简单方法。????它处理所有繁琐的任务,如生成屏幕截图,处理代码签名以及发布应用程序。

 

 

 

使用fastlane deliver 自动上传App Store Connect 物料和截图

fastlane组件

fastlane是一套工具集,包括:

  • 测试
    • scan => 自动运行测试工具,并且可以生成漂亮的HTML报告
  • 证书,配置文件
    • cert => 自动创建管理iOS代码签名证书
    • sigh => 一声叹息啊,这么多年和Provisioning Profile战斗过无数次。总是有这样那样的问题导致配置文件过期或者失效。sigh是用来创建、更新、下载、修复Provisioning Profile的工具。
    • pem => 自动生成、更新推送配置文件
    • match => 一个新的证书和配置文件管理工具。我会另写一篇文章专门介绍这个工具。他会所有需要用到的证书传到git私有库上,任何需要配置的机器直接用match同步回来就不用管证书问题了,小团队福音啊!
  • 截图
    • snapshot => 用Xcode7推出的UI test功能实现自动化截图
    • frameit => 可以把截的图片自动套上一层外边框
  • 编译
    • shenzhen => 当年大名鼎鼎的自动编译工具,现在已经被弃用
    • gym => Fastlane家族的自动化编译工具,和其他工具配合的非常默契
  • 发布
    • produce => 如果你的产品还没在iTunes Connect(iTC)或者Apple Developer Center(ADC)建立,produce可以自动帮你完成这些工作
    • deliver => 自动上传截图,APP的元数据,二进制(ipa)文件到iTunes Connect
  • TestFlight管理
    • pilot => 管理TestFlight的测试用户,上传二进制文件
    • boarding => 建立一个添加测试用户界面,发给测试者,可自行添加邮件地址,并同步到iTC
  • 辅助工具
    • spaceship => 为pilot,boarding和deliver等工具提供和 iTC 和 ADC 的交互API。spaceship本来是个独立的项目,后来被Fastlane收编进来
    • WatchBuild => 是一个独立的iTC监控工具,开启WatchBuild可以监控iTC上的文件状态,弹出MacOS自带的Notification
  • Android
    • supply => 自动上传到Google Play工具(如果有时间,我想把国内提供API的Android Store都写个插件自动上传,这个问题从10年我刚开始工作就觉得是个痛点)
    • screengrab => Android的自动截图工具

fastlane中的概念

fastlane命令是一个流程控制的命令行工具(CLI),通过内部集成action和第三方的action完成一系列控制流程。运行fastlane命令行工具,会读取当前目录或者./fastlane目录下的Fastfile配置文件。

在Fastfile中:

  • action => Fastlane中的每一条命令都是一个扩展(action),上面提到的deliver,sigh之类的工具本身是CLI,但是在Fastlane中内嵌了对他们支持的action
  • lane => Fastlane中流程的合集,每一个动作即可以是action,也可以是其他的lane。语法和ruby中的rake非常像

一个简单的发布流程:

1

2

3

4

5

6

7

8

9

10

11

12

lane :deploy do

# 执行 pod instasll

cocoapods

# 执行 carthage bootstrap

carthage

# 增加build版本号

increment_build_number

# 编译代码

gym

# 发布到Apple Store

deliver(force: true)

end

总之,fastlane帮你统一定义、运行、自动化你的app发布流程,并且可以和其他第三方工具如CocoaPods等很好的结合,也可以和其他第三方持续集成(Continuous Integration)工具如Jenkins等完美的结合。

fastlane看起来就是为了持续部署(Continuous Deployment)而生。

Deliver

Deliver可以完全管理与iTC的交互。其中包括:

  • 上传和下载多语言截图
  • 上传和下载多语言元数据
  • 上传二进制文件

iTC中的所有的元数据信息都被保存在metadata中,所有的截图信息都被保存在screenshots中。

metadata:

  • 可以很容易的管理对应目录下的文件和iTC后台的表单项,在执行deliver时会自动被传到iTC。
  • 在metadata目录下的文件,如copyright.txt,是没有本地化的,在二层目录中的文件都是需要对应不同语言的表单项。
  • 如果你不想修改某些项的信息,直接把对应的文件删除即可。
  • 所有这些表单项也可以在Deliverfile中指定,Deliverfile中指定的项优先级比文件高

screenshots:

  • 如果不想更改截图,可以把整个截图目录删除
  • 如果不使用snapshot(自动化截图),也可以自己截图放到对应目录下,比一张一张上传iTC快的多。截图在iTC中的排列顺序就是本地文件名的「字母表顺序」(在目录中右击,按文件名排序)。deliver会识别图片分辨率,上传到对应设备中。

如果要通过deliver修改元数据或截图,你必须提供所有iTC后台中有的语言。比如后台中有「简体中文」和「英文」,你也必须提供对应的zh-Hans和en-US文件,否则deliver会报缺少语言的错误。可以在iTC后台提交的版本中删除语言。

目标

先看下iOS开发,打包和发布的流程:

  1. 开发前,需要登录苹果开发者后台创建App、Provisioning Profiles、certificates等;
  2. 使用Xcode开发,然后将上述相关文件和证书配置好;
  3. 编译项目并自测;
  4. Archive项目;
  5. 上传包到iTunes后台;
  6. 配置TestFlight,准备测试刚上传的版本;
  7. 发布测试版本;
  8. 测试发现问题,重回2;
  9. 测试完成,在iTunes后台提交版本截图、描述等信息;
  10. 提交App Store审核;

我们目标是9:提交截图和元数据信息。

接下来准备开始搞事了,整个步骤不是必须的,只是为了完整体验流程。

如果想快速集成,可以直接创建Appfile,Fastfile文件,Deliverfile文件,fastlane目录,添加配置即可。

系统环境要求:

Mac

Xcode

Gem

Ruby

安装

Xcode命令行工具,iOS开发略过

xcode-select --install

安装fastlane

# Using RubyGems

sudo gem install fastlane -NV

# Alternatively using Homebrew

brew cask install fastlane

初始化

切换到工程目录

执行 fastlane init

过程中会询问Apple ID账号和密码,如果有多个Team,会让你选择team。

据说密码因为是本地保存在keychina中,可以安心输入。

提问了你的Apple ID,Team的问题之后,fastlane会自动检测当前目录下项目的App Name和App Identifier。如果检测的不对,选择n自行输入。

因为账号权限问题,最终失败。不过这个是完成的produce流程,我们的目标是上传物料和截图,所以继续走deliver init。

其实这一步是可以不用执行的,只是为了自动创建对应的配置文件Appfile/Fastfile和fastlane目录而已,如果已经有配置,编辑正确后,是可以略过这一部分的。

拉取

首次拉取,执行 fastlane deliver init

二次拉取可以分别执行

下载截图 fastlane deliver download_screenshots

下载元数据 fastlane deliver download_metadata

 

在执行deliver init的过程中,会同步iTC中的所有语言的元数据和截图,并按照目录结构组织好。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

fastlane

├── Appfile

├── Deliverfile

├── Fastfile

├── metadata

│   ├── copyright.txt

│   ├── en-US

│   │   ├── description.txt

│   │   ├── keywords.txt

│   │   ├── marketing_url.txt

│   │   ├── name.txt

│   │   ├── privacy_url.txt

│   │   ├── release_notes.txt

│   │   └── support_url.txt

│   ├── primary_category.txt

│   ├── primary_first_sub_category.txt

│   ├── primary_second_sub_category.txt

│   ├── secondary_category.txt

│   ├── secondary_first_sub_category.txt

│   ├── secondary_second_sub_category.txt

│   └── zh-Hans

│   ├── description.txt

│   ├── keywords.txt

│   ├── marketing_url.txt

│   ├── name.txt

│   ├── privacy_url.txt

│   ├── release_notes.txt

│   └── support_url.txt

└── screenshots

├── README.txt

├── en-US

│   ├── 一堆图片

如果没有fastlane目录,生成的目录是./metadata 和 ./screenshots

上一步中创建了fastlane目录,拉取存放的路径是./fastlane/metadata 和 ./fastlane/screenshots

  • Fastfile => 用来定义所有的lane任务Fastfile帮助
  • Appfile => 是用来存储一些公共信息的,比如app_identifier,apple_id,team_id,itc_team_id等。Appfile帮助
  • Deliverfile => deliver的配置文件Deliverfile帮助

 

 

 

上传

本地手动更新完本次更新的文字和图片后,

执行 fastlane deliver 就可以完成上传,可能有一些具体的参数需要调整。

这个部分主要是上传元数据,截图,同时设置了自动释放和分阶段发布。

参数设置上是可以设置提交时的出口和IDFA的设置,所以应该是可以自动提交的,这里还没有进行调研。

另外截图上传并没有尝试视频的上传,这里可能需要注意。

 

Deliverfile 我这边进行了如下配置:

force(true) #跳过HTML报告文件验证

app_version("9.0.10") #应该编辑或创建的版本,不存在会自动创建

#skip_metadata(true) # 不要上传元数据(如标题、描述)。打开后,下面的automatic_release和phased_release等配置会无效

skip_screenshots(true) #不上传屏幕快照

skip_binary_upload(true) #跳过上传ipa或pkg到iTunes Connect

overwrite_screenshots(false) #在上传新截图之前,先清除所有之前上传的截图,个人觉得通常是打开,全新上传比较好。

run_precheck_before_submit(false) #在提交应用程序审核之前运行precheck

automatic_release(true) #一旦应用程序审核通过,该应用会自动发布App Store

phased_release(true) #启用iTC的分阶段发布功能

 

结语

整体的流程还是比较简单的的,拉取,修改,上传,实现了我们的目标。

还有其他很多功能和配置,还在学习和研究中,欢迎大家一起交流。

据我所知,其实持续集成已经有集成了部分fastlane的功能,包括match证书管理,gym打包,上传包等业务,这部分如果能够集成到整个持续集成中,持续集成可以完整的自动化整个iOS开发流程。

比如:这个上传部分,可以通过前端开发工具,生成自动的包格式,一键自动上传到iTC上。

Deliver常用配置

网上copy的,具体也可以通过执行fastlane action deliver查看

Key

Description

Default

username

Apple ID的用户名

*

app_identifier

应用程序的包标识符

*

app

你想要使用/修改的应用程序的ID

 

edit_live

修改实时元数据,此选项禁用ipa上传和截图上传

false

ipa

ipa文件路径

*

pkg

pkg文件路径

*

platform

使用的平台(optional)

ios

metadata_path

包含metadata文件夹的路径,metadata中保存的appstore中你应用的具体内容介绍(如标题、描述)

 

screenshots_path

包含屏幕快照文件夹的路径

 

skip_binary_upload

跳过上传ipa或pkg到iTunes Connect

false

use_live_version

使用实时版本而不是编辑版本

false

skip_screenshots

不上传屏幕快照

false

app_version

应该编辑或创建的版本

 

skip_metadata

不要上传元数据(如标题、描述)。这仍然会上传屏幕快照

false

skip_app_version_update

不要更新app提交的版本

false

force

跳过HTML报告文件验证。

false

submit_for_review

在上传所有内容后提交新版本进行审核

false

reject_if_possible

拒绝先前提交的处于所有可能的状态构建

false

automatic_release

一旦应用程序审核通过,该应用会自动发布App Store

false

auto_release_date

审核通过后自动发布App Store的以毫秒为单位的日期

 

phased_release

启用iTC的分阶段发布功能(不懂)

false

price_tier

应用程序的价格层级别

 

build_number

如果设置给定的构建号(已经上传到iTC)将被使用代替当前构建号

 

app_rating_config_path

应用程序配置的路径

 

submission_information

提交的额外资料(例如:第三方内容)

 

team_id

如果你在多个团队,你的iTunes Connect团队的ID

*

team_name

如果你在多个团队中,你的iTunes Connect团队的名字

*

dev_portal_team_id

如果您在多个团队中,您的开发人员门户团队的短ID。不同于您的iTC团队ID!

*

dev_portal_team_name

如果您在多个团队中,您的开发人员门户团队的名称

*

itc_provider

提供者的短名称,用iTMSTransporter标识您的团队。来获得提供者的短名称,去运行Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v。供应商的短名称应该列在第二列

 

overwrite_screenshots

在上传新截图之前,先清除所有之前上传的截图

false

run_precheck_before_submit

在提交应用程序审核之前运行precheck

true

precheck_default_rule_level

默认的规则级别,除非有其他配置

:warn

app_icon

Metadata(元数据):应用程序图标的路径。

 

apple_watch_app_icon

Metadata(元数据):苹果手表应用程序图标的路径。

 

copyright

Metadata(元数据):版权公告

 

primary_category

Metadata(元数据):主要类别的英文名称(如商业、书籍)

 

secondary_category

Metadata(元数据):次级类别的英文名称(如商业、书籍)

 

primary_first_sub_category

Metadata(元数据):主要的第一个子类别的英文名(如教育、字谜)

 

primary_second_sub_category

Metadata(元数据):主要的二级类别的英文名(如教育、字谜)

 

secondary_first_sub_category

Metadata(元数据): 次级类别第一个子类别的英文名称(如教育、字谜)

 

secondary_second_sub_category

Metadata(元数据):次级的第二子类别的英文名称(如教育、字谜)

 

trade_representative_contact_information

Metadata(元数据):包含商务代表的联系信息的hash(不懂)

 

app_review_information

Metadata(元数据):包含审核信息的hash

 

description

Metadata(元数据):应用程序描述

 

name

Metadata(元数据): 应用程序名字

 

subtitle

Metadata(元数据): 应用程序副标题

 

keywords

Metadata(元数据):一组关键字

 

promotional_text

Metadata(元数据): 一段促销文字

 

release_notes

Metadata(元数据): 本版本的版本说明

 

privacy_url

Metadata(元数据):隐私的url

 

support_url

Metadata(元数据): 支持的url

 

marketing_url

Metadata(元数据): 营销url

 

languages

Metadata(元数据):应用中使用的语言种类

 

ignore_language_directory_validation

Metadata(元数据): 应用程序名字

false

subtitle

Metadata(元数据): 应用程序副标题

true

* = 默认值依赖于用户的系统

参考

https://docs.fastlane.tools/actions/upload_to_app_store/

https://whlsxl.github.io/fastlane1/

https://lipan.me/2016/08/25/fastlane-ios-continuous-deployment-tool.html

https://juejin.im/post/5a7b10bb6fb9a0636263bfd5

相关文章:

  • 2022-12-23
  • 2022-02-03
  • 2021-12-24
  • 2021-07-15
  • 2022-12-23
  • 2022-12-23
  • 2021-09-13
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-21
  • 2022-12-23
相关资源
相似解决方案